Correction status:qualified
Teacher's comments:
<?php /* * 要求: * 1.类声明代码应该单独创建一个php文件 * 2.类名必须要与类文件名一致 * 3.命名空间我们还没学 先不说了 * * 当前共有5个成员:3个属性,2个方法 * * 属性就是类中声明的变量,命名规则与普通变量完全一致 属性就是变量 * 方法就是类中声明的函数,与普通的函数的命名与使用规则完全一样 方法就是函数 * 由于定义在类中,所以与普通变量与函数相比,有一些特殊地方,例如访问控制 * 类成员访问控制,也叫外部可见性,目前不可限制外部访问,统一设置为public(默认) * */ //public 为公共的 class NicePet{ //类属性:$name 姓名 public $name = '八顿'; public $age = 3; public $color = ['black','red','blue']; //获取名字和岁 public function getInfo($name='',$age=0){ $this->name = empty($name) ? $this->name : $name; $this->age = ($age==0) ? $this->age : $age; return '姓名是'.$this->name.', 年龄是'.$this->age; } //获取颜色 public function getColor($color = []){ $this -> color = empty($color)? $this->color :$color; return '第一个颜色是'.$this->color[0].',第二个颜色是'.$this->color[1].',第三个颜色是'.$this->color[2]; } }
点击 "运行实例" 按钮查看在线实例
<meta charset="UTF-8"/> <?php require './class/pet.php'; //创建必须new一下生成类 $pet = new NicePet(); $pet -> name = '金毛'; $pet -> age = 66; $pet -> color = ['黄色','绿色','白色']; //访问属性 echo '<p>姓名: ',$pet -> name, '</p>'; echo '<p>年龄: ',$pet -> age, '</p>'; echo '<p>毛色: ',print_r($pet -> color,true), '</p>'; echo '<hr>'; //访问方法 //不传参数是默认值,传的话是当前传的值 echo $pet->getInfo().'<br>'; echo $pet->getInfo('小黄',5); echo '<hr>'; echo $pet->getColor().'<br>'; echo $pet -> getColor(['黑','蓝','红']);
点击 "运行实例" 按钮查看在线实例
基本的操作.
<?php class NicePet2{ //私有属性 private $name = ''; private $age = 0; private $color= []; public function __construct($name,$age,array $color){ //初始化类方法成员 $this -> name = $name; $this -> age = $age; $this -> color= $color; } //得到getName public function getName($yourName=''){ //创建方法内部变量(局部变量),用来保存要返回的信息 $msg = '非法访问'; if (!empty($yourName) && $yourName != '泰迪') { $msg = $this->name; } return $msg; } //查询器: getAge() 获取女友年龄 public function getAge() { //返回当前对象的age属性值 // return $this->age; //下面是改写一下当前方法,加入一些逻辑判断,仅做演示,实际功能自己扩展 $msg = $this->age; if ($msg >= 20) { $msg .= ', 这是死狗吧'; } elseif ($msg < 2) { $msg .= '太小了,自己养吧~~'; } return $msg; } //查询器: getColor() 获取女友身材信息 public function getColor() { //返回当前对象的$stature属性值 return $this->color; } //setName 修改器 public function setName($value='') { return $this->name = $value; } public function setAge($value) { //年龄必须在1~40之间 if (in_array($value,range(1,40))){ $this->age = $value; } } }
点击 "运行实例" 按钮查看在线实例
<meta charset="UTF-8"/> <?php require './class/pet2.php'; $pet2 = new NicePet2('小黄',2,['黑','蓝','白']); echo '<p>', $pet2->getName(),'</p>'; //你的姓名为空则禁止访问 echo '<p>', $pet2->getName('泰迪'),'</p>'; //泰迪禁止访问 echo '<p>', $pet2->getName('藏獒'),'</p>'; //允许访问 //下面用查询器来获取其它二个属性 echo '<p>',$pet2->getAge(),'</p>'; echo '<p>',print_r($pet2->getColor(),true),'</p>'; //下面用设置器修改对象属性name的值 $pet2->setName('大绿'); //使用姓名查询器查看新值 echo '<p>', $pet2->getName('明星狗'),'</p>';
点击 "运行实例" 按钮查看在线实例
正常的查询器和修改器,用构造函数,不用魔术变量
<?php /* * 1.类魔术方法:__get(),__set()实现属性查询器和设置器 * 2.魔术方法之前介绍过了,需要特定场景触发,由对象自动调用 * 3.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发 * 4.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发 * 5.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口 */ class GirlFriend3 { //声明属性 private $name; private $age; private $stature; private $data=[]; //构造方法 public function __construct($name='',$age=0,array $stature=[]) { $this->name = $name; $this->age = $age; $this->stature = $stature; } //魔术方法:查询器 public function __get($name) { // return $this->$name; //加入检测:访问不存在的属性时给出提示信息 // return isset($this->$name)?$this->$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) { //不做检测直接设置 // $this->$name = $value; //完善设置器,实现对不存在属性的创建 //如果访问的是已存在的属性,则直接输出 if (isset($this->$name)) { $this->$name = $value; //输出属性 } else { //如果属性不存在,则创建它并保存到类属性$data数组中 $this->data[$name] = $value; } } }
点击 "运行实例" 按钮查看在线实例
<meta charset="UTF-8"/> <?php /* * 魔术方法:_get()和__set() */ require './class/GirlFriend3.php'; $girlfriend3 = new GirlFriend3('如花姐姐',20,[120,130,150]); //测试魔术方法__get() echo '姓名: ',$girlfriend3->name,'<br>'; echo '年龄: ',$girlfriend3->age, '<br>'; echo '三维: ', print_r($girlfriend3->stature,true), '<br>'; //获取一个不存在的属性 echo '爱好:', $girlfriend3->hobby, '<br>'; echo '<hr>'; //测试魔术方法: __set() $girlfriend3->name = '奶茶妹妹'; $girlfriend3->age = 28; $girlfriend3->stature = [85,85,88]; echo '姓名: ',$girlfriend3->name,'<br>'; echo '年龄: ',$girlfriend3->age, '<br>'; echo '三维: ', print_r($girlfriend3->stature,true), '<br>'; //给一个不存在的属性赋值,类中并无hobby字段 $girlfriend3->hobby = '购物'; //非常诡异的事情发生了,居然可以给一个不存在的字段,赋值,并且还能顺利的获取到,仿佛这个字段真实存在一样 echo '爱好:', $girlfriend3->hobby, '<br>'; //真实的情况是: 给一个不存在的对象属性赋值,的确会自动添加一个新属性到类中,这个特性听上去似乎不太好,但有时却很有用 //因为我们可以事先创建一个类属性,专门用来收集用户自定义所数据,增加类的功能 //使用类属性设置器__set()再创建一个新属性 $girlfriend3->email = 'milk_tea@php.cn'; //直接查看用户自定义的类属性$data数组的内容,此时会输出二个自定义数据 echo '用户自定义属性<pre>'.print_r($girlfriend3->data,true).'</pre>';
点击 "运行实例" 按钮查看在线实例
__get()和__set魔术方法大大提高了效率.直接就可以用很方便