我希望能够在调用任何函数之前自动调用函数。__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,但这并不是一个理想的情况