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

时间:2015-06-03 22:05:53

标签: php

我希望能够在调用任何函数之前自动调用函数。 __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

2 个答案:

答案 0 :(得分:4)

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

class Test
{
    public function __construct()
    {
        // Code run only once when the object is constructed.
    }
}

静态使得这些类难以测试和维护。静态类不能被模拟,因此依赖于类的代码无法独立测试。

这是一篇帮助你的文章:https://r.je/static-methods-bad-practice.html

答案 1 :(得分:1)

您可以将方法设为私有:

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();

真的有点黑客,但这不是一个理想的情况