PHP-自动先调用一个再调用另一个?
在PHP中,有没有办法让类方法在当前方法之前自动调用其他指定方法?(我基本上是希望在RubyonRails中进行过滤前进行模拟 例如,直接调用函数b,但得到输出“hello you”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
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';
}
}