2011-05-09 3 views
10

PHP 5.3을 사용합니다. 클로저가 도입되었습니다. 이제는 내 응용 프로그램 (및 프레임 워크)에서 사용할 수있는 클로저가 있으므로 is_callable을 사용하여 어떤 종류의 핸들러인지 알 수 있습니다. $callback입니다.__call과 함께 is_callable을 사용하는 방법은 무엇입니까?

$callbackis_callable이라면 충분히 알고 그 기능/방법/폐쇄를 사용하십시오. 호출 할 수없고 문자열 인 경우 $this 클래스의 메서드 이름 일 가능성이 큽니다. 그것은 존재할 수도 있고 그렇지 않을 수도 있습니다. 내가 PHP에 맡기면 좋은 치명적 오류를 던질 것이다.

하지만 mix-ins을 사용하고 싶습니다. 즉, 마법 방법 __call이 필요합니다. __call은 실제 함수 호출 전에 논리를 포함 할 수 있기 때문에 매우 멋지다. BUT ... __call 이후에 호출 된 메소드가 존재하지 않으면 어떻게됩니까? 나는 예외를 던질 수는 있지만, 그 이후까지는 알 수 없을 것이다. 실행 후 __call모든가 true를 반환하기 때문에 모든 (__call 인) 대체이 있기 때문에

문제는, 지금 is_callable의 유용성이다.

둘 다 가질 수있는 방법이 있습니까 : 동적 방법과 유용 is_callable?

제가보고 싶은 것은 캐치 가능한 마법 방법 __is_callable입니다. is_callable(array($object, $method))을 호출하면 PHP가 '문의합니다'.

php.net에서 나는 이것에 관해서 낙담 한 사람을 찾을 수 없습니다. 이럴 수는 없어! __call을 사용하는 경우 더 이상 is_callable을 사용할 수 없습니다!

나는 어떤 의미가 있습니까?

추신. 나는 method_exists을 살펴 봤지만, 모든 클로저와 전역 함수를 걸러 낼 수 있다고해도 충분하지는 않습니다. 왜냐하면 민간 및 보호 된 방법은 물론 공개를 반환하기 때문입니다.

편집 나는 a 'better' is_callable that checks for mix-ins을했다하지만 난 꽤 비싼 것 같아요.

답변

4

첫 번째 아이디어 : 방법이 있는지 확인하는 방법은 get_class_methods()에 있습니까? 이 함수는 범위 문제를 처리합니다.

두 번째 아이디어 : 찾고있는 함수가 클래스에 존재하지 않는다면 클래스에 __call 마법 메서드가 포함되어 있는지 (method_exists 사용) 확인할 수 있습니다. 분명히 존재하지 않는 함수를 호출하지 않은 것입니다 기능이 불법입니다. 클래스에 __call 메소드가 포함되어 있으면 호출자가 자신이하는 일을 알고있을 가능성이 큽니다.

이것은 단지 내 생각 일 뿐이므로 파이썬이 이런 종류의 일을 더 잘한다고 가정합니다.

+0

'get_class_methods'는 다른 문제를 해결했지만 실제로는 믹스 인이 아닙니다. 이 매우 중요한 부분은 실제로 사실이 아닙니다. "클래스에'__call' 메서드가 포함되어 있다면 호출자는 자신이하는 일을 알고있을 것입니다." 왜냐하면 네 개의 클래스 만 가지고있는 (그리고 사용하는) 10 개의 클래스에 대한 렌더러를 설정할 수 있고, 나머지 6 개는 표준을 사용할 것이기 때문에 렌더러를 한번 설정해야하기 때문입니다. (와우, 당신은 그것을 얻었습니까?) – Rudie

+0

@DrMcKay 대답이 나를 도왔습니다. 대단히 감사합니다. – Marecky