小结:
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