2013-08-27 2 views
5

PHP 5.4.9에서 다음 예제는 치명적인 오류를 발생시킵니다 "B가 형질에서 오는 충돌 생성자 정의를 가지고 있습니다".특성의 생성자 정의가 어떻게 충돌 할 수 있습니까?

trait T { 
    public function __construct() { 
     echo __CLASS__ . ": constructor called.\n"; 
    } 
} 

class A { 
    use T; 
} 

class B extends A { 
    use T; 
} 

가 형질이 생성자는 다른 방법이 포함 된 경우 아무 문제없고, 생성자가 실제로 (특성은 "언어를 이용한 복사 & 붙여 넣기"기능을 사용하지 않고) 클래스로 복사 문제.

여기 생성자에 대한 특별한 점은 무엇입니까? PHP가 그 중 하나가 다른 것을 재정의한다는 것을 알아낼 수 있어야합니까? 이 제한에 대해 아무 것도 찾을 수 없었습니다 in the manual.

This related question에는 특성 메서드의 별칭을 사용하여 문제를 해결할 수있는 방법이 언급되어 있지만 처음부터 그 원인을 파악하는 방법은 없습니다. 다음 코드를 사용하여 발생하는 시도

답변

3

: 당신이 특징 T를 사용해야하는 경우이 때문에

class A { 
    use T; 
    use T; 
} 

은 효과적으로 B.

다시 A로부터 확장 한 후 T를 사용하여 쓴 것입니다 기본 및 하위 클래스는 기본 클래스에서만 사용하십시오.

하위 클래스에서만 필요하면 리프 하위 클래스에서만 사용하십시오.

+0

이 경우 다른 오류 메시지가 나타납니다. * "특성 메서드 __construct가 적용되지 않았습니다. A"*의 다른 특성 메서드와의 충돌이 있기 때문입니다. 또한 가져온 메소드가 생성자인지 여부도 차이가 없습니다. 질문의 예제는 다른 메소드와 잘 작동하며, 생성자 만 다르게 동작합니다. – Zilk

+0

@hakre하지만 다른 방법이 잘 작동하는 이유는 무엇인지 설명하지 않습니다. 그거야? – SteAp

+0

@Zilk : * extends * 단계가 없기 때문에 오류의 이름이 다르게 표시되지만 두 오류 모두 충돌에 대해 알려줍니다. * 다른 * 메소드의 경우 다른 * magic * 메소드를 사용해보십시오. 네가 별명을 붙일 수 없기 때문에 그것들에 약간의 차이가 있다고 상상할 수있다. 그들은 변경할 수없는 그들의 이름에 달려 있습니다. 따라서 별명이 없으므로 충돌이 없어지므로 충돌 만 있습니다. – hakre

관련 문제