【发布时间】:2013-07-01 14:09:34
【问题描述】:
我有一些相互扩展的类,每次都添加更多属性。
现在我需要获取一个类的所有属性的列表,但要按照它们被声明的顺序,首先是父类的属性。
例如:
class foo {
public $a = 1;
public $c = 2;
public $d = 3;
}
class foo2 extends foo {
public $b = 4;
}
$test = new foo2;
var_dump(get_object_vars($test));
这给出了:
array(4) { ["b"]=> int(4) ["a"]=> int(1) ["c"]=> int(2) ["d"]=> int(3) }
但我想要:
array(4) { ["a"]=> int(1) ["c"]=> int(2) ["d"]=> int(3) ["b"]=> int(4) }
有什么办法可以实现吗?
更新: 我需要这个的原因是因为我正在转换一个使用 STEP (EXPRESS ISO 10303-21) 格式的文件(然后返回!)。 (有关更多信息,请参阅此:http://en.wikipedia.org/wiki/ISO_10303-21)这种格式是某种序列化对象结构。我在 PHP 中重新创建了所有对象类,但由于在 STEP 中属性的顺序至关重要,因此我需要完全相同的属性顺序。
【问题讨论】:
-
d 是第一个,因为它在后代上。把它放在父母身上,它会是第一个。否则,您需要手动重新排序数组。
-
为什么顺序如此重要?你仍然可以直接访问 $d: $test->d
-
我意识到这可能无助于回答这个问题,但出于好奇,如果你能够简洁地做到这一点,你能提供你的用例吗?我无法想象你为什么要这样做,我想知道你想要这样做的事实是否表明你已经在以“错误”的方式做某事。
-
一种解决方案是将继承链遍历到最早的祖先,然后反向遍历它,将属性添加到数组中。
-
回答你的问题,如果你需要基于继承的顺序,你需要遍历每个反射的继承。另请参阅:stackoverflow.com/questions/11821137/… - 请编辑您的问题示例,因为到目前为止您已经证明您使用的是 wrong 方法。提出问题不仅仅是抱怨函数 xy 不能完成工作。也不清楚为什么你需要那个。