【发布时间】:2014-02-11 14:29:12
【问题描述】:
我知道有一个类似的帖子,但我尝试了他们的建议,但没有奏效。
在 php 中,当一个对象被序列化时,有一个选项在该类中定义魔术函数__sleep,它应该返回一个数组,其中包含将被序列化的所有对象属性的值。但是在 php.net 中写道,如果我们为从另一个类扩展的类的对象定义 __sleep 方法,那么我们不能在表示父类的私有属性的数组值中写入。问题是他们为这种情况提出了解决方案,而我并没有真正理解他们试图暗示什么。
这是写的:
注意:
__sleep() 不可能返回父类中私有属性的名称。这样做会导致 E_NOTICE 级别错误。相反,您可以使用 Serializable 接口。
这里是链接:http://www.php.net/manual/en/language.oop5.magic.php
另外,他们在this thread 中提出了一些我尝试过但没有成功的建议并发送给我:
注意:serialize(): "name" 作为成员变量从 __sleep() 返回,但在第 43 行的 C:\xampp\htdocs\questions\sleep_private_father.php 中不存在
这是脚本:
<?php
class a
{
private $name ;
private $age ;
function __construct($name, $age)
{
$this->name = $name ;
$this->age = $age ;
}
function __sleep()
{
$vec = array("name") ;
return $vec ;
}
}
class b extends a
{
private $last_name ;
function __construct($name, $age ,$last_name)
{
parent::__construct($name, $age) ;
$this->last_name = $last_name ;
}
function __sleep()
{
$array = parent::__sleep() ;
array_push( $array, 'last_name' );
return $array ;
}
}
$ob = new b("michal" , 26 , "smith") ;
var_dump($ob) ;
$ob_ser = serialize($ob) ;
var_dump(unserialize($ob_ser)) ;
?>
我也很好奇php.net建议使用serializble接口的方式。
【问题讨论】:
-
实施Serializable 是一个更好的方法。
-
你能看看我几分钟前发布的答案。我实现了可序列化,我是怎么做的对吗?
-
get_class检查有点像 IMO 的代码气味;我很想做这样的事情:codepad.org/JuPMm17T -
嗯,聪明。谢谢。我还添加了另一个解决方案
标签: php magic-methods