PHP类魔术方法__set_state()

时间:2009-09-21 16:23 作者:php类 点击:
从PHP 5.1.0开始通过var_export()函数来访问类的静态方法__set_state的。这个方法的唯一参数是一个数组。和__clone不同的是__set_state可以接受参数。__clone()不能接受的参数。

  

从PHP 5.1.0开始通过var_export()函数来访问类的静态方法__set_state的。这个方法的唯一参数是一个数组。和__clone不同的是__set_state可以接受参数。__clone()不能接受的参数。

案例一

 

  1. <?php  
  2.  
  3. class A  
  4. {  
  5.     public $var1;  
  6.     public $var2;  
  7.  
  8.     public static function __set_state($an_array// As of PHP 5.1.0  
  9.     {  
  10.         $obj = new A;  
  11.         $obj->var1 = $an_array['var1'];  
  12.         $obj->var2 = $an_array['var2'];  
  13.         return $obj;  
  14.     }  
  15. }  
  16.  
  17. $a = new A;  
  18. $a->var1 = 5;  
  19. $a->var2 = 'foo';  
  20.  
  21. eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(  
  22.                                             //    'var1' => 5,  
  23.                                             //    'var2' => 'foo',  
  24.                                             // ));  
  25. var_dump($b);  
  26.  
  27. ?> 

案例二

 

  1. <?php  
  2.    
  3. class A {  
  4.     public static function __set_state($args) {  
  5.         $obj = new A();  
  6.         foreach($args as $k=>$v) {  
  7.              $obj->$k = $v;  
  8.         }  
  9.         return $obj;  
  10.     }  
  11. }  
  12.    
  13. $a = new A;  
  14. $a->name = 'cluries';  
  15. $a->sex = 'female';  
  16.    
  17. eval('$b = ' . var_export($a, true) . ';');  
  18.    
  19. print_r($b);  
  20. ?> 

案例三

 

  1. class Test {  
  2.         public $a;  
  3.         static function __set_state($array) {  //必须为静态方法.参数是个数组  
  4.                 $tmp = new Test();  
  5.                 $tmp->a = str_replace('$test','$b',$array['a']);  //!important  
  6.                 return $tmp;  //必须返回一个对象.可以是其他类的对象  
  7.         }  
  8. }  
  9. $test = new Test();  
  10. $test->a = '我是$test';  
  11. eval'$b = '  . var_export($test, true).  ';' );  
  12. var_dump($b);  //得到的$b就是$test的复制.但是b做相应的改变b='我是$b' 

然而克隆可以直接clone()方法。但和__set_state区别在于__set_state可以接受参数。__clone()不能接受的参数。

 

  1. class Test {  
  2.         public $a;  
  3.  
  4.         function __clone(){//没有接受参数  
  5.                 $this->a = str_replace("a","克隆a",$this->a);  //无法通过参数改变a,但是我们还是可以想办法的:)  
  6.         }  
  7. }  
  8. $test = new Test();  
  9. $test->a = '我是a';  
  10. $b = clone $test;  
  11. var_dump($b);  //得到的$b就是$test的复制.并且a='我是克隆a' 

相信你已经学会!


标签(Tag):__set_state()
------分隔线----------------------------
推荐内容
热点内容