2011-02-11 1 views
11

인터페이스를 사용하고 싶지만 일부 구현은 __invoke 및 __call과 같은 마법 메서드에 의존합니다. 인터페이스에서 모든 구현에서 마술처럼 호출 될 수있는 메서드의 시그니처를 제거해야합니다. 그래서 안티 패턴 빈 인터페이스로 연결됩니다 (예, 방금 만들었습니다).PHP에서 인터페이스 및 마법 메서드 사용 방법

PHP에서 인터페이스와 마법 방법을 어떻게 결합합니까?

+0

아마도 추상 클래스입니다. – BoltClock

+0

아마 내가 너를 오해 할 수도있다. ABase를 확장하고 IA를 구현하는 클래스 예제를 정의하려고했습니다. 인터페이스 메서드는 Base에서 abstract로 선언되고 Example에는 __call() 메서드 만 있습니다. PHP는 말합니다 : PHP 치명적인 오류 : 클래스 ABase 1 추상 메서드가 포함되어 있으므로 추상 선언해야합니다 또는 나머지 메서드를 구현하십시오 (ABase :: do_something) –

+0

글쎄, 기본 : 부모 (자료) 추상 메서드가 있습니다. 따라서 어떤 자식이라도 반드시이 메소드를 구현해야한다. 인터페이스에서도 마찬가지입니다. 따라서 Base가 IA를 구현하고 Base가 메서드의 구현을 추상으로 선언하면 모든 자식에서이 메서드를 구현해야합니다. 오류는 모두 그것을 말합니다 ^^ – usoban

답변

11

구현의 모든 인터페이스 메소드가 __call()으로 디스패치되었습니다. 그것은 많은 컷 앤드 페이스트 작업을 포함하지만 작동합니다.

interface Adder { 
    public function add($x, $y); 
} 

class Calculator implements Adder { 
    public function add($x, $y) { 
     return $this->__call(__FUNCTION__, func_get_args()); 
    } 

    public function __call($method, $args) { 
     ... 
    } 
} 

적어도 각 방법의 본문은 동일 할 수 있습니다. ;)

+1

이것은 나쁜 생각이 아닙니다! 보일러 플레이트는 문제가 될 경우 캐싱 코드 생성으로 해결할 수 있습니다. –

+1

add 함수의 작동 방식에 따라 return 문을 추가 할 수 있습니다. – SeanDowney

+0

@SeanDowney - 좋은 지적입니다. –