3-19练习关于$this的引用

3-19练习关于$this的引用

class haha
{
	 public $name="张三丰";
	 protected $age=28;

	 public function __get($n){
	 	// return "别问了";
	 	if ($n == 'age') {
	 		return $this->age;
	 	}else{
	 		return '完全听不懂你在说什么';
	 	}
	 }
	 

	 public function __set($n,$v){
	 	// echo "触发了设置不可访问的属性".$n."值为".$v;
	 	$this->$n=$v;
	 }
}
$aa=new haha();
echo $aa->age;
// var_dump($n);
$aa->age=29;
echo $aa->age;

http://img1.sycdn.imooc.com//climg/5cd985ef0001740007760671.jpg

如果这里不加$符号 相当于 一个 公共的属性$n, 但是第一次 echo$aa->age 调用 这个受保护的属性时 __get()函数里面 的参数是$n ,此时 $n参数和age是一个 传递的过程

所以运行结果是28 !当 给受保护的属性age赋值29的时候 会调用__set()函数 ,该函数 需要两个参数。$this->$n=$v; 如果 把n前面的$符号去掉 则相当于是之前的 age 值是28,

但如果加上$符号 age就会被赋值为29 不加$符号相当于 引用之前的值28 ,综上所述 haha类里面的两个方法中 参数都有$n,调用的与赋值都是 与类自身的属性age相关。核心问题在于__set()方法中  $this对$n的引用,加$符号与不加直接决定了 引用之前的值28还是最后一次赋值29 。

简单点说 就是加了$ 符号 $this的指针指向最新赋值的29  ,如果不加 $this的指针 还是会指向 之前的初始值28 

老师我的理解正确吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕查理 2019-05-14 09:51:58

您好,__set方法中如果是使用$this->n=$v;,其实是赋值失败,所以用的是原来的值。同学可以输出一下$this->n,查看下效果。祝学习愉快!

  • 提问者 代码两万行 #1
    嗯嗯 我知道赋值失败~老师我上面理解的正确吗?这个逻辑
    2019-05-14 19:38:27
  • 好帮手慕查理 回复 提问者 代码两万行 #2
    您好,正确哦~祝学习愉快!
    2019-05-15 09:33:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师