魔术方法 __get(),__set(),__isset(),__unset()

<?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(),会传参
**/
posted @ 2013-12-03 23:47  long896130895  阅读(303)  评论(0编辑  收藏  举报