php – 从非静态方法触发__callStatic()的奇怪行为
发布时间:2020-12-13 17:11:01 所属栏目:PHP教程 来源:网络整理
导读:我在 PHP类(v5.3.8)中发现了这种奇怪的行为. 你有: class foo { function __call($func,$args) { if ($func == 'bar') echo "non-static __call"; } static function __callStatic($func,$args) { if ($func == 'bar') echo "__callStatic"; } function cal
我在
PHP类(v5.3.8)中发现了这种奇怪的行为.
你有: class foo { function __call($func,$args) { if ($func == 'bar') echo "non-static __call"; } static function __callStatic($func,$args) { if ($func == 'bar') echo "__callStatic"; } function callMe() { self::bar(); } } 然后你做: foo::bar() // outputs '__callStatic' as expected. $f = new foo; $f->callMe(); // outputs 'non-static __call',as I did not expect. 您会看到,从非静态函数调用的不存在的静态方法会触发__call()而不是__callStatic().我想知道这是否应该像这样工作或者这是一种什么样的错误? [编辑] 我忘了试试static :: bar();在callMe()但不,它也没有用. 我(我想)理解inhan的评论但仍然……如果我正在调用类本身,而不是实例或对象,我的直接逻辑说它应该触发__callStatic().那好吧. 谢谢你的回答/评论. 解决方法
您可能会对这些事物在类方法的上下文中意味着什么感到困惑:
class B extends A { public function test() { A::foo(); self::foo(); static::foo(); } } 这些都不意味着“调用名为foo的静态方法”.它只是意味着“在继承树中的位置调用名为foo的方法”,由冒号左边的内容指定. 通常,没有魔法,你只有一个名为foo的函数,所以意思很简单.但是,当您使用两种魔术方法重载时,调用是不明确的. PHP默认使用__callStatic()之前的__call(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |