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

标签 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 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()。我想知道这是否应该像这样工作或者这是某种错误?

[编辑]

我忘了在 callMe() 上尝试 static::bar(); 但没有,它也没有用。

我(认为我)理解 inhan 的评论,但仍然......如果我调用类本身,而不是实例或对象,我的直接逻辑是它应该触发 __callStatic()。好吧。

感谢您的回答/评论。

最佳答案

您可能会对这些在类方法上下文中的含义感到困惑:

class B extends A {
  public function test() {
    A::foo();
    self::foo();
    static::foo();
  }
}

None 这些都意味着“调用名为 foo 的静态方法”。它只是表示在继承树中由冒号左侧指定的位置“调用名为 foo 的方法”。

通常情况下,没有魔法,你只有一个名为foo 的函数,所以意思很简单。但是,当您重载两种 魔法方法时,调用是不明确的。 PHP 默认在 __callStatic() 之前使用 __call()

关于php - 从非静态方法触发 __callStatic() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9469317/

相关文章:

javascript - php include 语句未将我的 php 文件包含到页面中

php - 使用php执行shell脚本

php - php 7.2 中的未定义常量错误

javascript - PHP 和 JavaScript 源代码,字符串比较错误

php - 在php中按下刷新按钮后停止插入数据库

php - 在 php 中读取文本文件时出错

php - 是否可以通过 Paypal 自定义字段发送多个 ID?

php - 使用经度和纬度查找彼此靠近的城市

php - 如何从 Ajax 调用的 PHP 循环中获取正确的 onclick ID?

php - 输出月份名称而不是数字