首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__call()混淆

__call()混淆
EN

Stack Overflow用户
提问于 2016-10-30 23:49:46
回答 2查看 113关注 0票数 2

我对__call()有些困惑,我搜索的所有东西都告诉我它应该能工作。

代码语言:javascript
复制
<?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 get的回声首先出来了。它甚至在某一时刻起了作用,我只是对正在发生的事情感到非常困惑。php手册对此也不太清楚,至少不是我想要做的。

注意事项:最令人困惑的是,上面的__call方法不再具有响应性,如果我在其中执行测试消息,就不会打印它。

就像我说的,我在某个神奇的时刻让它发挥作用。有人能告诉我我做错了什么,还是有可能?(随着时间的推移,我改变了一些东西,所以这可能改变了场景。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 00:08:46

我想你把__call做什么弄糊涂了。这是为无法访问的方法而设计的。所以让我们来看看A

代码语言:javascript
复制
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()不是

代码语言:javascript
复制
class B extends A{

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

问题是,您的代码从未触及B() --方法。你称B()

代码语言:javascript
复制
$b = new B();
$b->C();

要让__call工作,你需要做

代码语言:javascript
复制
$b = new B();
$b->B(); // invokes __call()
票数 3
EN

Stack Overflow用户

发布于 2016-10-31 00:03:41

只有在未指定/访问函数时才调用__call() --

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

你不能做你想做的事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40334885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档