2012-04-06 5 views
5

Gibt es eine magische Methode, dass wenn eine bestimmte Methode von einem Objekt aufgerufen wird, zuerst eine magische Methode aufgerufen wird. Ein bisschen wie die __call-Methode, aber dies wird nur ausgelöst, wenn die Methode nicht gefunden wird.execute (magic) Methode, wenn die existierende Methode aufgerufen wird

Also in meinem Fall würde ich so etwas wie dies mag:

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function helloWorld () 
    { 
     echo ' [Hello] '; 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

//Output: 
[start] [Hello] 

Ist so etwas in PHP existieren ??

+1

Es gibt nur '__construct' es wird aufgerufen, wenn dieser Teil des Codes ausgeführt wird:' $ obj = new MyClass(); ' – noob

+0

@micha, siehe Kommentar zu Stony --- (Kommentar entfernt) . Ich suche nicht nach der __construct() Methode. Dies wird nur beim Erstellen des Objekts aufgerufen. Ich brauche eine magische Methode, die jedes Mal aufgerufen wird, wenn eine Funktion aufgerufen wird. – w00

+1

Nein, gibt es nicht. Deklarieren Sie Ihre vorhandenen Methoden mit einem anderen Schema oder verwenden Sie ein Wrapper-Objekt. – mario

Antwort

3

Es gibt keine direkte Möglichkeit, dies zu tun, aber es sieht für mich wie Sie versuchen, ein zu implementieren Form der aspektorientierten Programmierung. Es gibt mehrere Möglichkeiten, dies in PHP zu erreichen, würde man Ihre Klasse etwas einzurichten wie folgt aus:

class MyClass 
{ 
    public function __startMethod ($method, $args) 
    { 
     // a method just got called, so this is called first 
     echo ' [start] '; 
    } 

    public function _helloWorld () 
    { 
     echo ' [Hello] '; 
    } 

    public function __call($method, $args) 
    { 
     _startMethod($method, $args); 
     $actualMethod = '_'.$method; 
     call_user_func_array(array($this, $actualMethod), $args); 
    } 
} 

$obj = new MyClass(); 
$obj->helloWorld(); 

nachschlagen andere Möglichkeiten der AOP in PHP Implementierung zu sehen, was für Sie am besten funktioniert (ich werde schau, ob ich irgendwo einen Link finde).

EDIT: Hier ist ein Dokument für Sie http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

Du kannst '__startMethod' und' _helloWorld' als privat oder geschützt setzen, damit niemand "hackt". – Soaku

2

Nein, es gibt keine magische Methode dafür.

Das Beste, was Sie tun können, ist andere Namen für Ihre Funktionen erstellen (zB: hidden_helloWorld), dann alle die Anrufe mit __call fangen und versuchen, die hidden_ Methode aufrufen, wenn es verfügbar ist. Natürlich ist dies nur möglich, wenn Sie die volle Kontrolle über die Benennung der Klasse und ihrer Eltern usw. haben.

1

Sie es, indem Sie Ihre Methoden privaten und ruft die Methoden mit der __call() magische Methode erreichen könnte. Wie:

Die mthdRequired-Methode wird nicht aufgerufen, außer Aufruf verwenden. Ich hoffe, das ist nützlich.

+0

Sehr coole Idee! –

Verwandte Themen