2012-02-09 73 views
0

我開始學習PHP,並有一個體面的Java背景。我在PHP語言中遇到了以下編碼挑戰:PHP移動自定義Json編碼/解碼爲抽象類

我希望能夠以JSON格式對我的PHP類進行編碼/解碼。我已經創建了PHP類,它們爲類私有屬性使用了getter/setter方法。這導致本地json_encode方法在編碼期間跳過這些屬性。我發現下面的腳本,拿起私有屬性和格式化他們在一個JSON字符串:

<?php 
public function encodeJSON() 
{ 
    foreach ($this as $key => $value) 
    { 
     $json->$key = $value; 
    } 
    return json_encode($json); 
} 
public function decodeJSON($json_str) 
{ 
    $json = json_decode($json_str, 1); 
    foreach ($json as $key => $value) 
    { 
     $this->$key = $value; 
    } 
} 
?> 

我研究了這條代碼,並意識到它是如何生成的字符串和對象。現在我想將這些代碼推送到一個抽象類中,以便我可以擴展這個類並接收這個功能。

問題是我無法從抽象類中引用具體類中的私有屬性。我對Java的知識告訴我,如果不指定抽象方法並強制每個具體類實現它,我可能無法做到這一點。我嘗試了多次嘗試在PHP中使用反射,並將具體類傳遞給抽象類的構造函數。任何人都可以指向正確的方向,或者告訴我這是不可能的嗎?

+1

它是否適用於'protected'? (私有變量的概念不能在交付的類中看到它們,因此這是正確的行爲) – Vyktor 2012-02-09 12:07:29

+0

@Vyktor是的。我非常專注於學習新的東西,忘記了我的基本編程基礎。謝謝你挑選那個。如果您將其作爲答案發布,我會接受。 – 2012-02-09 12:13:17

回答

1

private variables的概念不能在交付的類中看到它們,因此它是正確的行爲。

如果您使用protected而不是您的概念應該工作得很好。

+0

再次感謝。我習慣於用Java語言對Jackson進行序列化和反序列化,這允許我將字段保留爲私有的,所以我忽略了範圍思想 – 2012-02-09 12:22:36

+0

PHP提供了兩種序列化方法,一種是實現'__sleep'和'__wakeup'(http: //sk.php.net/manual/en/language.oop5.magic.php#object.sleep)和「Serializable接口」(http://sk.php.net/manual/en/class.serializable.php)我們在這裏有很好的討論:http://stackoverflow.com/questions/9114368/transient-properties-in-a-php-class/9114433#9114433 – Vyktor 2012-02-09 12:35:07