PHP-自动先调用一个再调用另一个?

PHP-自动先调用一个再调用另一个?,php,ruby-on-rails,filter,Php,Ruby On Rails,Filter,在PHP中,有没有办法让类方法在当前方法之前自动调用其他指定方法?(我基本上是希望在RubyonRails中进行过滤前进行模拟 例如,直接调用函数b,但得到输出“hello you” function a() { echo 'hello'; } function b() { echo 'you'; } 谢谢你的建议 谢谢。PHP不支持过滤器。但是,您可以调整自己的函数,以确保a()总是在b()之前运行 如果您不愿意重写一个b()来同时调用这两个函数,则不会这样做 不过,您可能对PHP的A

在PHP中,有没有办法让类方法在当前方法之前自动调用其他指定方法?(我基本上是希望在RubyonRails中进行过滤前进行模拟

例如,直接调用函数b,但得到输出“hello you”

function a() 
{
echo 'hello';
}

function b() 
{
echo 'you';
}
谢谢你的建议


谢谢。

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


如果您不愿意重写一个b()来同时调用这两个函数,则不会这样做

不过,您可能对PHP的AOP感兴趣。

这个怎么样:

function a() 
{
  echo 'hello';
}

function b() 
{
  a();
  echo 'you';
}
如果您在一个类下且两个函数都在该类中:

function a() 
{
  echo 'hello';
}

function b() 
{
  $this->a();
  echo 'you';
}
不确定,但可能这正是您想要的。谢谢检查此项:

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

我不建议使用类似AOP的东西。这是语言的一个非常基本的前提,试图绕过它会导致代码混乱和难以理解。我同意,但这是OP问题的有效答案。小问题:调用
a()时会输出“hello hello”
在controllerright中,rails上也会发生同样的情况,不同之处在于:only和:except:)可能重复。另外,为什么不看看RoR源代码,看看它是如何实现的呢。应该很容易移植。
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';
    }
}