6.27 魔术方法

小结:

1.属性:public;protected;private;

2.魔术函数:__get;__set;__call;__tostring;__isset;__unset;__invoke

参考文档:

魔术方法:以两个下划线开始的,有触发条件 

访问修饰符:

三种:公开的(让任何人访问),被保护的(自身,子类父类可以访问),私有的(当前类可以访问)

$this定义变量名称

如果使用公共访问保护的和私人的属性并且赋值,是不能直接访问的 

__get魔术函数  访问不可以访问的属性时触发  比如protected private;    有一个形式参数

__set魔术函数 给不可以访问属性赋值时会触发;有形式参数比如pro_name   pro_var

判断属性是否存在property_exists

访问不可以访问属性是指:

1.属性不存在

2.属性不能访问:

例如:定义了一个类,类里面定义了一个方法,没有定义成员属性,但是输出一个没有定义的成员属性,实例化,赋值

这个时候

 会显示:

这个时候也会调用get方法

案例:访问不可以访问的属性,以及赋值的输出情况

例如定义公共属性 时,只定义了一个,但是实例化时赋值了两个  (包含被保护的属性进行赋值),这个时候会先进行访问公共属性是不是有,没有时,访问被保护的,并进行赋值,那么这个过程就触发了相应的魔术方法

有输出说明调用了

header('content-type:text/html;charset=utf-8');

class monkey{

    // 公有

    public $name;

    // 被保护

    protected $food;

    public function __construct($name,$food){

        $this->name=$name;

        $this->food=$food;

    }

    public function __get($pro_name){

        echo '<br> pro_name' .$pro_name;

        if(property_exists($this,$pro_name)){

            return $this->$pro_name;

        }else{

            return'没有这个属性';

        }

    }

    public function __set($pro_name,$pro_var){

        echo '<br> pro_name' .$pro_name.'pro_var'.$pro_var;

        if(property_exists($this,$pro_name)){

            return $this->$pro_name=$pro_var;

        }else{

            return'属性不存在';

        }

    }

       

}

// 实例化,直接复制,第一个给name,第一个给food

$monkey1=new monkey('妖猴','小孩');

// 让直接显示

echo '<br> 猴子名字' .$monkey1->name;

// 被保护不能直接访问,触发get条件即get魔术方法,没有直接执行

echo '<br> 猴子喜欢吃' .$monkey1->food;

// 修改猴子名字和食物

$monkey1->name='猴妖';

// 由于默认情况不能给protexted赋值,会触发set魔术方法

$monkey1->food='桃子';

echo '<br> 新的值 ';

echo '<br> 猴子名字' .$monkey1->name;

echo '<br> 猴子喜欢吃' .$monkey1->food;

__call魔术方法

调用一个对象不存在的方法或者权限不足(被保护或者私人,在类内部的)时会触发

例如:getname()方法没有定义,并不存在 

__tostring  打印对象时调用

对象不能直接echo输出会显示不出来,会触发tostring方法

__sleep: 

对象被串行化时(序列化) 

__wakeup:

对象被反串行化时(反序列化)

案例序列化:调用sleep方法

2项内容  name4个字符   name的内容张三6个字符  age3个字符  age 整型内容20(没有执行wakeup内容)

o:对象

6长度

3有3个内容

s字符串

4:属性长度

__clone :

类被克隆时会触发调用

class autofelix{

    public function __clone(){

        echo '类克隆调用';

    }

}

$a=new autofelix();

clone $a;

__isset  :

对不可访问属性进行isset,empty操作,就会触发

__unset  :

对不可访问属性进行unset操作就会触发

使用unsset函数销毁public成员属性可以直接销毁

使用unsset函数销毁protected,private成员属性会触发__unset函数

__invoke  

对象本身不能直接当作函数,对象被当作函数就会进行触发

面试问法:上面魔术方法什么时候被调用

https://avoid.overfit.cn/post/8497075756ae41feb0f5e4522dd8672d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值