2011-02-26 55 views
1

是否有可能像这样序列化对象,const属性?php serialize const

class A 
{ 
    const XXX = 'aaa'; 
} 

我猜不行,但是什么是解决方案?

+0

访问续您是否尝试过? – 2011-02-26 12:16:12

+0

是的,它nothig商店,只有公共道具 – kusanagi 2011-02-26 12:16:52

+0

为什么你想序列化const?你不能只访问它吗? – krtek 2011-02-26 12:18:32

回答

4

A const不是一个对象属性,它是一个类常量。也就是说,它适用于你的班级,而不是它的任何对象。这也是为什么你使用A::XXX而不是$this->XXX来引用类常量。

因此,您不能序列化const与您的对象,就像你不能序列化任何静态变量。

然而,当你反序列化对象,你会得到它作为类的一个实例,所以你可以参考常数使用类名:

$class = get_class(unserialize($A_obj)); 
echo $class::XXX; 
4

是可能的序列化和实例当然,该类包含const属性。

,在序列化的字符串const属性将不存在:没有必要为它,因为它是永恒的:当字符串将被解序列化,这将是你的类的实例 - 和,所以,从班级的定义中得到这种不变的财产。


序列化您的类的实例:

class A { 
    const XXX = 'aaa'; 
    function test() { 
     echo A::XXX; 
    } 
} 

$a = new A(); 
$str = serialize($a); 
var_dump($str); 

您将获得:

string 'O:1:"A":0:{}' (length=12) 

中不变的是不存在的序列化的字符串。


解串行作品:

$b = unserialize($str); 
var_dump($b); 


而且,如果你尝试调用该$b对象的方法,得到的磨片反序列化:

$b->test(); 

常数的确发现,因为它在你班级的定义中,你会得到:

aaa 
0
<?php 
class A 
{ 
    const XXX = 'aaa'; 

} 
$a = new A(); 
$b=serialize($a); 
$c=unserialize($b); // copy of the $a obj 

,但你可以通过这种方式A::XXX;