PHP - автоматически вызывать один перед другим? - PullRequest
0 голосов
/ 22 декабря 2009

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

Например, вызывая функцию b напрямую, но получая вывод 'hello you'.

function a() 
{
echo 'hello';
}

function b() 
{
echo 'you';
}

Любой совет приветствуется.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

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

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 голосов
/ 22 декабря 2009

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

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

0 голосов
/ 22 декабря 2009

Как насчет этого:

function a() 
{
  echo 'hello';
}

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

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

function a() 
{
  echo 'hello';
}

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

Не уверен, но, возможно, это то, что вы ищете. спасибо

0 голосов
/ 22 декабря 2009

PHP не поддерживает фильтры. Однако вы можете просто смоделировать свою собственную функцию, чтобы гарантировать, что a () всегда запускается перед b ().

function a() 
{ 
echo 'hello';
}

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