PHP call_user_func_array实例内部实例

时间:2017-01-26 16:46:54

标签: php

<?php

class foo 
{
    private $callVar = false;
    private $constructorVar = false;

    public function __construct()
    {
        $this->constructorVar = get_class($this);
    }

    public function __call($methodName, $arguments) 
    {
        $this->callVar = get_class($this);
        call_user_func_array(array($this, $methodName), $arguments);
    }

    protected function method($params)
    {
        echo('<br>Call var: '.$this->callVar.'<br>Constructor var: '.$this->constructorVar);
    }
}

class foo_sec extends foo
{
    protected function method($params)
    {
        echo 'First call: ';
        parent::method($params);
        echo '<br> Second call: ';
        $test = new foo_trd();
        $test->method('param2');
    }
}

class foo_trd extends foo
{

}

$m = new foo_sec();
$m->method('param');

?>

给出了这个结果:

First call:
Call var: foo_sec
Constructor var: foo_sec
Second call:
Call var:
Constructor var: foo_trd

此代码应返回当前正在运行的实例的名称,但如果实例位于另一个实例中,则类名在第二个实例中为空。这是PHP错误还是我遗漏的其他问题?

换句话说,第二次通话中的Call var应为foo_trd - 不为空。

1 个答案:

答案 0 :(得分:0)

我相信您正在体验与PHP及其inheritance visibility相关的有趣事情。

简而言之,当您在Foo的内部和实例时,您可以访问同样扩展protected的所有其他实例的privateFoo范围。由于您可以直接访问protected method(),因此您将跳过对__call()的调用。

当您想要将构造函数设为私有并强制执行工厂时,这实际上非常有用。