魔术方法 详解

/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/

<?php
/***************************************************************************************
时间:2012年11月13日 20:07:42
内容:魔术方法
                是指在某些情况些,会自动执行的方法,叫魔术方法
详解:
        __construct()
        __destruct()
        __clone()         
        __call()
        __callStatic()
        __get()
        __set()
        __isset()
        __unset()
***************************************************************************************/

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

//__clone  例子
class Human{
    public $age=22;
    public function __clone(){
        echo '有人克隆我!假冒 <br />';
    }
}
$lisi=new Human();
$zhangsan=clone $lisi;
/*
总结:__clone()的作用
    当clone的时候调用
*/



//__get 例子
class Human{
    public $name='覃唐弢';
    protected $age=21;
    private  $money='1.2w';
    public function __get($property){
        echo '你想访问我的',$property,'属性 ^_^<br />';
    }
}
$lisi=new Human();
echo $lisi->name,'<br />';
echo $lisi->age; //你想访问我的age属性 ^_^
echo $lisi->money; //你想访问我的money属性 ^_^
echo $lisi->friend; //没有次属性  ->你想访问我的friend属性 ^_^
/*
 总结:__get()的作用
    当我们调用一个权限上不允许调用的属性
    或不存在的属性时  调用
    __get魔术方法会自动调用
    并且自动传参,参数值是属性名
*/


//__set 例子
class Human{
    public $name='覃唐弢';
    protected $age=21;
    private  $money='1.2w';
    public function __set($key, $value){
        echo '你想设置属性:',$key,'  且值是:',$value,' ^_^<br />';
    }
}
$lisi=new Human();
$lisi->friend='itao'; //不存在的属性:你想设置属性:friend 且值是:itao ^_^
$lisi->name='my';
$lisi->age=22; //修改存在的protected属性值:你想设置属性:age 且值是:22 ^_^
$lisi->money='1.4w'; //修改存在的private属性值:你想设置属性:money 且值是:1.4w ^_^
/*
总结:__set()的作用
    当为无权限操作的属性赋值时
    或不存在的属性赋值时
    __set()自动调用

    且自动传2个参数 属性 属性值
*/


//__isset 例子
class Dog{
    public $leg = 4;
    public function __isset($p){
        echo '你想判断我的',$p,'属性是否存在<br />';
    }
}

$hu = new Dog();
if(isset($hu->leg)){
    echo $hu->leg,'<br />';
}

if(isset($hu->tail)){
    echo $hu->tail;
}else{
    echo '没有tail <br />';
}
/*
总结: __isset()的作用
当isset() 判断对象不可见的属性是(protected/private/不存在的属性)
会引起__isset()执行

问:isset($obj->aa)属性,为真,能说明 类声明了一个aa属性吗?
答:不能
*/


//unset 例子
class Dog{
    public $leg = 4;
    protected $bone='骨头';
    public function __unset($property){
        echo '你想去掉我的',$property,'<br />';
    }
}

$dog = new Dog();
echo $dog->leg,'<br />';
print_r($dog); echo '<br />';
unset($dog->leg);
print_r($dog); echo '<br />';

unset($dog->bone); //你想去掉我的bone

/*
总结: __unset
    当用unset 销毁对象的不可见对象时
    会执行 __unset
*/

//__call  _callStatic例子
class Human{
    public function hello(){
        echo 'hello........<br />';
    }
    protected function a(){
        echo 'a.......<br />';
    }
    private function t(){
        echo 't.....<br />';
    }
    //php5.3
    public static function __callStatic($method,$arguments){
         echo '有对象想调用不可见或不存在静态',$method,'方法<br />';
        echo '还传了参数<br />';
        print_r($arguments);
    }
    public function __call($method, $arguments){
        echo '有对象想调用不可见或不存在的',$method,'方法<br />';
        echo '还传了参数<br />';
        print_r($arguments);
    }
}

$lisi = new Human();
$lisi->hello();
$lisi->a();
$lisi->say(1);
//调用一个未定义的方法
//Fatal error: Call to undefined method Human::say()
Human::cry('痛哭','嚎哭','鬼哭');

/*
总结:__call
    当调用 不可见或不存在(protected/private/不存在的属性)
    的方法时,自动调用
    __call 会传入两个参数:
        第一个参数:方法名$method
        第二个参数:参数    $arguments[array]
 
 总结:__callStatic
    当调用 不可见或不存在(protected/private/不存在的属性)
    的[静态方法]时,自动调用
    __callStatic 会传入两个参数:
        第一个参数:方法名$method
        第二个参数:参数    $arguments[array]

__callStatic  是php5.3新增的魔术方法
*/

原文地址:https://www.cnblogs.com/qintangtao/p/2777800.html