PHP在每个静态函数之前运行静态方法


PHP run static method before each static function

我希望能够在调用任何函数之前自动调用函数。__callStatic的问题是,它只在方法不存在的情况下运行。

见下面的代码。

我想让always_run()在静态类中调用的任何函数之前运行。

class Test {
    public static function __callStatic($method, $parameters){
        echo __CLASS__ . "::" . $method;
        if (method_exists(__CLASS__, $method)) {
            self::always_run();
            forward_static_call_array(array(__CLASS__,$method),$args);
        }
    }
    public static function always_run() {
        echo "always_run";
    }
    public static function my_func() {
        echo "myfunc was called";
    }
}
Test::my_func();
// OUTPUT: always_run myfunc wascalled

创建像这样具有全局状态的静态类总是糟糕的设计。你实际上应该只是创建对象,然后你可以在构造函数中运行任何类型的设置代码。

class Test
{
    public function __construct()
    {
        // Code run only once when the object is constructed.
    }
}
静态状态使得此类类难以测试和维护。静态类不能被模拟,因此依赖于该类的代码不能被独立测试。

这里有一篇文章可以帮助你:https://r.je/static-methods-bad-practice.html

可以将方法设为私有:

class Test {
    public static function __callStatic($method, $parameters){
        echo __CLASS__ . "::" . $method;
        if (method_exists(__CLASS__, $method)) {
            self::always_run();
            forward_static_call_array(array(__CLASS__,$method),$parameters);
        }
    }
    private static function always_run() {
        echo "always_run";
    }
    private static function my_func() {
        echo "myfunc was called";
    }
}
Test::my_func();

确实有点hack,但这并不是一个理想的情况