Correction status:qualified
Teacher's comments:
<?php /医院 * 人类 */ class Person { public $name; //姓名 public $age; //年龄 public $stature; //三围 public $data = []; /医院 * 构造方法 * Person constructor. * @param $name * @param $age * @param $stature */ public function __construct($name, $age, array $stature) { $this->name = $name; $this->age = $age; $this->stature = $stature; } //查询器 public function __get($name) { //如果类中添加一个自定义的数据收集器$data,就从这里取值 $msg = null; if (isset($this->$name)) { $msg = $this->$name; } elseif (isset($this->data[$name])) { $msg = $this->data[$name]; } else { $msg = '无此属性'; } return $msg; } //设置器 public function __set($name, $value) { //如果访问的是已存在的属性,则直接输出 if (isset($this->$name)) { $this->$name = $value; //输出属性 } else { //如果属性不存在,则创建它并保存到类属性$data数组中 $this->data[$name] = $value; } } } //实例化对象 $xiaoming = new Person('小明', 30, [80, 90, 80]); //测试魔术方法__get() echo '姓名: ', $xiaoming->name, '<br>'; echo '年龄: ', $xiaoming->age, '<br>'; echo '三维: ', print_r($xiaoming->stature, true), '<br>'; //获取一个不存在的属性 echo '爱好:', $xiaoming->hobby, '<br>'; echo '<hr>'; //测试魔术方法: __set() $xiaoming->name = '奶茶妹妹'; $xiaoming->age = 28; $xiaoming->stature = [85, 85, 88]; echo '姓名: ', $xiaoming->name, '<br>'; echo '年龄: ', $xiaoming->age, '<br>'; echo '三维: ', print_r($xiaoming->stature, true), '<br>'; //给一个不存在的属性赋值,类中并无hobby字段 $xiaoming->hobby = '购物'; //非常诡异的事情发生了,居然可以给一个不存在的字段,赋值,并且还能顺利的获取到,仿佛这个字段真实存在一样 echo '爱好:', $xiaoming->hobby, '<br>'; //真实的情况是: 给一个不存在的对象属性赋值,的确会自动添加一个新属性到类中,这个特性听上去似乎不太好,但有时却很有用 //因为我们可以事先创建一个类属性,专门用来收集用户自定义所数据,增加类的功能 //使用类属性设置器__set()再创建一个新属性 $xiaoming->email = '888888@123.com'; //直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据 echo '用户自定义属性<pre>' . print_r($xiaoming->data, true) . '</pre>';
点击 "运行实例" 按钮查看在线实例
===========================================+最终效果+==================================================