批改状态:合格
老师批语:
<?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>';点击 "运行实例" 按钮查看在线实例
===========================================+最终效果+==================================================

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