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 $callback
is_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.
'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
@DrMcKay tu respuesta me ayudó mucho, muchas gracias – Marecky