博客列表 >1. 构造方法 2.查询器:__get() 3.设置器:__set() 并创建一个php脚本进行正确的调用

1. 构造方法 2.查询器:__get() 3.设置器:__set() 并创建一个php脚本进行正确的调用

魏先生的博客
魏先生的博客原创
2018年05月03日 18:19:15654浏览

实例

<?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魔术方法大大提高了效率.直接就可以用很方便

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议