[php] 특성 함수를 재정의하고 재정의 된 함수에서 호출하는 방법?


1 Answers

클래스가 메서드를 직접 구현하면 특성 버전이 사용되지 않습니다. 아마도 당신이 생각하는 것은 :

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 메소드에 계속 액세스 할 수 있습니다.

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 에서 작동하는지 확인할 수 있습니다 http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5

Question

대본:

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

이 코드는 작동하지 않으며 상속 된 것과 같은 trait 함수를 호출하는 방법을 찾을 수 없습니다. 나는 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 함수를 완전히 오버라이드해야만 하는가?




다른 특성 사용 :

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


Related



Tags

php php   traits