2013-03-17 2 views
6
내가 다른 classes.The 생성자의 무리에 의해 상속됩니다 기본 데이터베이스 클래스가 난

PHP는 생성자 상속

을 데 문제를 명확히 할

은 다음과 같습니다 다음과 같은 아이들이 생성자에서 호출됩니다

public function __construct ($something) 
{ 
    parent::__construct("planets_games"); 
} 

내 문제가 나를 $ 뭔가 매개 변수없이 아이의 생성자을 허용하지 않는 PHP입니다이 난 다음 얻을 : 나는 내 기본적인 PHP 지식

감사에서 매우 중요한 뭔가를 놓치고 생각

$pg = new planetsGames('uselessStringHereThatHasNoUtilityAtAll'); 

:

Fatal error: Declaration of planetsGames::__construct() must be compatible with that of IScaffold::__construct() 

나는 현재이 같은 객체를 인스턴스화하여이를 무시하고 당신은 대단히 사전에 도움을 청합니다.

+0

예 PHP는 현재 하위 클래스의 구조 매개 변수는 부모의 그것과 호환되어야한다는 엄격한입니다. 그리고 당신이 얻지 못하는 것은 무엇입니까? 당신은 그런 식으로 할 수는 없지만 부모님과 자녀 모두에게 아무런 논쟁을 할 수는 없습니다. 아직 자녀의 구성에서만 부모에게 논증을 전달합니다. 이게 네가 원하는거야? –

답변

5

이 오류 메시지는 liskov substitution principle을 말합니다. 이것은 모든 IS-A 관계 (상속 (확장) 사용의 의미)에 적용되며 모든 하위 유형을 수퍼 유형으로 완전히 대체 할 수 있어야한다고 명시되어 있습니다.

그러나 이것은 생성자에 적용되지 않습니다! 어떤 PHP 버전을 사용하고 있습니까?

기본 클래스가 추상으로 생성자를 표시 한 것처럼 보입니다. 그게 유일한 방법입니다 이 오류가 나타날 수 있습니다.

생성자를 추상적, 최종 또는 인터페이스로 표시하지 마십시오!

대부분의 언어에서 가능하지 않습니다.

이 가장 좋은 사례가 각 콘크리트 피사체가 가장 는 소비자가 충분히 특정 객체를 생성하는 방법을 나타내는 서명 생성자를 가지고 있다는 점이다에서 당신이 빼앗아해야합니까. 상속이 관련된 경우에는 부모 생성자를 "빌려"사용하는 것이 유용하고 유용합니다. 또한 은 특정 유형을 서브 클래스화할 때 새로운 유형이 적절할 경우 을 새 하위 유형에 가장 적합한 고유 한 생성자로 만들어야한다고 권장했습니다.

http://ralphschindler.com/2012/03/09/php-constructor-best-practices-and-the-prototype-pattern

+0

늦게 답변을 드려 죄송합니다. 5.3.13 버전을 사용 중입니다. – user1840302

+0

다형성에 대해서만 이야기 할 때 LSP가 적합하지 않습니까? 저의 초기 생각은 같았지 만 그것은 일반적인 방법이 아니라 생성자입니다. 우리는 생성자와 계약을 맺지 않았습니까? – zerkms

+0

아니요,하지만 PHP에서는 생성자 추상을 표시 할 수 있습니다. 나는 슈퍼 클래스에서 생각한다 (IScaffold?) 위의 예에서이 경우입니다. 그렇지 않으면 치명적인 결과가 발생하지 않습니다. 생성자 추상화는 LSP에서 동일한 제약 조건을 발생시킵니다. 나는 이것이 위에서 말했듯이 나쁜 습관이라고 생각한다. –