【问题标题】:How to get the hierarchical order of properties with get_object_vars?如何使用 get_object_vars 获取属性的层次顺序?
【发布时间】: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 不能完成工作。也不清楚为什么你需要那个。

标签: php arrays class oop step


【解决方案1】:

有什么办法可以实现吗?

目前尚不完全清楚您到底需要什么(以及您的动机是什么,如果知道提供具体建议会很高兴),但您可以使用PHP Reflection 来寻找。

您可以通过获取所有祖先类直到根类,然后读取所有这些类的所有属性。查看 ReflectionClass 类及其 ReflectionClass::getDefaultProperties() 方法。

也可以看看

希望这对您有所帮助,如果您遇到任何问题,请告诉我。

Example:

<?php

class root {
   public $property = 1;
}

class parentClass extends root {
   public $ads = FALSE;
}

class child extends parentClass {
   public $child = TRUE;
}

$class = 'child';

$chain = array_reverse(class_parents($class), true) + [$class => $class];

$props = [];

foreach($chain as $class)
{
     $props += (new ReflectionClass($class))->getDefaultProperties();    
}

print_r($props);

程序输出:

Array
(
    [property] => 1
    [ads] => 
    [child] => 1
)

【讨论】:

  • 谢谢,我会努力实现的。我只是希望这不会太慢,因为该文件可以包含数百万个对象!
  • 好吧,那么你应该把它缓存起来。每个类只需要一点内存,我敢打赌你没有一百万个不同的类,对吧?
  • 问题是getDefaultProperties() 也获得了所有继承的属性。
  • @crush:在这种情况下,您只需要联合,PHP 就不会覆盖父项,因此这些重复项实际上不是问题。否则:我在问题下方评论中的链接显示了如何减去这些以防需要。
  • 好吧,一旦你构建了这 1000 个定义,就可以使用 var_export 将它们存储到磁盘中。我不认为这是一个很大的开销。当然这是一些工作要做,但没有什么会让你的日常工作死亡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2010-12-18
  • 1970-01-01
  • 2022-01-03
  • 2021-05-12
  • 2011-05-12
  • 2015-01-10
相关资源
最近更新 更多