2013-02-10 108 views
3

考慮這個stripdown類:PHP對象爲JSON格式

class foo { 

    private $fooVar; 


    public getFooVar(){ 

    } 

} 


$fooObj = new foo(); 

想我想/需要做的就是它轉換爲JSON格式,所以我想過把

echo json_encode($fooObj); 

但它不工作的,我沒有fooVar和即時猜測,因爲$ fooVar是私人的。

任何其他方式我可以做到這一點,而不必妥協,並使$ fooVar公共?

非常感謝!

+0

您使用的是哪個版本的PHP?後來的PHP版本中有一些功能可以幫助您。 – Spudley 2013-02-10 10:18:14

+1

您是否考慮過在類中添加一個方法,以便您可以按照以下方式做一些事情: 'echo $ fooObj-> getJson();' – 2013-02-10 10:30:37

+0

感謝所有答案,我只是要實現jsonserializable接口!乾杯! – 2013-02-10 15:39:36

回答

3

如果你使用PHP 5.3(或更早),你不能真正做到你很容易要求什麼。由於JSON是一種數據格式,不包含函數,因此您將無法獲得JSON編碼的方法,並且您不會獲取該屬性,因爲它是私有屬性。你已經知道了這一點,但值得重新指出你是對的,這並不容易。即使將吸氣劑寫成魔術__get()方法將其變爲只讀公共屬性,在這種情況下也不起作用。

在PHP 5.3中,可以使用幾種解決方法。

  • Reflection。 PHP包含一個Reflection API,它允許您訪問有關對象和類的詳細信息,包括從私有成員讀取值。然而,很顯然,這意味着寫一小段代碼來獲得價值,而且它也不會很快。

  • 在班級內寫下json_encode調用。這樣你可以包括私人財產。我建議在對象內部使用get_object_vars($this)以JSON友好的方式訪問私有屬性。

如果你使用PHP 5.4,你有一個附加選項:

  • PHP 5.4引入了JsonSerializable接口。將implements JsonSerializable添加到您的班級,並編寫一個名爲jsonSerialize()的方法。這個方法應該返回你想要在JSON字符串中的數據。你可以包括或排除你想要的任何公共或私有財產。

PHP 5.5還尚未公佈,但它會增加你的另一種選擇:

  • PHP 5.5將引入更復雜的語法定義屬性,這將允許您定義屬性作爲公共的但是隻讀的,或者爲它們在getter和setter中包含更復雜的邏輯,但仍然將它們作爲屬性。它的工作原理與現在的 __get()__set()方法非常相似,但是將變量明確定義爲屬性,這意味着它們應該可以被JSON序列化程序訪問,而當前它們不是 __get()
    [編輯] - 注意,上述段落不正確;所描述的功能並沒有進入PHP 5.5版本。尚不清楚是否會進入5.6。

希望有幫助。

0

這將打印一個JSON所有foo類的屬性(公共,私有和受保護)的:

$reflection = new ReflectionClass('foo'); 
$properties = $reflection->getdefaultProperties(); 

echo json_encode($properties); 
1

對於自定義類型,JSON解碼有點棘手,因爲您沒有關於JSON類型的信息。你所擁有的只是泛型對象(哈希表)和數組。

但是要將對象序列化爲JSON,可以實現JsonSerializable接口。然後json_encode函數會做你想要的。