标签:php 对象 魔术方法
<?php header(‘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.是在直接使用echo print printf输出一个对象引用时,自动调用的方法 * 2.将对象的基本信息放在__toString()方法内部,形成字符串返回。 * 3.__toString()方法中不能有参数。 * * 克隆对象 * 1.使用clone这个关键字复制一个对象 * * __clone()魔术方法 * 1.是在克隆对象时自动调用的方法 * 2.作用:和构造方法一样,是对新克隆的对象进行初始化 * * __call() * 1.就是在调用一个对象中不存的方法时,自动调用的方法 * 2.有两个参数,第一个参数是,调用的不存在的方法的方法名,第二个参数是调用不存在的方法的方法参数 * 作用: * 1.可以写提示信息 * 2.将方法的功能相似,但方法名还要不同的,就可以采用这个方式来完成 * * * 对象串行化 (序列化) * 1.将对象转成字符串---串行化 * __sleep() * 作用: * 可以设置需要串行化的对象的属性 * 只要在这个方法中,返回一个数组,在数组中声明了那个属性名,那个属性名就会被串行化。 * 没有声明的属性名,不串行化 * 默认这个方法,全部串行化 * 2.将字符串转成对象---反串行化 * __wakeup() 在反串行化时自动调用 * 作用: * 对象串行化的对象回来后,进行对象的初始化,相当于__construct() * serialize() 函数会检查类中是否存在一个魔术方法 __sleep() 如果存在,该方法会先被调用,然后才执行序列化操作 * 注意(串行化时机) * 1.将对象需要进行网络传输时。 * 2.将对象持久保存时。 * * 数组串行化 json ----javascript object notation * * 1.eval()函数--检查并执行PHP代码 * $str = "echo ‘abc‘ ;"; * eval($str); */ class Person{ 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 ($args as $arg) echo $arg."<br/>"; }else{ echo "您调用的方法{$method}()不存在"; } } static function __callstatic($method,$args){ echo "您调用的静态方法{$method}不存在"; } function say() { echo ‘我是津沙港湾<br/>‘; } //串行化 serialize时调用 function __sleep(){ echo ‘指定串行化的对象属性名<br/>‘; return array(‘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导出类信息 static function __set_state($arr){//参数是数组 echo ‘var_export导出类信息时自动调用<br/>‘; $p = new Person("小状元", 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 = new Person(‘津沙港湾‘,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‘ => int 32 public ‘sex‘ => string ‘male‘ (length=4) */ //变成一个对象 echo $parr->name; //转成数组 要加第二个参数true $parr = json_decode($str,true); var_dump($parr); //var_export __set_state() $p = new Person("津沙港湾", 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;
本文出自 “津沙港湾” 博客,请务必保留此出处http://11410485.blog.51cto.com/11400485/1844991
标签:php 对象 魔术方法
原文地址:http://11410485.blog.51cto.com/11400485/1844991