특성 함수를 재정의하고 재정의된 함수에서 호출하려면 어떻게 해야 합니까?
시나리오:
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 방식을 사용할 수 있는 중급 클래스를 추가로 사용합니다.이것에 의해, 부모: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
또 다른 변형:특성에서 실제 작업을 수행하는 보호된 기능과 보호되는 기능을 차례로 호출하는 공용 기능을 정의합니다.
이렇게 하면 보호된 함수를 내부적으로 호출할 수 있으므로 함수를 재정의하려는 경우 클래스가 'use' 문을 조작하지 않아도 됩니다.
trait A {
protected function traitcalc($v) {
return $v+1;
}
function calc($v) {
return $this->traitcalc($v);
}
}
class MyClass {
use A;
function calc($v) {
$v++;
return $this->traitcalc($v);
}
}
class MyOtherClass {
use A;
}
print (new MyClass())->calc(2); // will print 4
print (new MyOtherClass())->calc(2); // will print 3
이것은 기본적으로 하크이지만, 특성이 패키지가 아닌 코드의 일부일 경우 현재 함수가 아닌 다른 함수가 있는지 확인하고 반환하는 기능을 가질 수 있습니다.
trait A {
function calc($v) {
if(method_exists($this, 'calcClass'))
{
$this->calcClass($v)
}
return $v+1;
}
}
class MyClass {
use A;
function calcClass($v) {
return $v+2;;
}
}
print (new MyClass())->calc(2); // prints 4
이게 도움이 됐으면 좋겠어요.
언급URL : https://stackoverflow.com/questions/11939166/how-to-override-trait-function-and-call-it-from-the-overridden-function
'itsource' 카테고리의 다른 글
Image Magick 설치 확인 (0) | 2022.12.04 |
---|---|
JSON Jackson에 대한 날짜 형식 매핑 (0) | 2022.12.04 |
유닛 테스트를 PHP로 작성하려면 어떻게 해야 하나요? (0) | 2022.12.04 |
검색되지 않은(약속되지 않은) 탐색 잘못된 자격 증명에서 중복된 오류 발생 (0) | 2022.12.04 |
JSP : JSTL 태그 (0) | 2022.11.26 |