为什么这里的闭包函数无法调用?此外魔术方法也未被调用

我的代码是这样的:
classstdObject{
publicfunction__construct(array$params=array()){
if(!empty($params))
foreach($paramsas$key=>$value)
$this->{$key}=$value;
}
publicfunction__call($methodName,$params){
$params=array_merge(array('stdObject'=>$this),$params);
if(isset($this->{$methodName})&&is_callable($methodName)){
//$params就是函数的参数,这里的stdObject就是function中的$stdObject;
returncall_user_func_array($methodName,$params);
}else{
thrownewException("Fatalerror:CalltoundefinedmethodstdObject::{$methodName}()");
}
}
}
echophpversion();
$obj=newstdObject();
$obj->name="Nick";
$obj->surname="Doe";
$obj->age=20;
$obj->adresse=null;
$obj->getInfo=function($stdObject){
//$stdObjectreferredtothisobject(stdObject).
echo$stdObject->name."".$stdObject->surname."have".$stdObject->age."yrsold.Andlivein".$stdObject->adresse;
};
print_r($obj);
$obj->getInfo();
?>
首先,按道理说,调用一个类中间不存在的成员变量,因该显示的的调用魔术方法_set,但是这里没有显示的声明_set方法;
2.为什么我无法调用$obj->getInfo()方法呢?一旦调用就会抛出异常'Fatalerror:CalltoundefinedmethodstdObject::getInfo(),就说明这个方法不存在
30秒到达战场
浏览 335回答 2
2回答

喵喵时光机

首先,缩进是谁弄的,快站出来,我保证不打死你哦…另外回答你的问题:你都知道调用不可访问的成员变量时会调用魔术方法__set(),那你为啥不定义呢!你不定义你怎么让人家工作嘛,就好像你不给工作内容给我但是你希望我每天干的跟狗一样?别逗好么!请自行增加魔术方法定义好么!classstdObject{privatefunction__set($name,$value){$this->$name=$value;}}PHP中成员属性和成员函数的定义方法是不一样的,我还没见过用$this->method=function(){}这样定义成员函数的,你这是把JavaScript的思想代入到PHP中来了吧。所以在调用不可访问成员函数的时触发__call()魔术方法中,你的isset()判断是真,但是is_callable()会返回假(对了这里还要提醒一个笔误,是is_callable($this->$methodName)不是is_callable($methodName),两个完全不一样好么!你以为你把变量名字叫做methodName你不给$this程序就会自动的给你调用成员函数么!坑爹呢!!),然后你的语法会抛出一个异常出来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript