批改状态:合格
老师批语:标识符字符串前面加了$符的都变量, $this是变量, $name也是... $this->name, 是访问当前类实例的name属性, name是属性的名称... $this->$name, 也是访问类实例的属性, 但属性名称任意字符串, 只不过是存储到了变量$name中, 所以, $name是对当前要访问的类实例属性的一个引用罢了, 与属性name无关, 如果还是感到困惑, 那么你可以换个变量名, 例如 , $this->$prop也是可以的





<?php// 访问控制,实现类的封装// 1. 创建类class Demo4{// 2. 添加类成员public $site;// private $name = 'Peter Zhu';// 如果不想让该属性在类的外部被访问,可以将该属性的访问控制符修改为:// private 私有成员, protected 受保护成员// private $role;protected $role;public function getInfo(){return '我是: ' . $this->site . $this->role;}// 构造方法public function __construct($site, $role){$this->site = $site;$this->role = $role;}// 外部无权访问, 是为了防止非法访问, 并不代表禁止访问// 为这样的属性创建一个访问器方法, 来过滤用户的访问请求// public function getRole()// {// 仅允许用户名是'admin'的用户访问,其它访问返回: 无权访问// $username = $_GET['username'] ?? '';// if (isset($username) && $username === 'admin') {// return $this->role;// } else {// return '无权访问';// }// }// public function getName()// {// return isset($this->name) ? $this->name : '不存在该属性';// }// 魔术方法: __get($name), 属性重载public function __get($name){// 仅允许用户名是'admin'的用户访问,其它访问返回: 无权访问$username = $_GET['username'] ?? '';if (isset($username) && $username === 'admin') {return isset($this->$name) ? $this->$name : '属性未定义';} else {return '无权访问';}}}// 3. 访问类成员$obj = new Demo4('www.php.cn', '讲师');echo $obj->role;// 使用访问器方法//echo $obj->getRole();echo '<br>';//echo $obj->name;
属性重载魔术方法中的代码 return isset($this->$name) ? $this->$name : '属性未定义属性重载魔术方法中的代码 return isset($this->$name) ? $this->$name : '属性未定义 '其中$this->$name 跟一般的表述有所不同,一般会写成$this->name name之前是没有$的,不知道这是为什么?如果换成$this->name,在不传参情况下,返回“无权访问”,如果传参“?username=admin”,就会报错。看来正确的形式应该是$this->$name,但是不知道为什么?
a
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号