PHP 5.3을 사용합니다. 클로저가 도입되었습니다. 이제는 내 응용 프로그램 (및 프레임 워크)에서 사용할 수있는 클로저가 있으므로 is_callable을 사용하여 어떤 종류의 핸들러인지 알 수 있습니다. $callback
입니다.__call과 함께 is_callable을 사용하는 방법은 무엇입니까?
$callback
is_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을했다하지만 난 꽤 비싼 것 같아요.
'get_class_methods'는 다른 문제를 해결했지만 실제로는 믹스 인이 아닙니다. 이 매우 중요한 부분은 실제로 사실이 아닙니다. "클래스에'__call' 메서드가 포함되어 있다면 호출자는 자신이하는 일을 알고있을 것입니다." 왜냐하면 네 개의 클래스 만 가지고있는 (그리고 사용하는) 10 개의 클래스에 대한 렌더러를 설정할 수 있고, 나머지 6 개는 표준을 사용할 것이기 때문에 렌더러를 한번 설정해야하기 때문입니다. (와우, 당신은 그것을 얻었습니까?) – Rudie
@DrMcKay 대답이 나를 도왔습니다. 대단히 감사합니다. – Marecky