2017-05-26 146 views
1

关于PHP,有没有办法改变对象属性的顺序?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()方法过载,但这只是一种解决方法,而不是解决方案。

+0

我一直在使用'__invoke'但有人downvoted发布的解决方案。另一方面,不要你想那样做。 –

+0

__invoke不应该被用于这个目的 –

+0

请检查我的答案 - 我编辑它,并添加提及ArrayObject接口 –

回答

1

只需执行Iterator interface,就可以实现自己的方式来遍历对象。通过实现接下来的方法,并且当前你定义了如何获取当前元素以及如何获得下一个元素(但是你将必须实现所有方法)。

迭代使用

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

小心看到一些例子吗?你从上面的链接了解它吗?

。如果您想使用你的对象数组,检查ArrayObject interface或simplier使用ArrayAccess interface

+0

通过实现Iterator接口,我在技术上不必使用装饰器模式。但是..要跟踪我将不得不使用数组的信息。虽然这些属性有自己的顺序,我希望能够控制。 – Code4R7

+0

您只需要一个变量来定义您想要继续的订单($ attributeOrder)。然后,在next()方法中,您将遍历此数组,并在current()方法中返回所需属性的值(尊重$ attributeOrder)。在key()方法中,您定义了返回的键(同样来自$ attributeOrder) –

+0

对ArrayObject接口的第一条评论:“ArrayObject不是数组,因此您不能使用内置数组函数”。 ArrayAccess是ArrayObject的一部分,这让我想知道如何控制对象属性的实际顺序。我将如何在属性'$ a'和'$ b'之间插入'$ o-> ah = 1.5;'而不返回数组? – Code4R7