반응형
특성 함수를 재정의하고 재정의 된 함수에서 호출하는 방법은 무엇입니까?
대본:
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A;
function calc($v) {
$v++;
return A::calc($v);
}
}
print (new MyClass())->calc(2); // should print 4
이 코드는 작동하지 않으며 상속 된 것처럼 특성 함수를 호출하는 방법을 찾을 수 없습니다. 나는 호출 시도 self::calc($v)
, static::calc($v)
, parent::calc($v)
, A::calc($v)
다음과 같은 :
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as traitcalc;
}
function calc($v) {
$v++;
return traitcalc($v);
}
}
아무것도 작동하지 않습니다.
작동시키는 방법이 있습니까? 아니면 이보다 훨씬 복잡한 특성 기능을 완전히 재정의해야합니다. :)
당신의 마지막 것은 거의 그곳에있었습니다 :
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
use A {
calc as protected traitcalc;
}
function calc($v) {
$v++;
return $this->traitcalc($v);
}
}
특성은 클래스가 아닙니다. 회원에게 직접 액세스 할 수 없습니다. 기본적으로 자동 복사 및 붙여 넣기입니다.
클래스가 메소드를 직접 구현하면 특성 버전을 사용하지 않습니다. 아마도 당신이 생각하는 것은 :
trait A {
function calc($v) {
return $v+1;
}
}
class MyClass {
function calc($v) {
return $v+2;
}
}
class MyChildClass extends MyClass{
}
class MyTraitChildClass extends MyClass{
use A;
}
print (new MyChildClass())->calc(2); // will print 4
print (new MyTraitChildClass())->calc(2); // will print 3
자식 클래스는 메서드를 직접 구현하지 않기 때문에 부모 클래스의 메서드를 사용하는 경우 먼저 특성의 메서드를 사용합니다.
원하는 경우 특성은 상위 클래스에서 메소드를 사용할 수 있습니다 (메소드가 있음을 가정 한 경우).
trait A {
function calc($v) {
return parent::calc($v*3);
}
}
// .... other code from above
print (new MyTraitChildClass())->calc(2); // will print 8 (2*3 + 2)
재정의하는 방법을 제공 할 수 있지만 다음과 같이 특성 방법에 계속 액세스 할 수 있습니다.
trait A {
function trait_calc($v) {
return $v*3;
}
}
class MyClass {
function calc($v) {
return $v+2;
}
}
class MyTraitChildClass extends MyClass{
use A {
A::trait_calc as calc;
}
}
class MySecondTraitChildClass extends MyClass{
use A {
A::trait_calc as calc;
}
public function calc($v) {
return $this->trait_calc($v)+.5;
}
}
print (new MyTraitChildClass())->calc(2); // will print 6
echo "\n";
print (new MySecondTraitChildClass())->calc(2); // will print 6.5
http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5 에서 작동하는 것을 볼 수 있습니다 .
일반적인 OOO 방식을 사용하기위한 추가 중급 클래스를 사용하는 경우 관심있는 대체 방법입니다. 이것은 parent :: methodname으로 사용법을 단순화합니다.
trait A {
function calc($v) {
return $v+1;
}
}
// an intermediate class that just uses the trait
class IntClass {
use A;
}
// an extended class from IntClass
class MyClass extends IntClass {
function calc($v) {
$v++;
return parent::calc($v);
}
}
다른 특성 사용하기 :
trait ATrait {
function calc($v) {
return $v+1;
}
}
class A {
use ATrait;
}
trait BTrait {
function calc($v) {
$v++;
return parent::calc($v);
}
}
class B extends A {
use BTrait;
}
print (new B())->calc(2); // should print 4
반응형
'Programming' 카테고리의 다른 글
IEnumerable 또는 List가 아닌 ICollection을 사용하는 이유 (0) | 2020.03.03 |
---|---|
두 필드를 "고유 한"커플로 정의하는 방법 (0) | 2020.03.03 |
복잡한 Git 브랜치 이름으로 모든 Git 명령이 중단됨 (0) | 2020.03.03 |
이진 파일 읽기 및 각 바이트 반복 (0) | 2020.03.03 |
파이썬에서 .mat 파일 읽기 (0) | 2020.03.03 |