面向对象:类:构造器、__get查询器、__set设置器
类创建
<?php /* * 1.类魔术方法:__get(),__set()实现属性查询器和设置器 * 2.魔术方法之前介绍过了,需要特定场景触发,由对象自动调用 * 3.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发 * 4.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发 * 5.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口 * * public(公有) protected(受保护) private(私有) */ class GirlFriend { //1.声明属性 private $name; private $age; private $stature; private $data=[]; //2构造方法 public function __construct($name,$age,$stature,array $data=[]) { $this->name = $name; $this->age = $age; $this->stature = $stature; $this->data = $data; } //魔术方法:查询器 public function __get($name) { $msg = null; //如果类中添加一个自定义的数据收集器$data,就从这里取值 if (isset($this->$name)) { $msg = $this->$name; } else if (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; } } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
PHP脚本实现调用
<?php /** * 面向对象编程 * 魔术方法:_get() 和 _set() */ //导入类 require 'class/GirlFriend.php'; $GirlFriend = new GirlFriend('风一样的年纪',50,170,[80,85,90]); echo '姓名:',$GirlFriend->name,'<br>'; echo '年龄:',$GirlFriend->age,'<br>'; echo '身高:',$GirlFriend->stature,'<br>'; echo '三围:',print_r($GirlFriend->data,true),'<br>'; echo "<hr>"; //更新以上数据 $GirlFriend->name = '颖宝宝'; $GirlFriend->age = 30; $GirlFriend->stature = 160; $GirlFriend->data = [70,76,80]; //identity此字段是不存在的,也未声明过,居然也可以给一个不存在的字段,赋值,并且还能顺利的获取到,仿佛这个字段是真实存在一样 $GirlFriend->identity = '演员'; //真实的情况是: 给一个不存在的对象属性赋值,的确会自动添加一个新属性到类中,这个特性听上去似乎不太好,但有时却很有用 //因为我们可以事先创建一个类属性,专门用来收集用户自定义所数据,增加类的功能 echo "姓名:",$GirlFriend->name,'<br>'; echo "年龄:",$GirlFriend->age,'<br>'; echo "身高:",$GirlFriend->stature,'<br>'; echo "三围:",print_r($GirlFriend->data,true),'<br>'; echo "身份:",$GirlFriend->identity,'<br>'; //使用类属性设置器__set()再创建一个新属性 $GirlFriend->email = 'milk_tea@php.cn'; //直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据 echo '用户自定义属性:',$GirlFriend->email;
运行实例 »
点击 "运行实例" 按钮查看在线实例
效果预览图: