2010-05-22 80 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