Blogger Information
Blog 35
fans 0
comment 1
visits 42596
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1. 构造方法 2.查询器:__get() 3.设置器:__set() 并创建一个php脚本进行正确的调用
魏先生的博客
Original
653 people have browsed it

实例

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

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post