<?phpheader('content-type:text/html;charset=utf-8');/**__construct()构造方法*在对象初始化时自动调用*__destruct()析构方法*在对象释放资源时自动调用*__get()取值*在取私有属性值时自动调用*__set()设置值*在设置私有属性值自动调用*__isset()判断值*在使用isset()判断私有属性是否存在时自动调用*__unset()释放值*在使用unset()释放私有属性时自动调用*__toString()用于一个类被当成字符串时应怎样回应*__call()在对象中调用一个不可访问方法时,__call()会被调用。*__callstatic()用静态方式中调用一个不可访问方法时,__callStatic()会被调用。::*__sleep()在串行化serialize时自动调用的方法*__wakeup()在反串行化时自动调用的方法*__set_state()当调用var_export()导出类时,此静态方法会被调用。*__invoke()当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。*__autoload()唯一一个在类外部进行定义自动加载只要在这个脚本中,需要加载类的时候(必须用到类名)就会自动调用这个方法。**魔术方法的总结:*1.自动调用,但不同的魔术方法,有自己的调用时机*2.都是以__开始的方法*3.所有的魔术方法,方法名都是固定的*4.如果不写,就不存在,也就没有默认的功能。**__toString()*1.是在直接使用echoprintprintf输出一个对象引用时,自动调用的方法*2.将对象的基本信息放在__toString()方法内部,形成字符串返回。*3.__toString()方法中不能有参数。**克隆对象*1.使用clone这个关键字复制一个对象**__clone()魔术方法*1.是在克隆对象时自动调用的方法*2.作用:和构造方法一样,是对新克隆的对象进行初始化**__call()*1.就是在调用一个对象中不存的方法时,自动调用的方法*2.有两个参数,第一个参数是,调用的不存在的方法的方法名,第二个参数是调用不存在的方法的方法参数*作用:*1.可以写提示信息*2.将方法的功能相似,但方法名还要不同的,就可以采用这个方式来完成***对象串行化(序列化)*1.将对象转成字符串---串行化*__sleep()*作用:*可以设置需要串行化的对象的属性*只要在这个方法中,返回一个数组,在数组中声明了那个属性名,那个属性名就会被串行化。*没有声明的属性名,不串行化*默认这个方法,全部串行化*2.将字符串转成对象---反串行化*__wakeup()在反串行化时自动调用*作用:*对象串行化的对象回来后,进行对象的初始化,相当于__construct()*serialize()函数会检查类中是否存在一个魔术方法__sleep()如果存在,该方法会先被调用,然后才执行序列化操作*注意(串行化时机)*1.将对象需要进行网络传输时。*2.将对象持久保存时。**数组串行化json----javascriptobjectnotation**1.eval()函数--检查并执行PHP代码*$str="echo'abc';";*eval($str);*/classPerson{public$name;public$age;public$sex;public$marr=array('eat','drink','song');//初始化时调用构造函数function__construct($name,$age,$sex){$this->name=$name;$this->age=$age;$this->sex=$sex;}//echo对象时调用function__toString(){return'本人的基本信息如下:我是津沙港湾,30岁,男性<br/>';}//clone对象时调用function__clone(){echo'克隆一个对象,this是一个副本<br/>';$this->name;$this->age=20;$this->sex;}/*//提示信息function__call($method,$args){echo'在调用一个对象中不存的方法时自动调用__call<br/>';echo"调用的方法{$method}(),参数为:";print_r($args);echo"不存在<br/>";}*///调用不同的方法名function__call($method,$args){if(in_array($method,$this->marr)){foreach($argsas$arg)echo$arg."<br/>";}else{echo"您调用的方法{$method}()不存在";}}staticfunction__callstatic($method,$args){echo"您调用的静态方法{$method}不存在";}functionsay(){echo'我是津沙港湾<br/>';}//串行化serialize时调用function__sleep(){echo'指定串行化的对象属性名<br/>';returnarray('name','age');//必须返回数组//指定只串行化name和age这个两个对象属性//O:6:"Person":2:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;}}//反串行化unserialize时调用function__wakeup(){echo'反串行化时自动调用<br/>';//反串行化时设置成员属性的值$this->age=43;}//var_export导出类信息staticfunction__set_state($arr){//参数是数组echo'var_export导出类信息时自动调用<br/>';$p=newPerson("小状元",33,"female");$p->name=$arr['name'];$p->age=$arr['age'];$p->sex=$arr['sex'];return$p;}//调用函数方式调用对象$p();function__invoke($a,$b,$c){echo'调用函数方式调用对象时自动调用'.$a.$b.$c.'<br/>';}}//原本$p=newPerson('津沙港湾',23,'男');//toString()echo$p;//__call()$p->eat('鱼','肉');$p->drink('茶','酒');$p->song('歌','戏');//副本__clone()$a=clone$p;echo$a->age;//serialize对象转成字符串$str=serialize($p);//O:6:"Person":4:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;s:3:"sex";s:3:"男";s:4:"marr";a:3:{i:0;s:3:"eat";i:1;s:5:"drink";i:2;s:4:"song";}}file_put_contents("MrYang.txt",$str);echo'对象串行化成功,保存到MrYang文件中';$arr=array('name'=>'津沙港湾','age'=>32,'sex'=>'male',);//数组串行化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"}$str=json_encode($arr);echo$str;//数组反串行化转成对象$parr=json_decode($str);var_dump($parr);//变成一个对象/*object(stdClass)[1]public'name'=>string'津沙港湾'(length=12)public'age'=>int32public'sex'=>string'male'(length=4)*///变成一个对象echo$parr->name;//转成数组要加第二个参数true$parr=json_decode($str,true);var_dump($parr);//var_export__set_state()$p=newPerson("津沙港湾",20,"male");//设定的属性可以传到$arr中去$p->name='火山岛';$p->age=500;$p->sex='male';eval('$b='.var_export($p,true).';');//加ture变成字符串var_dump($b);//类信息以__set_state()中设定值为准//调用函数方式$p(1,2,3);//__callstatic调用不存在的静态方法时自动调用Person::speak();//__autoload调用类中的方法时自动加载类文件function__autoload($classname){include$classname.'.class.php';}Test::laugh();

对象反串行化include'index.php';//读取文件内容字符串$str=file_get_contents('MrYang.txt');//反串行化字符串转成对象$p=unserialize($str);$p->say();echo$p->age;