Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-_call()混乱_Php - Fatal编程技术网

PHP-_call()混乱

PHP-_call()混乱,php,Php,我对\u call()有些困惑,我搜索到的所有信息都告诉我它应该可以工作 <?php class A { abstract public function C(); private function B(){ echo "B"; } public function __call($method,$arguments){ if(method_exists("C", $method)) { $thi

我对
\u 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手册对此也不是很清楚,至少不是我想做的

注意:最令人困惑的是,上面的调用方法不再是responsive,如果我在其中执行测试消息,就不会打印它

正如我所说的,我在某个神奇的时刻让它发挥作用。有人能指出我做错了什么吗,或者有可能吗?(随着时间的推移,我已经更改了一些内容,因此这可能会改变场景。

\u call()仅在函数未指定/不可访问时调用。)--

见:


你不能做你想做的事。

我认为你混淆了
\uu 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();
要让
\u呼叫
工作,您需要执行以下操作

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

请显示您实际调用这些的代码functions@Machavity我已经添加了您要求的内容,这就是我的场景。
\u call()在对象上下文中调用不可访问的方法时被触发。
您的
C()没有任何不可访问的内容
method@MarkBaker我现在明白了,有没有可能用其他方法实现我想要的?好的,谢谢。根本不可能实现我想要的吗?我的意思是没有其他方法吗?好的,好的,我可以用这个!谢谢,因为滴度已经表明我对这个方法有点困惑。