不能在另一个对象中使用invoke magic方法

时间:2013-04-08 21:07:18

标签: php specifications magic-methods

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

<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,自The __invoke() method is called when a script tries to call an object as a function起,我应该得到这个:

  

正确调用

     
     

正确调用

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

  

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

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

编辑基于Jon回答进一步显示丑陋的行为

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

另见class variable functions

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