2012-04-06 3 views
5

Есть ли волшебный метод, когда при вызове какого-либо метода из объекта вызывается метод магии. Kinda, как метод __call, но это срабатывает только тогда, когда метод не найден.выполнить (магический) метод, когда существующий метод называется

Так что в моем случае я хотел бы что-то вроде этого:

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] 

ли существует что-то вроде этого в PHP ??

+1

Существует только '__construct', который будет вызываться, когда эта часть кода будет выполнена:' $ obj = new MyClass(); ' – noob

+0

@micha, см. Мой комментарий в Stony --- (Комментарий удален) , Я не ищу метод __construct(). Это вызывается только при создании объекта. Мне нужен волшебный метод, который вызывается каждый раз, когда вызывается функция. – w00

+1

Нет, нет. Объявите существующие методы с помощью другой схемы или используйте объект-оболочку. – mario

ответ

3

Существует нет прямого способа сделать это, но мне кажется, что вы пытаетесь реализовать форма аспектно ориентированного программирования. Есть несколько способов достижения этой цели в PHP, один должен был бы создать свой класс что-то вроде следующего:

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

Посмотрите другие способы реализации АОП в PHP, чтобы увидеть, что лучше работает для вас (я буду посмотрим, смогу ли я найти ссылку где-нибудь).

EDIT: вот документ для вас http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf

+0

Вы можете установить '__startMethod' и' _helloWorld' как частные или защищенные, поэтому никто его не «взломает». – Soaku

2

Для этого нет никакого волшебного метода.

Лучшее, что вы можете сделать, это создать другие имена для функций (например: hidden_helloWorld), затем поймать все звонки с __call и попытаться вызвать метод hidden_, если он доступен. Конечно, это возможно только в том случае, если у вас есть полный контроль над наименованием класса и его родителя и т. Д.

1

вы могли бы достичь его, делая ваши методы приватным и вызова методов с использованием __call() магический метод. Вроде:

<?php 

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

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

Метод mthdRequired не вызван, кроме как с помощью вызова. Надеюсь, это полезно.

+0

Очень крутая идея! –

Смежные вопросы