php - 无法在另一个对象中使用调用魔术方法

标签 php specifications magic-methods

我经历过一些事情,我认为这是一个错误,但我不确定。所以我来这里问比我更了解这个问题的人,这是一个 PHP bug 吗?看看下面几行:

<h1>Tests</h1>

<?php
class Foo
  {
  public function __invoke()
    {
    return 'Called correctly';
    }
  }

class Boo
  {
  public function __construct()
    {
    $this->Foo = new Foo();
    }
  }

$Foo = new Foo();
echo $Foo();

echo "<br><br><hr><br><br>";

$Boo = new Boo();
echo $Boo->Foo();

根据the specification ,由于当脚本尝试将对象作为函数调用时调用 __invoke() 方法,我应该获得以下内容:

Called correctly


Called correctly

但是最后一个echo没有执行。相反,我得到这个:

PHP Fatal error: Call to undefined method Boo::Foo() in [...]/index.php on line 26

这是一个错误还是预期的行为?如果这是一个错误,我们将非常感谢有关如何提交它的一些帮助。

根据乔恩的回答进行编辑,以进一步展示丑陋的行为

class Doo
  {
  public function __construct()
    {
    // The Foo class is the same as the one defined before

    $Test = new Foo();
    echo $Test();      // Echos correctly

    echo "<br><br><hr><br><br>";

    $this->Foo = $Test;
    echo $this->Foo();  // Error. Heisenbehaviour?
    }
  }

$Boo = new Doo();

最佳答案

这不是一个错误,并且不限于 Foo 是定义 __invoke 的对象。对于任何可调用的内容,您都会遇到相同的错误:

class Foo
{
    private $bar = 'rand';

    public function __construct()
    {
        $this->bar(); // won't work
    }  
}

您需要将其写为两行,或者使用call_user_func:

// #1
$Boo = new Boo();
$Foo = $Boo->Foo;
$Foo();

// #2
$Boo = new Boo();
call_user_func($Boo->Foo);

关于php - 无法在另一个对象中使用调用魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888994/

相关文章:

email - 用于寻址邮件中 PDF 页面的 URL?

PHP 重定向页面没有推荐 URL

php - 在将输出重定向到文本文件时使用 exec 似乎锁定了该文件

linux - 如何避免像 $HOME 这样的变量在脚本中被翻译

html - body 位置相关的意外行为

python - 如何制作两种不同的 __mul__ 方法

php自动对象到数组的转换

python - 如何编写静态 python getitem 方法?

php - 压缩主文件夹,里面有子文件夹

php - 在mysql中添加新行,在多个文本框中使用逗号分隔文本