2009-12-22 4 views
0

В PHP есть ли способ сделать метод класса автоматически вызывать некоторый другой указанный метод до текущего? (Я в основном ищет имитировать before_filter от Ruby On Rails.PHP - Автоматически вызывать один за другим?

Например, при вызове функции Ь непосредственно, но получить выход 'привет вам'.

function a() 
{ 
echo 'hello'; 
} 

function b() 
{ 
echo 'you'; 
} 

Любые советы оценили.

Спасибо .

+0

возможно дубликат [Проверить функция была вызвана] (http://stackoverflow.com/questions/1933050/check-if-function-has-been-called -yet) – Gordon

+0

Кроме того, почему бы не посмотреть исходный код RoR, чтобы узнать, как он реализован. Должно быть легко переносится. – Gordon

ответ

2

Проверьте это:

class Dispatcher { 
    /* 
    * somewhere in your framework you will determine the controller/action from path, right? 
    */ 
    protected function getControllerAndActionFromPath($path) { 
     /* 
     * path parsing logic ... 
     */ 
     if (class_exists($controllerClass)) { 
      $controller = new $controllerClass(/*...*/); 
      if (is_callable(array($controller, $actionMethod))) { 
       $this->beforeFilter($controller); 
       call_user_func(array($controller, $actionMethod)); 
       /*.. 
       * $this->afterFilter($controller); 
       * ...*/ 
      } 
     } 
    } 

    protected function beforeFilter($controller) { 
     foreach ($controller->beforeFilter as $filter) { 
      if (is_callable(array($controller, $filter))) { 
       call_user_func(array($controller, $filter)); 
      } 
     } 
    } 

    /*...*/ 
} 

class FilterTestController extends Controller { 
    protected $beforeFilter = array('a'); 

    function a() { 
     echo 'hello'; 
    } 

    function b() { 
     echo 'you'; 
    } 
} 
+0

Незначительная вещь: это выдает «привет привет» при вызове 'a()' в контроллере – Gordon

+0

вправо, то же происходит на рельсах с той разницей, что у вас есть: только и: кроме :) – knoopx

0

PHP не поддерживает filters.However, вы могли бы просто modefy свою собственную функцию, чтобы гарантировать, что() всегда выполняется до Ь().

function a() 
{ 
echo 'hello'; 
} 

function b() 
{ 
a(); 
echo 'you'; 
} 
0

Нет, если вы не хотите переопределять функцию b() для вызова обоих.

Возможно, вам будет интересен AOP для PHP.

+2

Я бы не рекомендовал использовать что-то вроде АОП. Это очень базовая предпосылка языка, и попытка обойти его приведет к загроможденному и трудно понятному коду. – troelskn

+0

Я бы согласился, но это действительный ответ на проблему OP. – Evert

0

Как об этом:

function a() 
{ 
    echo 'hello'; 
} 

function b() 
{ 
    a(); 
    echo 'you'; 
} 

Если вы находитесь в классе, и обе функции в этом классе:

function a() 
{ 
    echo 'hello'; 
} 

function b() 
{ 
    $this->a(); 
    echo 'you'; 
} 

Не уверен, но, возможно, это то, что вы ищете. благодаря

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