我希望能够在调用任何函数之前自动调用函数。 __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
答案 0 :(得分:4)
创建具有全局状态的静态类总是糟糕的设计。你应该只是创建对象,然后你可以在构造函数中运行任何类型的设置代码。
class Test
{
public function __construct()
{
// Code run only once when the object is constructed.
}
}
静态使得这些类难以测试和维护。静态类不能被模拟,因此依赖于类的代码无法独立测试。
答案 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();
真的有点黑客,但这不是一个理想的情况