인터페이스를 사용하고 싶지만 일부 구현은 __invoke 및 __call과 같은 마법 메서드에 의존합니다. 인터페이스에서 모든 구현에서 마술처럼 호출 될 수있는 메서드의 시그니처를 제거해야합니다. 그래서 안티 패턴 빈 인터페이스로 연결됩니다 (예, 방금 만들었습니다).PHP에서 인터페이스 및 마법 메서드 사용 방법
PHP에서 인터페이스와 마법 방법을 어떻게 결합합니까?
인터페이스를 사용하고 싶지만 일부 구현은 __invoke 및 __call과 같은 마법 메서드에 의존합니다. 인터페이스에서 모든 구현에서 마술처럼 호출 될 수있는 메서드의 시그니처를 제거해야합니다. 그래서 안티 패턴 빈 인터페이스로 연결됩니다 (예, 방금 만들었습니다).PHP에서 인터페이스 및 마법 메서드 사용 방법
PHP에서 인터페이스와 마법 방법을 어떻게 결합합니까?
구현의 모든 인터페이스 메소드가 __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) {
...
}
}
적어도 각 방법의 본문은 동일 할 수 있습니다. ;)
이것은 나쁜 생각이 아닙니다! 보일러 플레이트는 문제가 될 경우 캐싱 코드 생성으로 해결할 수 있습니다. –
add 함수의 작동 방식에 따라 return 문을 추가 할 수 있습니다. – SeanDowney
@SeanDowney - 좋은 지적입니다. –
아마도 추상 클래스입니다. – BoltClock
아마 내가 너를 오해 할 수도있다. ABase를 확장하고 IA를 구현하는 클래스 예제를 정의하려고했습니다. 인터페이스 메서드는 Base에서 abstract로 선언되고 Example에는 __call() 메서드 만 있습니다. PHP는 말합니다 : PHP 치명적인 오류 : 클래스 ABase 1 추상 메서드가 포함되어 있으므로 추상 선언해야합니다 또는 나머지 메서드를 구현하십시오 (ABase :: do_something) –
글쎄, 기본 : 부모 (자료) 추상 메서드가 있습니다. 따라서 어떤 자식이라도 반드시이 메소드를 구현해야한다. 인터페이스에서도 마찬가지입니다. 따라서 Base가 IA를 구현하고 Base가 메서드의 구현을 추상으로 선언하면 모든 자식에서이 메서드를 구현해야합니다. 오류는 모두 그것을 말합니다 ^^ – usoban