2017-05-26 64 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-> ah = 1.5;'をプロパティに '$ a'と' $ b'の間に挿入するにはどうすればいいですか? – Code4R7

関連する問題