我知道有一個類似的線程,但我已經嘗試了他們的建議,它沒有工作。魔術功能__sleep不能返回私有屬性
在php中,當一個對象被序列化時,有一個選項可以在該類中定義魔術函數__sleep
,它應該返回一個包含所有要被序列化的對象屬性值的數組。但是在php.net中寫道,如果我們爲一個從另一個類擴展的類的對象定義__sleep
方法,那麼我們不能寫入代表父類的私有屬性的數組值。問題是他們爲這種情況提出了一個解決方案,我並沒有真正理解他們想要暗示的內容。
這裏是寫的是:
注:
這是不可能的__sleep()在父類返回私有屬性的名稱。這樣做會導致E_NOTICE級別錯誤。相反,你可以使用Serializable接口。
這裏是鏈接:http://www.php.net/manual/en/language.oop5.magic.php
此外,在this thread他們建議的東西,我想和它不工作,送我:
注意:序列化()「的名字「作爲__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接口](http://uk3.php.net/manual/en/class.serializable.php)是一個更好的要走的路。 – cmbuckley
你能看看我幾分鐘前發佈的答案嗎?我實現了可序列化,是不是我做到了? – user3021621
'get_class'檢查有點代碼味道IMO;我很想做這樣的事情:http://codepad.org/JuPMm17T – cmbuckley