PHP - __call()混淆

时间:2016-10-30 23:49:47

标签: php

我对__call()感到困惑,我搜索的所有内容都告诉我它应该有用

<?php

class A {

    abstract public function C();

    private function B(){
        echo "B";
    }

    public function __call($method,$arguments){
        if(method_exists("C", $method)) {
            $this->B();
            return call_user_func_array(array("C",$method),$arguments);
        }
    }
}

class B extends A{

    public function C(){
        echo "C";
    }
}

$b = new B();
$b->C();

//the result I get: 
// C
//the result I want;
// BC
?>

所以,我想要的结果是我调用函数C但是B首先回显了函数。它甚至在某些方面起作用,我对发生的事情感到非常困惑。 php手册也不是那么清楚,至少不是我想要做的。

  

注意:最令人困惑的是,上面的__call方法不再具有代理性,如果我在那里做测试消息,则不打印它。

如上所述,我已经在某个神奇的时刻开始工作了。有人能指出我做错了什么,或者有可能吗? (我已经改变了一些东西,所以这可能改变了这个场景。

2 个答案:

答案 0 :(得分:2)

我认为你对__call所做的事感到困惑。这是无法访问的方法。那么我们来看A

class A {

    abstract public function C();

    private function B(){
        echo "B";
    }

    public function __call($method,$arguments){
        if(method_exists("C", $method)) {
            $this->B();
            return call_user_func_array(array("C",$method),$arguments);
        }
    }
}

现在,您的B()private,但您孩子的C()不是

class B extends A{

    public function C(){
        echo "C";
    }
}

问题是您的代码从未触及B() 方法。您正在调用B()

$b = new B();
$b->C();

要让__call工作,您需要

$b = new B();
$b->B(); // invokes __call()

答案 1 :(得分:0)

__ call()仅在未指定/可访问函数时调用 -

请参阅:http://us2.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

你无法做你想做的事。