2010-05-22 75 views
1

我希望我的所有對象都能夠返回自己的JSON字符串。PHP:如何從基礎對象的方法訪問子屬性?

所以我創造了我所有的對象擴展的基類,有一個AsJSON()方法:

 
class BaseObject { 

    public function AsJSON() 
    { 
     $JSON=array(); 
     foreach ($this as $key => $value) 
     { 
      if(is_null($value)) 
      continue; 
      $JSON[$key] = $value; 
     } 
     return json_encode($JSON); 
    } 
} 


然後我的子類的擴展:

 
class Package extends BaseObject { 
    ... 
} 


所以在我的代碼中,我期望這樣做:

 
$Box = new Package; 
$Box->SetID('123'); 
$Box->SetName('12x8x6'); 
$Box->SetBoxX('12'); 
$Box->SetBoxY('8'); 
$Box->SetBoxZ('6'); 
echo $Box->AsJSON(); 


但是它返回的JSON字符串只包含BaseClass的屬性,而不是子屬性。

如何修改我的AsJSON()函數,以便$ this引用孩子的屬性,而不是父級的?

+0

爲什麼一定要BaseClass的在首位的方法?使用get_object_vars()或reflection可以在另一個類/方法/函數中實現它。這樣你就可以輕鬆地在JSON/BSON/XML/YAML /其他之間切換。 – VolkerK 2010-05-22 08:34:31

+0

因爲這些屬性是私人的,並且不在課堂以外訪問。通常,這些屬性是通過$ Object-> GetSomething()來訪問的。而不是直接訪問該屬性。 – Nick 2010-05-22 09:19:42

回答

4

可以使用get_object_vars()訪問所有成員變量:

foreach (get_object_vars($this) as $name => $value) ... 
+0

get_object_vars($ this)在功能上等同於$ this,它可以訪問什麼?如果子類的屬性是私有的,那麼$ this和get_object_vars($ this)都不能從父類訪問它們。如果我將子類中的屬性更改爲protected,那麼$ this和get_object_vars($ this)都可​​以工作。所以我認爲答案是讓所有孩子的財產受到保護,而不是私人的。 – Nick 2010-05-22 09:25:42

+1

噢,你沒有提及他們被聲明爲類的成員(我認爲你只是通過將它們分配給對象來添加隨機成員)。如果成員在類中聲明,如果你想要,它們必須至少受到保護從父母訪問它們。 – soulmerge 2010-05-22 10:05:03