php – 从非静态方法触发__callStatic()的奇怪行为

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 从非静态方法触发__callStatic()的奇怪行为脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 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().

脚本宝典总结

以上是脚本宝典为你收集整理的php – 从非静态方法触发__callStatic()的奇怪行为全部内容,希望文章能够帮你解决php – 从非静态方法触发__callStatic()的奇怪行为所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。