我对__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方法不再具有代理性,如果我在那里做测试消息,则不打印它。
如上所述,我已经在某个神奇的时刻开始工作了。有人能指出我做错了什么,或者有可能吗? (我已经改变了一些东西,所以这可能改变了这个场景。
答案 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
你无法做你想做的事。