从PHP 5.1.0开始通过var_export()函数来访问类的静态方法__set_state的。这个方法的唯一参数是一个数组。和__clone不同的是__set_state可以接受参数。__clone()不能接受的参数。
案例一
- <?php
- class A
- {
- public $var1;
- public $var2;
- public static function __set_state($an_array) // As of PHP 5.1.0
- {
- $obj = new A;
- $obj->var1 = $an_array['var1'];
- $obj->var2 = $an_array['var2'];
- return $obj;
- }
- }
- $a = new A;
- $a->var1 = 5;
- $a->var2 = 'foo';
- eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
- // 'var1' => 5,
- // 'var2' => 'foo',
- // ));
- var_dump($b);
- ?>
案例二
- <?php
- class A {
- public static function __set_state($args) {
- $obj = new A();
- foreach($args as $k=>$v) {
- $obj->$k = $v;
- }
- return $obj;
- }
- }
- $a = new A;
- $a->name = 'cluries';
- $a->sex = 'female';
- eval('$b = ' . var_export($a, true) . ';');
- print_r($b);
- ?>
案例三
- class Test {
- public $a;
- static function __set_state($array) { //必须为静态方法.参数是个数组
- $tmp = new Test();
- $tmp->a = str_replace('$test','$b',$array['a']); //!important
- return $tmp; //必须返回一个对象.可以是其他类的对象
- }
- }
- $test = new Test();
- $test->a = '我是$test';
- eval( '$b = ' . var_export($test, true). ';' );
- var_dump($b); //得到的$b就是$test的复制.但是b做相应的改变b='我是$b'
然而克隆可以直接clone()方法。但和__set_state区别在于__set_state可以接受参数。__clone()不能接受的参数。
- class Test {
- public $a;
- function __clone(){//没有接受参数
- $this->a = str_replace("a","克隆a",$this->a); //无法通过参数改变a,但是我们还是可以想办法的:)
- }
- }
- $test = new Test();
- $test->a = '我是a';
- $b = clone $test;
- var_dump($b); //得到的$b就是$test的复制.并且a='我是克隆a'
相信你已经学会!