2012-04-06 11 views
5

Esiste un metodo magico che quando un determinato metodo viene chiamato da un oggetto, viene chiamato per primo un metodo magico. Un po 'come il metodo __call, ma questo viene attivato solo quando il metodo non viene trovato.esegue il metodo (magico) quando il metodo esistente è chiamato

Così nel mio caso mi piacerebbe qualcosa di simile:

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] 

fa qualcosa del genere esiste in PHP ??

+1

C'è solo '__construct' che verrà chiamato quando questa parte del codice verrà eseguita:' $ obj = new MyClass(); ' – noob

+0

@micha, vedere il mio commento su Stony --- (Il commento è stato rimosso) . Non sto cercando il metodo __construct(). Questo viene chiamato solo quando l'oggetto viene creato. Ho bisogno di un metodo magico che viene chiamato ogni volta che viene chiamata una funzione. – w00

+1

No, non c'è. Dichiarare i metodi esistenti con un altro schema o utilizzare un oggetto wrapper. – mario

risposta

3

Non c'è un modo diretto per farlo, ma mi sembra che tu stia cercando di implementare un forma di programmazione orientata agli aspetti. Ci sono diversi modi per raggiungere questo in PHP, uno sarebbe per impostare la classe qualcosa di simile al seguente:

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

Cercare altri modi di attuazione AOP in PHP per vedere che cosa funziona meglio per voi (io vedere se riesco a trovare un collegamento da qualche parte).

EDIT: ecco un documento per voi http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

Puoi quindi impostare '__startMethod' e' _helloWorld' come privati ​​o protetti, in modo che nessuno "lo hackerò". – Soaku

2

No, non esiste un metodo magico per questo.

Il meglio che si possa fare è creare altri nomi per le funzioni (ad esempio: hidden_helloWorld), poi prendere tutte le chiamate con __call e cercare di chiamare il metodo hidden_ se è disponibile. Naturalmente questo è possibile solo se hai il pieno controllo sulla denominazione della classe e dei suoi genitori, ecc ...

1

si potrebbe ottenere lo rendendo i metodi privati ​​e chiamando i metodi che utilizzano il __call() metodo magico. Ad esempio:

<?php 

class MyClass{ 
    function __call($methd, $args){ 
     if(method_exists($this, $mthd)){ 
      $this->$mthd($args); 
     } 
    } 

    private function mthdRequired($args){ 
     //do something or return something 
    } 

Il metodo mthdRequired non viene richiamato tranne l'utilizzo della chiamata. Spero che questo sia utile.

+0

Idea fantastica! –

Problemi correlati