<?php
//克隆clone()函数
class human{
public $age=20;
public function __clone(){
echo '有人在克隆我';
}
}
$lisi= new human();
$wangwu= clone $lisi;
//__get()函数
class human{
private $money =33;
protected $age =23;
public $name ='lily';
public function __get($p){
echo '你想访问我的',$p,'属性'// 其中的$p是可以随便替换的
}
}
$lily = new human();
echo $lily->name;// lily
echo $lily->money;//你想访问的money属性
echo $lily->friend;//你想访问我的friend属性————流程 $lily->friend->没有此属性->__get('friend');
echo $lily->age;// 你想访问我的age属性
/*
可以总结出:当我们调用一个权限上不允许调用的属性时,__get()魔术方法会自动调用别且自动传参,本例中的
参数值是age
age的属性无权调用时,则自动调用__get()方法,且把age以参数的形式传给__get()
*/
//set()函数
class stu{
private $money = 30;
protected $age= 23;
public $name='hmm';
public function __set($a,$b){
echo '你想设置我的',$a,'属性';
echo '且值是',$b,'<br>';
}
}
$hmm=new stu();
$hmm->aaa=111;// 你想设置我的aaa属性且值是111 stu Object ( [money:private] => 30 [age:protected] => 23 [name] => HM )
$hmm->age=36; //你想设置我的age属性且值是36 stu Object ( [money:private] => 30 [age:protected] => 23 [name] => HM )
$hmm->money=66; //你想设置我的money属性且值是66 stu Object ( [money:private] => 30 [age:protected] => 23 [name] => HM )
$hmm->name='HM';//你想设置我的name属性且值是H stu Object ( [money:private] => 30 [age:protected] => 23 [name] => HM )
print_r($hmm); //你想设置我的aaa属性且值是111 stu Object ( [money:private] => 30 [age:protected] => 23 [name] => HM )
/*
__set()的总结
当为无权操作的属性或不存在的属性赋值时,set调用
且自动传两个参数:属性和属性值,例 $hmm->age=36;无权->调用__set('age',28)
*/
///// __isset __unset
echo '<hr>';
class dog{
public $leg=4;
protected $bone='骨头';
public function __isset($p){
echo '你想判断我的',$p,'属性存不存在';
return 1;// 加上return无论判断什么都会返回存在这个属性
}
public function __unset($p){
echo '你想去掉我的',$p,'?';
}
}
$hua= new dog();
if(isset($hua->leg)){// 有没有leg属性呀,用 isset判断一下 isset($hua->leg),如果(if)有,则echo
echo $hua->leg;
}
if(isset($hua->tail)){
echo $hua->tail;
}else{
return; //你想判断我的tail属性存不存在
}
/*
__isset()的方法
当isset判断对象不可见的属性时(protected/private/不存在的属性)
会引发__isset()来执行
问 isset($obb->xyz)属性,为真
能说明类声明了一个xyz的属性吗?
答不能,return1;起到保护作用
*/
//unset()
print_r($hua);//dog Object ( [leg] => 4 )
unset($hua->leg);
unset($hua->bone); // 因为bone是受保护的,不能unset,会提示错误Cannot access protected
//因此在声明对象的是加上public function __unset($p){echo '你想去掉我的',$p;}
print_r($hua);// dog Object ( )
/**
unset()方法
当时unset销毁对象的不可见属性(private/protectes/不存在的属性)会引发unset
__unset(),会传参
**/