PHP魔术方法__set()和__get()的解释001

<?php
class person
{
    public $name;
    public $gender;
    
    public function __set($name, $value)
    {
        echo "Setting $name to $value", "<br />";
        $this->$name = $value;
    }
    
    public function __get($name)
    {
        if (!isset($this->$name))
        {
            echo "此变量 $name 不存在,现在动态创建并为其设定值", "<br />";
            $this->$name = '默认值';
        }
        return $this->$name;
    }
}

$student = new person();
$student->age;    //断点
?>

运行结果是:

此变量 age 不存在,现在动态创建并为其设定值<br />Setting age to 默认值<br />

如果是浏览器上,运行结果是(<br />不显示):

此变量 age 不存在,现在动态创建并为其设定值

Setting age to 默认值


在以上代码25行设定断点后,代码运行的行号顺序是:

3          {

24        $student = new person();

25        $student->age;

15        if (!isset($this->$name))

17        echo "此变量 $name 不存在,现在动态创建并为其设定值", "<br />";

18        $this->$name = '默认值';

9          echo "Setting $name to $value", "<br />";

10        $this->$name = $value;

11        }

20        return $this->$name;

26        ?>

解释:

  1.     25行$student->age;访问一个不存在的变量age,自动调用__get('age')函数

  2.      __get('age')执行到18行 $this->age = '默认值',此时给一个原本类person中没有声明的变量age赋值,自动调用了__set('age', '默认值')函数

  3.      执行__set('age', '默认值')函数后,回到20行return $this->age;返回$this->age给__get('age')函数。此时25行$student->age;执行结束,此时这个表达式语句有个返回值($this->age,即'默认值'),如果此语句是echo $student->age;那么可以在原输出结果基础上多得到一个输出结果为:'默认值'



转载于:https://my.oschina.net/u/2399823/blog/487739

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值