关于魔术方法??
<?php class Example { //不可访问的属性 protected $imooc="yes!"; //不可访问的普通方法 private function imooc(){ echo "问慕课!"; } //不可访问的静态方法 private static function imoocReal(){ echo "还真真滴问慕课!他就是不告诉你"; } //魔术方法 public function __set($n,$v){ if($n=='imooc'){ //注意这里!!! $this->$imooc = $v; echo "给不可访问属性赋值时触发".$n; }else{ echo"弄死你啊,设置你妹啊!"; } } public function __get($n){ //注意这里!!! // echo $this->$imooc; if($n=='imooc'){ echo "调用不可访问属性时触发" .$n; }else{ echo"弄死你啊,得不到!"; } } public function __isset($n){ if($n=='imooc'){ echo "对不可访问属性使用empty与isset()时触发" .$n."已经设置"; }else{ echo"弄死你啊,谁知道空不空?"; } } public function __unset($n){ if($n=='imooc'){ echo "对不可访问属性使用empty与isset()时触发" .$n."已经销毁"; }else{ echo"弄死你啊,销毁了!"; } } public function __call($name,$arg){ if($name=='imooc'){ echo "调用不可访问动态方法".$name."时触发<br>"; var_dump($arg); }else{ echo "你大爷的,谁知道你触发了什么!!!!"; } } public static function __callStatic($name,$arg){ if($name=='imoocReal'){ echo "调用不可访问动态方法".$name."时触发<br>"; var_dump($arg); }else{ echo "你大爷的,谁知道你触发了什么!!!!"; } } } //实例化对象 $imooc = new Example; //触发各种魔术方法 echo $imooc->imooc; echo "<hr>"; $imooc->imooc = "真傻!"; echo "<hr>"; $imooc->imooc("慕课很呵呵呵!","我也是这么认为的!"); echo "<hr>"; Example::imoocReal("慕课很呵呵呵!!!","我也是这么认为的!"); echo "<hr>"; isset($imooc->imooc); echo "<hr>"; unset($imooc->imooc); echo "<hr>"; ?>
我再使用__set、和__get方法时发现,第一次访问的属性名 都不是 调用时的属性名,都触发了else里的代码,这是为什么?
我猜想可能__set、和__get方法,也适用于类的内部调用??
在__get()方法里我调用了echo $this->$imooc; 但是读不出来还警告?这是为啥?
在__set()方法,我加了$this->$imooc = $v; 但是会先走一遍else语句,我猜这里又触发了__set()方法,这是为啥???
1
收起
正在回答
2回答
您好,魔术方法的作用:在给不可访问属性赋值时,__set() 会被调用。读取不可访问属性的值时,__get() 会被调用。
类外不可以调用和赋值受保护的$imooc属性,因此触发__set()__get()方法。
适用,第四点则是因为这个原因。
输出属性值应该是:echo $this->imooc;。
$this->$imooc = $v;中属性不存在则调用__set输出else区间内容。__set方法中写为$this->imooc = $v;则不会出现报错。设置属性出错。
另请同学采用文明用语。如果解决了您的问题,请采纳。祝学习愉快!
PHP常用技术与ThinkPHP5框架开发
- 参与学习 人
- 提交作业 225 份
- 解答问题 3372 个
掌握用PHP开发互联网网站的必备功能,掌握当下主流的Linux系统开发,并熟练使用热门框架ThinkPhp开发电商团购项目,是通向PHP工程师必经之路。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星