Pregunta

Esta es la premisa:

Tengo muchas clases en las que necesito para llevar a cabo una acción ante cualquier método de cualquiera de las clases que se llama, mi solución era tener todas las clases se extienden de una clase principal que definiría una función de llamada (), que se vería :

public function call($method){
    //do the something I need to do before method calls
    $params = func_get_args();
    //remove the $method param from the $params array
    unset($params[0]);
    return $this->__call($method,$params);
}

Y a continuación, sólo tiene que llamar al método de llamadas y especificar el método actual que quería llamar, de esa manera el método sería llamará, pero dentro de la llamada al método (que los hereda de la clase de mi clase padre) que pudiera llevar a cabo la acción que necesarios para llevar a cabo antes de que el método especificado se llama.

Esto tiene que ser capaz de soportar los argumentos que podrían ser matrices o cadenas, por lo que todo lo que implica la implosión de una serie de argumentos no trabajo (ya que esto asume todos los argumentos son cadenas).

No estoy seguro de si lo que tengo arriba tiene sentido, y quería comprobar y ver si voy de este por el camino equivocado o no.

Todas las ideas / pensamientos sería muy apreciada.

Gracias!

PD: Debo señalar que mi descripción de la situación anterior hace que suene como la razón de las clases hijas se extienden los padres es simplemente para este fin, en realidad hay más razones (mi clase padre se extiende Zend_Db_Table_Abstract y mis modelos de bases de datos se extienden el padre).

¿Fue útil?

Solución

__call es llamado automáticamente, si está definido, cada vez que intente llamar a una función que no existe. Es por eso que es un método "mágica". Parece extraño que lo use directamente, en lugar de en el contexto para el que está destinado. En este caso, puede ser que también se ha llamado nada.

podría sin duda usar el poder de __call a su ventaja aquí. Intenta nombrar todas las funciones miembro con un guión bajo delante de ellos. Por lo tanto, si antes tenías $this->print() que ahora tendría $this->_print(). Luego, en su función de __call, añadir el guión bajo y llamar a la función utilizando call_user_func_array(array($this,"_$name"), $params). Ahora puede llamar a sus funciones normalmente (bueno, sin éste).

Sin embargo, yo no sugerir el uso de __call excepto para su conveniencia. A largo plazo lo mejor es simplemente llamar a cualquier código que desea ejecutar directamente.

Otros consejos

alternativa

Será mejor / más limpio podría ser la configuración de un sistema de escucha de eventos y, al igual que el Doctrina eventos del sistema . (Este código es en realidad de la biblioteca común, no la parte ORM). Pero tendrá todos sus métodos para despachar los eventos.

Trato de evitar el uso de un __call tanto como sea posible, ya que hace que su código sea más difícil de entender y mantener, aunque yo creo que está bien para su uso en sistemas de plugin.

Gracias por las sugerencias, que era una especie de ladrando al árbol equivocado, pero aquí es la solución que se me ocurrió:

public function call($method){
    //do the something I need to do before method calls
    $params = func_get_args();
    //remove the $method param from the $params array
    unset($params[0]);
    return call_user_func_array(array($this,$method),$params);
}

Gracias chicos!

puede obtener los parámetros del método directamente de los parámetros __call:

function __call($method, $args) {
    return call_user_func_array(array($this,$method),$args);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top