PHP - 自动调用一个接一个?

时间:2009-12-22 09:06:22

标签: php ruby-on-rails filter

在PHP中,有没有办法让类方法在当前的方法之前自动调用其他指定的方法? (我基本上是想从Ruby on Rails模拟before_filter。

例如,直接调用函数b但输出'hello you'。

function a() 
{
echo 'hello';
}

function b() 
{
echo 'you';
}

任何建议表示赞赏。

感谢。

4 个答案:

答案 0 :(得分: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';
    }
}

答案 1 :(得分:0)

PHP不支持过滤器。但是,您可以只修改自己的函数以确保a()始终在b()之前运行。

function a() 
{ 
echo 'hello';
}

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

答案 2 :(得分:0)

如果您不愿意覆盖b()来同时调用它们,则不会。

你可能对AOP for PHP感兴趣。

答案 3 :(得分:0)

这个怎么样:

function a() 
{
  echo 'hello';
}

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

如果你在一个班级,并且这两个职能都属于那个班级:

function a() 
{
  echo 'hello';
}

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

不确定,但可能这就是你要找的东西。感谢