2

我经历过一些我认为是错误的事情,但我不确定。所以我来这里问问比我更了解这个的人,这是一个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 __invoke() method is called when a script tries to call an object as a function,我应该得到这个:

正确调用


正确调用

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

PHP 致命错误:在第 26 行的 [...]/index.php 中调用未定义的方法 Boo::Foo()

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

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

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();
4

2 回答 2

1

它不是一个错误,它不限于是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);
于 2013-04-08T21:10:41.763 回答
1

另见类变量函数

它有完全相同的问题。PHP 词法分析器始终将语法识别variable T_OBJECT_OPERATOR T_STRING function_call_parameter_list为方法调用。

于 2013-04-08T21:29:06.813 回答