2017-05-26 6 views
1

En ce qui concerne PHP, y a-t-il un moyen de changer l'ordre des propriétés de l'objet?PHP: changer l'ordre des propriétés de l'objet

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

sortie:

a->1 
b->2 

variables publiques existantes peuvent être unset(), et ajoutée, par exemple avec $o->c = 3;. Mais array functions ne fonctionne pas avec les objets, et je ne veux pas convertir l'objet en stdClass. La seule solution pratique que je peux penser est de décorer un objet tableau et de surcharger les méthodes magiques __get() et __set(), mais c'est juste une solution de contournement, pas une solution.

+0

j'avais posté une solution en utilisant '__invoke' mais quelqu'un downvoted, ne pas vous voulez le faire comme ça. –

+0

__invoke n'est pas censé être utilisé à cette fin –

+0

s'il vous plaît vérifier ma réponse - je l'ai édité et ajouté une mention sur l'interface ArrayObject –

Répondre

1

Vous pouvez implémenter votre propre méthode d'itérer sur un objet en implémentant simplement Iterator interface. En implémentant les méthodes next et current vous définissez comment obtenir l'élément courant et comment obtenir le suivant (mais vous devrez implémenter toutes les méthodes).

Pour l'itération utilisation

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

soins pour voir quelques exemples? L'avez-vous compris à partir du lien ci-dessus?

D'autre part, si vous souhaitez utiliser votre objet sous forme de tableau, vérifiez ArrayObject interface ou pour utiliser simplier ArrayAccess interface

+0

En implémentant l'interface Iterator, je n'ai techniquement pas besoin d'utiliser un motif décorateur. Mais .. pour garder une trace de l'information, je devrais utiliser un tableau. Alors que les propriétés ont leur propre ordre, que je veux être en mesure de contrôler. – Code4R7

+0

Vous avez juste besoin d'une variable dans laquelle vous définissez l'ordre que vous souhaitez poursuivre ($ attributeOrder). Ensuite, dans la méthode next(), vous traversez ce tableau à la place et dans la méthode current() renvoyez la valeur de l'attribut désiré (en respectant le $ attributeOrder). Dans la méthode key(), vous définissez la clé retournée (encore une fois à partir de $ attributeOrder) –

+0

Premier commentaire sur l'interface ArrayObject: "ArrayObject n'est pas un tableau, vous ne pouvez donc pas utiliser les fonctions intégrées du tableau". ArrayAccess fait partie de ArrayObject, ce qui me fait me demander comment contrôler l'ordre réel des propriétés de l'objet. Comment est-ce que j'insérerais '$ o-> ah = 1.5;' entre les propriétés '$ a' et' $ b', sans revenir aux tableaux? – Code4R7