2011-07-21 18 views
5

Si se realiza una llamada a un método definido en una clase, el método mágico __call puede interceptar la llamada, por lo que podía manejar la situación como me parezca: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods¿Existe una función como el método mágico __call() para alcance global en php?

¿Hay algún mecanismo previsto en php por lo que me puede hacer lo mismo con funciones en alcance global. El punto se ilustra mejor con código:

<?php 
    function return_some_array(){ 
     $a = array(); 
     //Do stuff to array 
     return array(); 
    } 

    // Now i call the function like so: 
    $give_me_array = return_some_array(); 

    // But sometimes I want the array to not contain zeroes, nulls etc. 
    // so I call: 
    $give_me_array_filtered = return_some_array_filtered(); 

    // But i haven't defined return_some_array_filtered() anywhere. 
    // Instead I would like to do something like so: 
    function __magic_call($function_name_passed_automatically){ 
     preg_match('/(.*)_filtered$/', $function_name_passed_automatically, $matches); 
     $function_name_that_i_defined_earlier_called_return_some_array = $matches[1]; 
     if($matches){ 
     $result = call_user_func($function_name_that_i_defined_earlier_called_return_some_array); 
     $filtered = array_filter($result); 
     return $filtered; 
     } 
    } 

    //So now, I could call return_some_other_array_filtered() and it would work provided I had defined return_some_other_array(). 
    //Or even Donkey_filtered() would work, provided I had defined Donkey() somewhere. 
    ?> 

¿Este es posible?

Respuesta

1

No como tal.

Si hubiera hecho un método estático como return_some_array_filtered :: go(), entonces podría usar la instalación autoload() de PHP5 para crear dinámicamente la clase y el método. Después de la creación, la llamada continúa como de costumbre. Es posible que desee implementar callStatic() en esa clase. Cuidado con la creación dinámica de una clase desde cero (sin include()) en PHP no es trivial.

+0

Gracias! Creo que lo probaré. –

+0

@ V-A Es, por supuesto, una manera bastante inútil y innecesariamente hackosa de hacer las cosas. Debe definir y llamar a sus funciones de forma normal. – deceze

+0

En otra nota: ¿crees que esto se puede implementar como una extensión? Me imagino que sería bastante simple? –

Cuestiones relacionadas