2014-08-29 3 views
0

나는 한 다음 코드 그래서재정의 인터페이스 방법 PHP

class Model_MyAbstractClass { 
} 

class Model_MyClass extends Model_MyAbstractClass { 

} 
interface doStuff { 

    function update(Model_MyAbstractClass $model); 

} 
class Mapper_MyClass implements doStuff{ 
    function update(Model_MyClass $model){ 
     } 
} 

왜하지 않습니다 PHP에서이 작품? Model_MyClass는 여전히 Model_MyAbstractClass입니다. 나는 유사한 방법으로 5 개의 클래스를 가지고있다. 모든 차이점은 각 매퍼가 일부 모델을 가지고 있으며, 모두 모델 _MyAbstractClass를 확장한다는 것입니다.
실제로이 작업을 수행 할 방법이 없다면 남은 유일한 해결책은 다음과 같습니다. 매개 변수가 유일한 차이 (모두 DRY가 아님)와 함께 각 인터페이스를 만듭니다.
Model_MyAbstractClass가 필요한 Model_MyClass의 인스턴스이고 오류가 발생하면 각 함수를 체크인하십시오. 필요한 매개 변수 유형을 명시 적으로 요구해야하므로 바보 같은 전략 인 것 같습니다.

답변

1

정상적으로 작동하지 않습니다.

사용자 인터페이스를 사용하면 어떤Model_MyAbstractClass이 함수에 전달할 수 있다는 가정하자 : 여기

function update(Model_MyAbstractClass $model); 

, 예상 Model_MyClass :

class Mapper_MyClass implements doStuff{ 
    function update(Model_MyClass $model){  
    } 
} 

물론, Model_MyClass가 인 Model_MyAbstractClass의 인스턴스 그러나 인터페이스는 Model_SomeOtherClassModel_MyAbstractClass에서 확장 된 클래스를 전달할 수 있다고 가정합니다.

요약 : 당신은 처리 할 수 ​​있어야합니다 모든Model_MyAbstractClass뿐만 아니라Model_MyClass


당신이 가능해야합니다

class Mapper_MyClass implements doStuff 
{ 
    function update(Model_MyAbstractClass $model) 
    { 
     //Do stuff on Model_MyAbstractClass 

     //... 

     if ($model instanceof Model_MyClass) { 
      //Do additional stuff on Model_MyClass 

      //... 
     } 
    } 
} 

은 아마 당신 같은 문제로 실행 내게는 C#을 통해 쉽게 해결할 수 있습니다. d Java. 나를 위해, 나는 Generic 기초 수업을 원했다. 이 같은 일이 일반 PHP,하지만 Facebook's Hack made it possible 가능 현재없는

abstract class Foo<T> { 
    function update(T $model) 
} 

class Bar extends Foo<Model_MyClass> { 
} 

. 문제는, 이것은 나를위한 선택 사항이 아니라 어쩌면 당신을위한 것입니다. 위에서 설명한대로 instanceof을 사용하는 방법으로이 작업을 수행했습니다.

0

문제는 PHP와 관련이 없지만 OOP 개념에서 인터페이스가 어떻게 작동하는지 오해하고 있습니다. 코드에서

는, 인터페이스 doStuff는, 그것의 매개 변수로 Model_MyAbstractClass을 취하는 방법이있는 매개 변수의 인스턴스가 항상 Model_MyAbstractClass으로 표시되며, 주어진 인스턴스처럼, Model_MyAbstractClass의 인스턴스의 경우는 다른 아무것도하지는 중요하지 않습니다 의미 너의 본보기.자바와 같은 OOP 언어에서

, 당신은 다음과 같은 오류가 발생합니다 : PHP에서 당신이 instanceof 검사를 수행 할 수

The method update(Model_MyAbstractClass) of type Mapper_MyClass must override or implement a supertype method 

그러나, 및 OOP 언어로 할 수 있습니다 castModel_MyClass