2011-05-09 10 views
10

Uso PHP 5.3, que presenta cierres. Debido a que ahora tengo cierres disponibles en toda mi aplicación (y framework), uso is_callable para ver qué tipo de controlador es $callback.¿Cómo se usa is_callable con __call?

Si $callbackis_callable, sé lo suficiente y uso esa función/método/cierre. Si no se puede llamar y es una cadena, probablemente sea el nombre de un método en la clase $this. Puede existir y puede que no. Si lo dejo en PHP, arrojará un buen error fatal (me gustan).

Pero quiero usar mix-ins lo que significa que necesito el método mágico __call. __call es muy bueno, porque (puede) contener (n) la lógica antes de la llamada a la función real. PERO ... ¿Qué ocurre si después del __call el método llamado no existe? Puedo lanzar una excepción, claro, pero no sabremos hasta después.

El problema ahora es la utilidad de is_callable, porque después de la aplicación de __call, todo volverá verdad, porque todo tiene un repliegue (siendo __call).

¿Hay alguna manera de tener ambos: métodos dinámicos y útil is_callable?

Lo que me gustaría ver es algún tipo de método mágico encapsulable __is_callable que PHP 'consultará' cuando se llame is_callable(array($object, $method)).

En php.net, no puedo encontrar a nadie que esté tan convencido de esto como yo. ¡Esto no puede ser! Si usa __call, ¡ya no puede usar is_callable !?

¿Tengo algún sentido?

PS. He examinado method_exists, pero eso no es lo suficientemente bueno (incluso si puedo filtrar todos los cierres y funciones globales) porque devolverá true para los métodos privados y protegidos, así como para los públicos.

edición
hice a 'better' is_callable that checks for mix-ins pero yo creo que es bastante caro.

Respuesta

4

Primera idea: ¿qué hay de comprobar si el método existe en get_class_methods()? Esta función se encarga de los problemas de alcance.

Segunda idea: si la función que estás buscando no existe en una clase, también puedes verificar (usando method_exists) si la clase contiene __call método mágico, si no es que obviamente llama a una inexistente la función es ilegal. Si la clase contiene el método __call, es probable que la persona que llama sepa lo que está haciendo.

Estos son solo mis pensamientos, supongo que Python es mejor en este tipo de cosas.

+0

'get_class_methods' resolvió otro problema, pero no realmente las mezclas. Esta parte muy importante no es realmente cierta: "Si la clase contiene el método' __call', es probable que la persona que llama sepa lo que está haciendo ". porque puede establecer un representador para 10 clases que solo tienen 4 (y usan) y las otras 6 usarán el estándar, pero solo tiene que configurarlo una vez. (Wow, ¿lo entendiste?) – Rudie

+0

@DrMcKay tu respuesta me ayudó mucho, muchas gracias – Marecky