php - 为什么这里的闭包函数无法调用?此外魔术方法也未被调用
怪我咯
怪我咯 2017-04-10 14:52:59
[PHP讨论组]

我的代码是这样的:

 $value) 
                $this->{$key}=$value;
    }

    public function __call($methodName,$params){
        $params=array_merge(array('stdObject'=>$this),$params);
        if(isset($this->{$methodName})&&is_callable($methodName)){
            //$params就是函数的参数,这里的stdObject就是function中的$stdObject;
            return call_user_func_array($methodName,$params);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$methodName}()");
        }
    }

}

echo  phpversion();
$obj = new stdObject();
$obj->name = "Nick";
$obj->surname = "Doe";
$obj->age = 20;
$obj->adresse = null;
$obj->getInfo = function($stdObject) { 
    // $stdObject referred to this object (stdObject).
    echo $stdObject->name . " " . $stdObject->surname . " have " . $stdObject->age . " yrs old. And live in " . $stdObject->adresse;
};

print_r($obj);
$obj->getInfo();
?>

首先,按道理说,调用一个类中间不存在的成员变量,因该显示的的调用魔术方法_set,但是这里没有显示的声明_set方法;
2.为什么我无法调用$obj->getInfo()方法呢?一旦调用就会抛出异常
'Fatal error: Call to undefined method stdObject::getInfo(),就说明这个方法不存在

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
PHPz

首先,缩进是谁弄的,快站出来,我保证不打死你哦…另外回答你的问题:

  1. 你都知道调用不可访问的成员变量时会调用魔术方法__set(),那你为啥不定义呢!你不定义你怎么让人家工作嘛,就好像你不给工作内容给我但是你希望我每天干的跟狗一样?别逗好么!请自行增加魔术方法定义好么!

    
    class stdObject {
        private function __set($name, $value) {
            $this->$name = $value;
        }
    }
    

  2. PHP中成员属性和成员函数的定义方法是不一样的,我还没见过用$this->method = function() {}这样定义成员函数的,你这是把JavaScript的思想代入到PHP中来了吧。所以在调用不可访问成员函数的时触发__call()魔术方法中,你的isset()判断是真,但是is_callable()会返回假(对了这里还要提醒一个笔误,是is_callable($this->$methodName)不是is_callable($methodName),两个完全不一样好么!你以为你把变量名字叫做methodName你不给$this程序就会自动的给你调用成员函数么!坑爹呢!!),然后你的语法会抛出一个异常出来。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号