2012-04-06 14 views
5

Czy istnieje magiczna metoda, która po wywołaniu określonej metody z obiektu powoduje, że metoda magiczna jest wywoływana jako pierwsza. Podobnie jak metoda __call, ale wyzwalana jest tylko wtedy, gdy metoda nie zostanie znaleziona.Wykonaj (magiczną) metodę, gdy istniejąca metoda nazywa się

Więc w moim przypadku chciałbym ci coś takiego:

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] 

Czy coś takiego istnieje w PHP ??

+1

Istnieje tylko '__construct', który zostanie wywołany, gdy ta część kodu zostanie wykonana:' $ obj = new MyClass(); ' – noob

+0

@micha, zobacz mój komentarz na Stony --- (Komentarz został usunięty) . Nie szukam metody __construct(). Jest to wywoływane tylko wtedy, gdy obiekt jest tworzony. Potrzebuję magicznej metody, która jest wywoływana za każdym razem, gdy wywoływana jest funkcja. – w00

+1

Nie, nie ma. Deklaruj istniejące metody za pomocą innego schematu lub użyj obiektu opakowania. – mario

Odpowiedz

3

Nie ma bezpośredniego sposobu, aby to zrobić, ale wygląda na to, że próbujesz wdrożyć forma programowania zorientowanego na aspekt. Istnieje kilka sposobów na osiągnięcie tego celu w PHP, jeden byłby skonfigurować klasy coś jak następuje:

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

Spójrz inne sposoby wdrożenia AOP w PHP, aby zobaczyć, co działa najlepiej dla Ciebie (będę sprawdź, czy mogę gdzieś znaleźć link).

EDIT: tu jest dokument dla Ciebie http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

Możesz wtedy ustawić '__startMethod' i' _helloWorld' jako prywatny lub chroniony, aby nikt go nie "hakował". – Soaku

2

Nie ma żadnej magicznej metody.

Najlepiej można zrobić, to tworzyć inne nazwy dla swoich funkcji (np: hidden_helloWorld), a następnie złapać wszystko połączenia z __call i spróbować wywołać metodę hidden_ jeśli jest ona dostępna. Oczywiście jest to możliwe tylko wtedy, gdy masz pełną kontrolę nad nazewnictwem klasy i jej rodzica, itd ...

1

mógł go osiągnąć poprzez wasze metody prywatne i wywołanie metody za pomocą __call() Metoda magii. Podobnie jak:

<?php 

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

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

Metoda mthdRequired nie jest wywoływana z wyjątkiem użycia połączenia. Mam nadzieję, że jest to przydatne.

+0

Bardzo fajny pomysł! –

Powiązane problemy