Domanda

Ecco la premessa:

Ho molte classi in cui ho bisogno per eseguire un'azione PRIMA qualsiasi metodo di qualsiasi delle classi è chiamato, la mia soluzione era di avere tutte le classi di estendere una classe genitore che definire una funzione di chiamata (), che assomiglierebbe :

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);
}

E poi semplicemente chiamare il metodo di chiamata e specificare il metodo effettivo Volevo chiamare, in questo modo il metodo sarebbe ottenere chiamato, ma dentro la chiamata di metodo (che le eredita classe dalla mia classe genitore) ho potuto svolgere l'azione I necessarie per svolgere prima che il metodo specificato viene chiamato.

questo deve essere in grado di supportare gli argomenti che potrebbero essere le matrici o stringhe, in modo tutto ciò che comporta implodere una matrice di argomenti non funzionerà (in quanto questo avrebbe assunto tutti gli argomenti sono stringhe).

Non so se quello che ho rende sopra un senso, e ho voluto controllare e vedere se sto andando su questo nel modo sbagliato o no.

Tutte le idee / pensieri sarebbe molto apprezzato.

Grazie!

PS: Vorrei sottolineare che la mia descrizione della situazione di cui sopra fa sembrare come la ragione per le classi figlie estendono il genitore è solo per questo scopo, in realtà ci sono più motivi (la mia classe genitore estende Zend_Db_Table_Abstract ed i miei modelli di database si estendono il genitore).

È stato utile?

Soluzione

__call viene chiamato automaticamente, se è definito, ogni volta che si tenta di chiamare una funzione che non esiste. Ecco perché si tratta di un metodo di "magia". Sembra strano per me di utilizzare direttamente, piuttosto che nel contesto per cui è destinato. Qui, si potrebbe anche avere la chiamò nulla.

potrebbero sicuramente utilizzare il potere della __call a vostro vantaggio qui. Provare a nominare tutte le funzioni membro con un underscore prima di loro. Quindi, se prima era $this->print() si dovrebbe ora avere $this->_print(). Poi, nella funzione __call, aggiungere la sottolineatura e chiamare la funzione tramite call_user_func_array(array($this,"_$name"), $params). Ora è possibile chiamare le funzioni normalmente (bene, senza il carattere di sottolineatura).

Ancora, non vorrei suggerire utilizzando __call se non come una comodità. A lungo termine è meglio chiamare un qualsiasi codice che si desidera eseguire direttamente.

Altri suggerimenti

alternativa

I meglio / più pulito potrebbe essere quella di impostare un evento e il sistema di ascolto, come il Dottrina Eventi sistema . (Questo codice è in realtà dalla libreria comune, non la parte ORM). Ma avete bisogno di tutti i vostri metodi di inviare gli eventi.

cerco un evitano il ricorso ad __call il più possibile, perché rende il codice più difficile da capire e mantenere, anche se penso che sia bene per l'impiego in sistemi di plugin.

Grazie per i suggerimenti, ero una specie di abbaiare contro l'albero sbagliato, ma ecco la soluzione mi è venuta:

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);
}

Grazie ancora ragazzi!

è possibile ottenere i parametri del metodo direttamente dai parametri __call:

function __call($method, $args) {
    return call_user_func_array(array($this,$method),$args);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top