Frage

Hier ist die Prämisse:

ich viele Klassen haben, wo ich eine Klage vor einem beliebigen Verfahren aus einem der Klassen auszuführen genannt wird, war meine Lösung alle Klassen haben eine Elternklasse erweitern, die eine Funktion call () definieren würde, die aussehen würde, :

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

Und dann einfach den Anruf-Methode aufrufen und die aktuelle Methode angeben ich anrufen wollte, auf diese Weise die Methode aufgerufen würde, aber innerhalb der Call-Methode (die die Klasse erbt von meinem Elternklasse) ich die Aktion, die ich durchführen könnte erforderlich auszuführen, bevor die angegebene Methode aufgerufen wird.

Dies muss in der Lage sein Argumente zu unterstützen, die Arrays oder Strings sein könnte, also alles, was eine Reihe von Argumenten beinhaltet implodieren wird die Arbeit nicht (da dies würde davon ausgehen, alle Argumente Strings).

Ich bin nicht sicher, ob das, was ich oben habe, macht Sinn, und ich wollte überprüfen und sehen, ob ich das über den falschen Weg gehe oder nicht.

Irgendwelche Ideen / Gedanken würde sehr geschätzt werden.

Danke!

PS: Ich sollte anmerken, dass meine Beschreibung der Situation oben macht klingen sie wie dem Grund, das Kind Klassen erweitern die Eltern ist einfach zu diesem Zweck, in Wirklichkeit gibt es mehr Gründe (meine Eltern-Klasse erweitert Zend_Db_Table_Abstract und meine Datenbankmodelle erweitern die Eltern).

War es hilfreich?

Lösung

__call wird automatisch aufgerufen, wenn es definiert ist, wenn Sie versuchen, eine Funktion aufzurufen, die nicht existiert. Deshalb ist es eine „magische“ Methode ist. Es scheint seltsam, für mich ist es direkt zu verwenden, anstatt im Rahmen, für die es bestimmt ist. Hier könnten Sie auch benannt haben sie nichts.

Sie könnte auf jeden Fall die Macht der __call hier zu Ihrem Vorteil nutzen. Versuchen Sie, alle Member-Funktionen mit einem Unterstrich, bevor sie zu benennen. Also, wenn Sie vor $this->print() haben würden Sie jetzt $this->_print() haben. Dann in Ihrer __call Funktion, fügen Sie den Unterstrich und rufen Sie die Funktion call_user_func_array(array($this,"_$name"), $params) verwenden. Jetzt können Sie Ihre Funktionen normalerweise nennen (na ja, ohne Unterstrich).

Dennoch würde ich vorschlagen, nicht __call mit der Ausnahme, als Bequemlichkeit. Langzeit ist es am besten, nur einen Code aufrufen, dass Sie direkt ausgeführt werden soll.

Andere Tipps

ich besser / sauberere Alternative könnte ein Ereignis und Zuhören System eingerichtet werden, wie die Lehre Events-System . (Dieser Code ist eigentlich aus der gemeinsamen Bibliothek, nicht der ORM Teil.) Aber Sie werden alle Ihre Methoden müssen die Ereignisse versenden.

ich eine vermeiden versuchen __call so viel wie möglich zu verwenden, weil es Ihr Code schwerer zu verstehen und zu warten macht, obwohl ich es in Ordnung zu Verwendung in Plugin-Systemen zu denken.

Vielen Dank für Anregungen, ich war eine Art auf den Holzweg, aber hier ist die Lösung kam ich mit:

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

Nochmals vielen Dank Jungs!

Sie können die Verfahrensparameter direkt von dem __call Parameter erhalten:

function __call($method, $args) {
    return call_user_func_array(array($this,$method),$args);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top