2017-05-26 92 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