说明魔术方法是在特定场景下不用调用就自动执行的方法。因为有了magicmethod,我们的类可以写的很灵活~__construct#构造方法,在类实例化时自动调用,一般用于初始化操作;__destruct#销毁方法,在对象被实例化时自动调用destroyed;__clone()#Clone方法,当对象被clone时,会自动调用__get($key)__set($key,$val)#属性设置方法,当对象设置一个受保护的或不存在的属性时,__set会被执行,传入要设置的属性名和属性值,注意这里的设置保持对象本身不变,除非改变操作发生在__set方法中;但无论如何,不??能为对象添加不存在的属性,只能对已有的属性进行操作;__isset($key)#当用isset判断一个对象是否有这个属性,这个属性被保护或者不存在时,会自动执行,并传入判断的属性名;__unset($key)#同上,当使用unset删除对象属性或不存在属性的保护时,会自动执行;__isset($key)#如果__isset方法返回值为true,那么对isset的判断将无效,不管这个类是否有判断属性,isset都会返回true;__call($method,$arguments)#当对象调用一个受保护的或者不存在的方法,会自动执行,传入两个参数。$method是方法,$arguments是方法的参数数组;__callStatic($method,$arguments)#当被保护的或者类中不存在的静态方法被调用时,会自动执行,传入两个参数$method作为方法,$arguments是方法的参数数组;注意,是一个静态方法,是php5.3中新增的魔术方法;__toString()#输出对象引用时自动调用;__invoke()#$obj=class();$obj()__sleep()#当类被序列化时调用__wakeup()#当类被反序列化时调用";}publicfunction__toString(){echo'哈哈哈,我是toString';返回$this->privateProperty;}publicfunction__invoke(){echo'类实例化为对象后,可以直接作为方法调用,调用的是我~';}publicfunctionfunc(){echo"Thisisanormalmethod
";}privatefunctionprivateFunc(){echo"Thisisaprotectedmethod
";}publicfunction__destruct(){echo"我是一个析构方法,当对象被销毁时(代码执行时,\$obj被赋值为NULL或unset),我会自动被调用
";echo"好像克隆对象的时候,我也会被自动执行
";}publicfunction__clone(){echo"我是一个克隆魔术方法,当对象被克隆时,我会自动执行。
";}publicfunction__get($key){echo"我是__get方法,当对象调用一个受保护的或不存在的属性时,我会被执行并传入调用的属性名->{$key}
”;}publicfunction__set($key,$val){echo"我是__set方法,当对象设置一个受保护或不存在的属性时,我会被执行,设置的属性名称为传入->\"{$key}\"和属性值->\"{$val}\";
<strong>注意这里的设置不会改变或增加对象本身的属性值
";/*__set方法的使用:1.使用该方法预留一个接口,有条件的2.在框架中,一般会private一个$data数组,使用set方法给它添加数组元素,然后对这个数组进行操作;*/}publicfunction__isset($key){echo"我是__isset方法。当isset判断对象的属性是否受保护或者不存在时,我会执行并传入判断的属性名->\"{$key}\"
";returntrue;}publicfunction__unset($key){echo"我是__unset方法。当unset对象被protected或者没有属性时,会执行I,传入要unset的属性名->\"{$key}\"
";}publicfunction__call($method,$arguments){echo"我是__call方法,当对象调用受保护或不存在的方法时,我会被调用,并传入两个参数,\$method---->\"{$method}\"(方法名);\$arguments---->(参数数组)";print_r($arguments);echo"
";}publicstaticfunction__callStatic($method,$arguments){echo"我是__callStatic方法。当我调用一个受保护的或类中不存在的静态方法时,我将使用两个参数\$method---->\"{$method}\"(方法名);\$arguments---->(parameterarray)";print_r($arguments);echo"注意:只有class::staticMethod,并且此方法仅在php5.3版本更新";echo"
";}}$obj=newmagic();#__invoke$obj();//这个在5.3之后会起作用相当于直接调用类中的__invoke()方法#__toString//如果没有__toString,会报错;classmagic的Objectcouldnotbeconvertedtostring//但是如果有__toString方法,不仅会调用toString方法,而且还会返回toString中返回的值;echo$obj;#__clone;//$obj1=clone$obj;#__get($key)获取受保护和不存在的属性↓↓;$obj->privateProperty;//调用受保护的属性;$obj->zxg;//调用不存在的属性;#__set($key,$val)设置受保护的不存在的属性↓↓:print_r($obj);echo"
";$obj->privateProperty="属性值已经通过__set方法改变了;";$obj->zxg="xgg";//属性确实不存在;print_r($obj);//$obj本身不会发生变化,除非变化操作发生在__set方法中;但无论如何,都不能给对象添加属性,只能对已有的属性进行操作;echo"
";#__isset($key)方法使用echoisset($obj->jyh)?"有jyh属性(其实没有这个属性,但是__isset方法返回true,所以是true)":"没有jyh属性";echo"
";#__unset($键)方法未设置($obj->zxg);#__call($method,$arguments)$obj->privateFunc('arg1','arg2','arg3');#__callStatic($method,$arguments)magic::zhouzhou(27,'pig');?>