关于 PHP 的 __callStatic 方法的一个大坑

直接上代码:

class A{
    public static function __callStatic($name, $arguments)
    {
        echo $name.'静态方法不存在!';
    }

    public function test()
    {
        echo 'test 方法';
    }
}

A::test();

上面代码输出:test 方法

结果调用了 test()方法,并没有执行__callStatic()方法,我的本意是想用__callStatic()处理A::test()这种错误的调用情况,这种情况该怎么处理呢?

阅读 4.6k
4 个回答

http://www.jb51.net/article/3...
我查了一下,应该是这样子的,不是魔术方法__callStatic()的问题。
比方说test是静态方法,我们可以用A::test();或者,$A = new A(); $A->test();这两种调用方法是允许的。
现在因为test不是静态,只能用$A = new A(); $A->test();,你用A::test();,程序有警告,但是由于error_reporting(0);级别太高,把警告忽略了,虽然抛出警告,但是程序还是照样执行。

A::test()是静态调用,但你的test()不是static,语法上就出错了。
另外,__callStatic()是说,当你调用一个不可访问的static方法时,自动触发。何为不可访问?你类外调用没有权限或者不存在。
类似的,__call()是说,当你调用一个不可访问的普通方法时,自动触发。
因此,你要实现_callStatic()的触发,得确保类外是静态调用一个不可访问的静态方法。

修改 public 修饰符的权限

这确实是php的锅
使用静态调用的方法调用了非静态方法,
直接报错不就行了,
不知道为什么只是报了警告
不知道这其中是否有故事

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题