【问题标题】:PHP: change order of object propertiesPHP:更改对象属性的顺序
【发布时间】:2017-05-26 11:43:35
【问题描述】:

关于PHP,有没有办法改变对象属性的顺序?

class o {public $a = 1, $b = 2;}
$o = new o;
foreach (get_object_vars($o) as $k => $v) {
  print $k . '->' . $v . PHP_EOL;
}

输出:

a->1
b->2

现有的公共变​​量可以是unset(),并添加例如与$o->c = 3;。但是array functions 不适用于对象,我不想将对象转换为某些 stdClass。

我能想到的唯一实用的解决方法是装饰一个数组对象并重载神奇的 __get()__set() 方法,但这只是一种解决方法,而不是解决方案。

【问题讨论】:

  • 我使用__invoke 发布了一个解决方案,但有人反对,你不想那样做吗。
  • __invoke 不应该用于此目的
  • 请检查我的答案 - 我对其进行了编辑并添加了有关 ArrayObject 接口的提及
  • 也许请更具体地说明您想要实现的目标。为什么要尝试将对象用作数组?

标签: php object-properties


【解决方案1】:

您可以通过实现Iterator interface 来实现自己的方式来迭代对象。通过实现 next 和 current 方法,您可以定义如何获取当前元素以及如何获取下一个元素(但您必须实现所有方法)。

供迭代使用

foreach ($o as $k => $v) {
  print $k . '->' . $v . PHP_EOL;
}

想看一些例子吗?你从上面的链接看懂了吗?

另一方面,如果您想将对象用作数组,请检查ArrayObject interface 或更简单的使用ArrayAccess interface

【讨论】:

  • 通过实现 Iterator 接口,我在技术上不必使用装饰器模式。但是..要跟踪信息,我必须使用数组。虽然属性有自己的顺序,但我希望能够控制。
  • 您只需要一个变量来定义您希望继续执行的顺序 ($attributeOrder)。然后在 next() 方法中,您将遍历此数组,并在 current() 方法中返回所需属性的值(尊重 $attributeOrder)。在 key() 方法中,您定义返回的键(同样来自 $attributeOrder)
  • 先评论ArrayObject接口:“ArrayObject不是数组所以不能使用内置数组函数”。 ArrayAccess 是 ArrayObject 的一部分,这让我想知道如何控制对象属性的实际顺序。如何在属性$a$b 之间插入$o->ah = 1.5;,而不恢复为数组?
  • 看起来像是在更改属性can not be done 的顺序。所以没有用例.. :-) 实现 ArrayObject 接口是下一个最好的事情。谢谢!
  • 它真正合乎逻辑 - 对象属性是用于编程语言目的的内部编程结构。如果您想要对属性进行任何类型的打印/查看,甚至是有序迭代,您应该使用一些业务层(映射器、视图等)将其包装到其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多