14-3魔术方法__get()和__set()–PHP实战开发教程

14-3魔术方法__get()和__set()–PHP实战开发教程

懈惨绣不焙惠恋降疆谩限刻吾


1.类魔术方法:__get(),__set()实现属性查询器和设置器
2.魔术方法之前介绍过了,需要特定场景触发,由对象自动调用
3.__get($name): 外部通过对象获取对象私有属性或不存在的属性时自动触发
4.__set($name,$value):外部设置私有属性或不存在属性值的时候自动触发
5.魔术方法可以适用于所有存在或不存在的类属性,不需要再为每个属性创建对应的访问接口


新建GirlFriend3.php 和demo3.php

14-3魔术方法__get()和__set()–PHP实战开发教程第1张

GirlFriend3.php:

<?php
class GirlFriend3
{
    //php是弱类型的语言,可以给$name指定为空字符串提示php类型为字符型
    //private:访问控制符:私有的,只允许在当前类中被访问,外部不能访问
    private $name="";
    private $age=0;
    private $stature=[];

    //声明一个构造方法:在实例化的时候自动调用
    //构造方法:对对象的属性进行初始化(还有其他的用法)
    //array:数组参数可以在前面加array,不加也可以
    public function __construct($name,$age,array $stature)
    {
        $this->name=$name;
        $this->age=$age;
        $this->stature=$stature;
    }



}

demo3.php

<?php
require "./class/GirlFriend3.php";

$girfriend3=new GirlFriend3('冰冰姐',28,[90,95,98]);

echo $girfriend3->name;

执行,此时访问私有属性被拒绝

14-3魔术方法__get()和__set()–PHP实战开发教程第2张

在类中添加魔术方法__get()

<?php
class GirlFriend3
{
    //php是弱类型的语言,可以给$name指定为空字符串提示php类型为字符型
    //private:访问控制符:私有的,只允许在当前类中被访问,外部不能访问
    private $name="";
    private $age=0;
    private $stature=[];

    //声明一个构造方法:在实例化的时候自动调用
    //构造方法:对对象的属性进行初始化(还有其他的用法)
    //array:数组参数可以在前面加array,不加也可以
    public function __construct($name,$age,array $stature)
    {
        $this->name=$name;
        $this->age=$age;
        $this->stature=$stature;
    }
//    查询器:__get()
//    双下划线开始的叫魔术方法,由系统直接调用
//    当读取一个没有权限访问的属性时,会自动触发这个魔术方法
    public function __get($name)
    {
        return $this->$name;
    }


}

执行:

14-3魔术方法__get()和__set()–PHP实战开发教程第3张

还可以设置访问条件,如$name不为空,且不为西门庆


设置器

修改类文件

<?php
class GirlFriend3
{
    //php是弱类型的语言,可以给$name指定为空字符串提示php类型为字符型
    //private:访问控制符:私有的,只允许在当前类中被访问,外部不能访问
    private $name="";
    private $age=0;
    private $stature=[];

    //声明一个构造方法:在实例化的时候自动调用
    //构造方法:对对象的属性进行初始化(还有其他的用法)
    //array:数组参数可以在前面加array,不加也可以
    public function __construct($name,$age,array $stature)
    {
        $this->name=$name;
        $this->age=$age;
        $this->stature=$stature;
    }
//    查询器:__get($name)
//    双下划线开始的叫魔术方法,由系统直接调用
//    当读取一个没有权限访问的属性时,会自动触发这个魔术方法
    public function __get($name)
    {
        return $this->$name;
    }

//    设置器__set($name,$value)
    public function  __set($name,$value)
    {
        //如果是对age属性进行修改
        if($name=='age')
        {
            if(in_array($value,range(14,120)))
            {
                $this->$name=$value;
            }
        }
        else
        {
            $this->$name=$value;
        }


    }

}

demo3.php

<?php
require "./class/GirlFriend3.php";

$girfriend3=new GirlFriend3('冰冰姐',28,[90,95,98]);

$girfriend3->age=35;//设置年龄为35
echo $girfriend3->age;

执行:

14-3魔术方法__get()和__set()–PHP实战开发教程第4张


非法数据:

修改demo3.php:

<?php
require "./class/GirlFriend3.php";

$girfriend3=new GirlFriend3('冰冰姐',28,[90,95,98]);

$girfriend3->age=5;//设置年龄为5
echo $girfriend3->age;

执行:

14-3魔术方法__get()和__set()–PHP实战开发教程第5张


卢踌坤驮翠导桐辰籍拆谁纤察