【问题标题】:PHP - Automatically call one one before another?PHP - 自动一个接一个地调用?
【发布时间】:2009-12-22 09:06:22
【问题描述】:

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

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

function a() 
{
echo 'hello';
}

function b() 
{
echo 'you';
}

任何建议表示赞赏。

谢谢。

【问题讨论】:

标签: php ruby-on-rails filter


【解决方案1】:

检查一下:

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';
    }
}

【讨论】:

  • 小事:在控制器中调用a()时会输出'hello hello'
  • 对,同样的情况发生在 Rails 上,不同之处在于你有 :only 和 :except :)
【解决方案2】:

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

function a() 
{ 
echo 'hello';
}

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

【讨论】:

    【解决方案3】:

    如果您不愿意覆盖 b() 来调用两者,则不会。

    您可能对 PHP 的 AOP 感兴趣。

    【讨论】:

    • 我不推荐使用像 AOP 这样的东西。这是该语言的一个非常基本的前提,试图规避它会导致代码混乱且难以理解。
    • 我同意,但这是对 OP 问题的有效答案。
    【解决方案4】:

    这个怎么样:

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

    如果你在一个班级下并且两个函数都在那个班级下:

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

    不确定,但可能就是您要找的。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多