Quand devrais-je utiliser stdClass et quand devrais-je utiliser un tableau dans php oo code?

au milieu d'une période de grands remaniements au travail, je souhaite présenter stdClass ***** comme un moyen de retourner des données à partir de fonctions et j'essaie de trouver des arguments non-subjectifs pour appuyer ma décision.

existe t-il des situations où il serait préférable d'utiliser l'un plutôt que l'autre ??

Quels avantages aurais-je à utiliser stdClass au lieu de tableaux ??


certains diraient ces fonctions doivent être aussi petites et spécifiques pour pouvoir rendre une seule valeur. Ma décision d'utiliser stdClass est temporelle, car j'espère trouver les objets de valeur appropriés pour chaque processus à long terme.

64
demandé sur Habeeb Perwad 2010-07-07 14:08:00

7 réponses

l'approche habituelle est

  • utiliser des objets pour retourner une structure de données définie avec des branches fixes:

     $person
       -> name = "John"
       -> surname = "Miller"
       -> address = "123 Fake St"
    
  • utiliser des tableaux en retournant une liste:

      "John Miller"
      "Peter Miller"
      "Josh Swanson"
      "Harry Miller"
    
  • utilisez un tableau d'objets lorsque vous retournez une liste d'informations structurées:

      $person[0]
        -> name = "John"
        -> surname = "Miller"
        -> address = "123 Fake St"
    
      $person[1]
        -> name = "Peter"
        -> surname = "Miller"
        -> address = "345 High St"
    

les objets ne sont pas appropriés pour tenez des listes de données, parce que vous avez toujours besoin d'une clé pour les adresser. Les tableaux peuvent remplir les deux fonctions-détenir des listes arbitraires, et une structure de données.

par conséquent, vous pouvez utiliser des tableaux associatifs sur les objets pour les premier et troisième exemples si vous le souhaitez. Je dirais que c'est juste une question de style et de préférence.

@Deceze fait un certain nombre de bons points sur quand utiliser un objet (Validation, vérification de type et méthodes futures).

55
répondu Pekka 웃 2010-07-07 10:12:13

utiliser stdClass pour remplir la même fonction QU'un tableau N'est pas très utile IMHO, il ajoute juste la tête d'un objet sans aucun avantage réel. Vous manquez également de nombreuses fonctions de tableaux utiles (par exemple array_intersect ). Vous devez au moins créer votre propre classe pour activer la vérification de type, ou ajouter des méthodes à l'objet pour qu'il vaille la peine d'utiliser un objet.

39
répondu deceze 2010-07-07 10:21:55

Je ne pense pas qu'il y ait un avantage raisonnable d'utiliser une classe std sur un tableau aussi longtemps que votre seule intention est pour retourner plusieurs types de données arbitraires à partir d'un appel de fonction .

puisque vous ne pouvez pas techniquement retourner plusieurs valeurs nativement, vous devez utiliser un conteneur qui peut contenir tous les autres types de données disponibles en PHP. Que serait un objet ou un tableau.

function fn1() { return array(1,2); }
function fn2() { return array('one' => 1, 'two' => 2); }
function fn3() { return (object) array(1,2); }
function fn4() { return (object) array('one' => 1, 'two' => 2); }

Tout ce qui précède travail. Le tableau est une minuscule fraction négligeable plus rapide et moins de travail à dactylographier. Il a également un but clairement défini en contraste avec le stdClass générique (qui est un peu wishywashy, isnt it). Les deux n'ont qu'une interface implicite, donc vous devrez regarder les docs ou le corps de fonction pour savoir ce qu'ils contiendront.

si vous voulez utiliser des objets à tout prix, vous pouvez utiliser ArrayObject ou SplFixedArray , mais si vous regardez leurs API. diriez-vous que vous avez besoin de leur fonctionnalité pour la tâche simple de retourner des valeurs multiples aléatoires? Je ne le pense pas. Ne vous méprenez pas: si vous souhaitez utiliser stdClass, puis l'utiliser. Ce n'est pas comme si ça allait casser quelque chose. Mais vous ne gagneriez rien non plus. Pour ajouter au moins un avantage, vous pouvez créer une classe séparée appelée ReturnValues pour cela.

pourrait être une classe de marquage simple

class ReturnValues {}

ou quelque chose de plus fonctionnel

class ReturnValues implements Countable
{
    protected $values;
    public function __construct() { $this->values = func_get_args(); }
    public function __get($key) return $this->values[$key]; }
    public function count() { return count($this->values); }
}

certes, cela ne fait pas grand chose et en tirer les valeurs est toujours fait par une interface implict, mais au moins la classe a une responsabilité plus clairement définie maintenant. Vous pouvez étendre cette classe pour créer des objets ReturnValue pour des opérations particulières et leur donner une interface explicite:

class FooReturnValues extends ReturnValues
{
    public function getFoo() { return $this->values['foo']; }
    public function getBar() { return $this->values['foo']; }
}

maintenant le développeur doit juste regarder L'API pour savoir quelles valeurs multiples foo() retourneront. De bien sûr, avoir à écrire des classes de valeurs de retour concrètes pour chaque opération qui pourrait retourner des valeurs multiples pourrait devenir rapidement fastidieux. Et personnellement, je trouve cela trop compliqué pour le but initial.

quoi qu'il en soit, j'espère que ça a un sens.

18
répondu Gordon 2010-07-09 21:06:51

Eh bien, il y a 3 différences:

  • ils ont une identité. c'est pourquoi la valeur par défaut pour passer les arguments du tableau est call by value et pour les objets call by sharing .
  • il y a une différence sémantique. Si vous utilisez un objet, n'importe qui qui lit le code comprend, que la valeur représente le modèle une sorte d'entitity, alors qu'un tableau est censé agir comme une collection ou un carte 151980920"
  • et enfin, le remaniement devient nettement plus facile. Si vous voulez utiliser une classe concrete plutôt que stdClass, tout ce que vous avez à faire est d'instancier une autre classe. Ce qui vous permet également d'ajouter des méthodes.

greetz

back2dos

4
répondu back2dos 2010-07-07 13:04:50

je trouve les objets stdClass au-dessus des tableaux utiles quand j'ai besoin de garder mon code propre et quelque peu comme la phrase lisible. Prenons par exemple la fonction getProperties() qui renvoie un ensemble de propriétés, disons des données sur une personne (Nom, âge, sexe). Si getProperties() retournerait un tableau associatif, quand vous voulez utiliser une des propriétés retournées, vous écririez deux instructions:

$data = getProperties();
echo $data['name'];

d'autre part, si getProperties() renvoie une classe std, vous pouvez écrivez cela en une seule instruction:

echo getProperties()->name;
2
répondu Cojocariu Adrian 2012-09-15 15:24:57

le seul vote de confiance objectif que je puisse trouver est:

json_decode utilise stdClass par défaut donc les mortels américains en userland devraient utiliser stdClass pour des situations similaires.

2
répondu William Entriken 2014-04-24 16:14:22

dans les tests de tableau vs stdclass, la façon dont php gère les propriétés dynamiques est plus lente que les tableaux associatifs. Je ne dis pas cela pour argumenter la micro-optimisation, mais plutôt si vous allez le faire votre mieux de définir une dataclass sans méthodes et de définir des propriétés publiques. Esp si vous utilisez php 5.4+. Sous le capot, les propriétés définies sont mappées directement sur un tableau c sans hashtable où les propriétés dynamiques doivent utiliser une table de hachage.

cela a le bonus ajouté de avant de devenir plus tard une classe complète sans interface retravailler.

1
répondu bgrohs 2014-08-10 19:17:25