gpt4 book ai didi

php - 在 PHP 中执行 Hook 方法

转载 作者:可可西里 更新时间:2023-10-31 23:34:23 24 4
gpt4 key购买 nike

给定一个基类,其中我有一些必须在特定方法之前和之后运行的逻辑,它在其不同的派生类中采用截然不同的参数。例如:

abstract class Base{    
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }
abstract public function doIt();
}

class Cheating extends Base
{
public function doIt(){
$this->pre();
print "Doing it the cheating way\n";
$this->pos();
}
}

但我实际上想做的是:

class Alpha extends Base
{
public function doIt($x, $y){
print "Doing it in Alpha with x=$x, y=$y";
}
}

class Beta extends Base
{
public function doIt($z){
print "Doing it in Alpha with z=$z";
}
}

并且有一些方法可以始终运行 pre 和 pos 方法,而不必更改 doIt 方法本身。

显而易见的方法,应该在 Base 的所有派生中是同质的,就像这样:

abstract class Base
{
public function pre(){ print "Runing Base::pre()\n"; }
public function pos(){ print "Runing Base::post()\n"; }

public function process($a,$b){
$this->pre();
$this->doIt($a,$b);
$this->pos();
}

abstract public function doIt();
}

class Wishful extends Base
{
public function doIt($a, $b){
print "Doing it the Wishful way with a=$a, b=$b\n";
}
}

这里的问题是,由于我们在 doIt 的每个实现上都有不同数量和类型的参数,所以它实际上并没有解决问题。

这听起来像是“ Hook ”的案例 - 如何实现这些 Hook ?或任何其他解决问题的体面方法......我相信应该有一种我只是想念的更简单的方法 - 可能在圈子里思考错误的事情。

谢谢!

最佳答案

你应该看看aspect-oriented programming . lithium framework's filter系统使用这样的东西。 Zend Framework 2也打算使用AOP。

如果你想在引擎级别拦截一个函数调用,你可以使用intercept来自 PECL。

Google 还揭示了一个 nice framework你可以从中学到很多东西。看看它的代码。

此外,这里还有一个相关的 SO 问题:https://stackoverflow.com/questions/4738282/are-there-any-working-aspect-oriented-php-libraries

关于php - 在 PHP 中执行 Hook 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com