//header(charset="utf8");
    //echo 'hey 这里是描述我对php 面向对象中各种魔术方法的认识。';
/*
 *魔术方法是在一些特定情况下会自动调用的一些php系统自定义函数
 *这些函数都很有个性,他们统一以__两个 _ (下划线)开头。
 * 下面对于php 中这些常用的魔术方法一些个人认识。
 **/
class demo {
    public $name;
    public $age;

//当实例化这个类,首先会自动调用的方法 __construct (构造函数)
//注意,在一些特定场合将构造函数写成了私有方法时,需要用静态方法实例化这个类
function __construct($name,$age){
    echo '实例化本类最先执行的函数
';
    $this->name = $name;    //这样以来相当于初始化了这个实例。
    $this->age  = $age;
}


//当对象被克隆时触发的函数 __clone()
function __clone(){
    echo '发现克隆体
';
}

//当我们访问一个不存在的或者无权限访问的属性时。触发函数 __get
//当访问private,protected等属性都会触发该函数
function __get($value){
    echo '你正要访问的'.$value.'属性无法访问
';
}

//设置属性与属性值,对已经存在的属性设置不会触发函数 __set
function __set($key,$value){
    echo "你所要设置的属性名为$key,属性值为$value
";
}

//当在一个未定义(包括 protected/private)的属性上调用 isset() 时,调用__isset()
function __isset($value){
    echo '你所访问的属性不存在
';
}


//在删除一个不可访问的属性时间触发 __unset()
function __unset($value){
    echo "你这要删除一个名为".$value."的属性
";
}



//析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。 __destruct(析构函数)
//可以说这个方法是在程序的最后面执行的
function __destruct(){
    echo '程序跑到尾声才触发的一个函数';
}
}
$demo = new demo('zhang','1');
//unset($demo->ss);//你这要删除一个名为ss的属性
//isset($demo->sss);//你所访问的属性不存在
//你所要设置的属性名为gender,属性值为nan
//$demo->gender = 'nan';    //不存在的属性出发__set 方法
//$demo->name = 'jian';    //已存在的属性直接设置。
//echo $demo->name;
//$demo->ss;//你正要访问的ss属性无法访问
//$demo1 = clone($demo);    //此时处罚了clone() 方法
?>