PHP class 使用静态方法,在钩子之前
PHP class with static methods, before hook
我在 PHP 中有以下 class 和所有静态方法:
class Foo {
public static function a {
}
public static function b {
}
public static function c {
}
public static function d {
}
public static function e {
}
}
有没有办法在调用 class Foo
中的任何方法之前创建一个要触发的钩子,即像 before hook?我需要一些逻辑,并且不想将该逻辑添加到每个静态函数中,例如:
class Foo {
private static function init() {
// pre logic here
}
public static function a {
Foo::init();
}
public static function b {
Foo::init();
}
public static function c {
Foo::init();
}
public static function d {
Foo::init();
}
public static function e {
Foo::init();
}
}
我猜你可以用__callStatic()魔术方法来实现。
public static function __callStatic($name, $arguments)
{
// pre logic here
switch($name)
{
case 'a':
// do something
break;
case 'b':
// do something
break;
}
}
基本答案:没有,平淡无奇PHP。
不过,您可以尝试几种选择:
您可以调用您的方法,例如 aSomeSuffix
、bSomeSuffix
等,并通过 __callStatic
方法即时计算后缀名来调用它们.
优点:
- 单处理程序
缺点:
- 您的 IDE 将看不到这些方法,除非您通过 phpDoc
明确地写下它们
- 额外的工作和一大堆容易出错的地方(通过引用传递参数,缺少方法处理等)
你可以试试Go库,在PHP中引入了面向方面的编程,声称可以拦截静态调用。我从来没有使用过它(尽管我听说过很多关于它的好评)并且对使用它的性能下降 and/or 警告一无所知,但它似乎与你的情况相符。我想,这仍然需要为每个方法编写一个注释,但它会导致单个处理程序。
在每个方法中调用初始化方法。这是您要避免的,而不是一个选项,我猜,只是因为它违反了 DRY。
你想要的是 Aspect-Oriented Programming。它允许在方法调用、属性 访问、class 初始化等之前定义通知
但是,由于其复杂性,此技术在 PHP 中并未得到广泛使用。我可以用 Go! AOP Framework.
建议你举个例子
class AutoInitializationAspect implements Aspect
{
/**
* This advice intercepts an execution of static methods
*
* We use "Before" type of advice to initialize the state
*
* @param MethodInvocation $invocation Invocation
*
* @Before("execution(public Foo::*(*))", scope="target")
*/
public function beforeMethodExecution(MethodInvocation $invocation)
{
$class = $invocation->getThis(); // will be the class name
$class::init(); // access to the private scope of class
}
}
访问 http://demo.aopphp.com/?showcase=loggable 进行演示(参见 LoggingDemo::runByName() 截获的静态方法)
我在 PHP 中有以下 class 和所有静态方法:
class Foo {
public static function a {
}
public static function b {
}
public static function c {
}
public static function d {
}
public static function e {
}
}
有没有办法在调用 class Foo
中的任何方法之前创建一个要触发的钩子,即像 before hook?我需要一些逻辑,并且不想将该逻辑添加到每个静态函数中,例如:
class Foo {
private static function init() {
// pre logic here
}
public static function a {
Foo::init();
}
public static function b {
Foo::init();
}
public static function c {
Foo::init();
}
public static function d {
Foo::init();
}
public static function e {
Foo::init();
}
}
我猜你可以用__callStatic()魔术方法来实现。
public static function __callStatic($name, $arguments)
{
// pre logic here
switch($name)
{
case 'a':
// do something
break;
case 'b':
// do something
break;
}
}
基本答案:没有,平淡无奇PHP。
不过,您可以尝试几种选择:
您可以调用您的方法,例如
aSomeSuffix
、bSomeSuffix
等,并通过__callStatic
方法即时计算后缀名来调用它们.
优点:- 单处理程序
缺点:
- 您的 IDE 将看不到这些方法,除非您通过 phpDoc 明确地写下它们
- 额外的工作和一大堆容易出错的地方(通过引用传递参数,缺少方法处理等)
你可以试试Go库,在PHP中引入了面向方面的编程,声称可以拦截静态调用。我从来没有使用过它(尽管我听说过很多关于它的好评)并且对使用它的性能下降 and/or 警告一无所知,但它似乎与你的情况相符。我想,这仍然需要为每个方法编写一个注释,但它会导致单个处理程序。
在每个方法中调用初始化方法。这是您要避免的,而不是一个选项,我猜,只是因为它违反了 DRY。
你想要的是 Aspect-Oriented Programming。它允许在方法调用、属性 访问、class 初始化等之前定义通知
但是,由于其复杂性,此技术在 PHP 中并未得到广泛使用。我可以用 Go! AOP Framework.
建议你举个例子class AutoInitializationAspect implements Aspect
{
/**
* This advice intercepts an execution of static methods
*
* We use "Before" type of advice to initialize the state
*
* @param MethodInvocation $invocation Invocation
*
* @Before("execution(public Foo::*(*))", scope="target")
*/
public function beforeMethodExecution(MethodInvocation $invocation)
{
$class = $invocation->getThis(); // will be the class name
$class::init(); // access to the private scope of class
}
}
访问 http://demo.aopphp.com/?showcase=loggable 进行演示(参见 LoggingDemo::runByName() 截获的静态方法)