68 votes

Quand dois-je utiliser stdClass et quand dois-je utiliser un tableau en php oo code?

Au milieu d'une période de grande refactorings au travail, je souhaite introduire stdClass * comme un moyen pour renvoyer des données à partir de fonctions et j'essaie de trouver des non-subjectives des arguments à l'appui de ma décision.

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

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


Certains diront que les fonctions doivent être aussi peu et spécifiques pour être en mesure de retourner une seule valeur. Ma décision d'utiliser stdClass est temporelle, comme je l'espère, de trouver la bonne Valeur des Objets pour chaque processus sur le long terme.

60voto

Pekka 웃 Points 249607

L'approche habituelle est

  • Utiliser des objets lors du retour d'une structure de données définis avec fixe branches:

     $person
       -> name = "John"
       -> surname = "Miller"
       -> address = "123 Fake St"
    
  • Utiliser les tableaux lors du retour d'une liste:

      "John Miller"
      "Peter Miller"
      "Josh Swanson"
      "Harry Miller"
    
  • L'utilisation d'un tableau d'objets lors du retour d'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 adaptés pour contenir des listes de données, parce qu'on a toujours besoin d'une clé pour y remédier. Les tableaux peuvent remplir deux fonctions - hold arbitraire des listes, 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 vraiment juste une question de style et de préférence.

@Deceze fait un certain nombre de bons points quand utiliser un objet (la Validation, la vérification du type et de l'avenir des méthodes).

42voto

deceze Points 200115

À l'aide de stdClass de remplir la même fonction qu'un tableau n'est pas très utile à mon humble avis, il ajoute juste les frais généraux d'un objet sans réel bénéfice. Vous êtes également absent dehors sur de nombreuses fonctions de tableau (par exemple, array_intersect). Vous devriez au moins créer votre propre classe pour permettre la vérification de type, ou d'ajouter des méthodes à l'objet pour en faire une valeur à l'aide d'un objet.

18voto

Gordon Points 156415

Je ne pense pas qu'il est raisonnable avantage de l'utilisation d'un stdClass sur un tableau aussi longtemps que votre seul but est de revenir arbitraires multiples types de données à partir d'un appel de fonction.

Puisque vous ne pouvez pas techniquement retourner plusieurs valeurs en mode natif, vous avez à utiliser un récipient qui peut contenir tous les autres types de données disponibles dans 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 n'est qu'une infime fraction négligeable plus rapide et moins de travail de type. Il a aussi clairement défini le but en revanche pour le générique stdClass (qui est un peu wishywashy, n'est-il pas). Deux seulement ont implicite de l'interface, de sorte que vous avez à regarder les docs ou le corps de la fonction pour savoir ce qu'ils contiennent.

Si vous souhaitez utiliser des objets à n'importe quel coût, vous pouvez utiliser ArrayObject ou SplFixedArray, mais si vous regardez leurs Api voulez-vous dire que vous avez besoin de leur fonctionnalité pour la simple tâche de retourner aléatoire de plusieurs valeurs? Je ne le pense pas. Ne vous méprenez pas: si vous souhaitez utiliser stdClass, puis l'utiliser. C'est pas comme si elle allait se briser quoi que ce soit. Mais vous aussi, vous ne gagnerait rien. Pour ajouter au moins un certain avantage, vous pouvez créer une classe nommée ReturnValues pour cela.

Pourrait être un simple marquage de la classe

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); }
}

Accordé, il ne fait pas beaucoup et d'obtenir les valeurs d', il est toujours fait par le biais d'un implict interface, mais au moins la classe a une responsabilité clairement définie maintenant. Vous pouvez étendre à partir de cette classe pour créer ReturnValue objets pour des opérations particulières et de donner à ces une interface explicite:

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

Désormais, le développeur a juste à regarder l'API pour savoir lequel de multiples valeurs foo() sera de retour. Bien sûr, avoir à écrire de béton ReturnValue classes pour chaque opération qui peut renvoyer plusieurs valeurs peuvent devenir rapidement fastidieux. Et personnellement, je trouve ce overengineered de l'objectif initial.

De toute façon, l'espoir qui fait du sens.

4voto

back2dos Points 13253

Eh bien, il y a 3 différences:

  • ils ont une identité. c'est pourquoi la valeur par défaut pour le passage des arguments de type tableau est appel par valeur et pour les objets d'appel par le partage.
  • il y a un semantical différence. Si vous utilisez un objet, celui qui lit le code à comprendre, que la valeur représente le modèle d'une sorte de entitity, tandis qu'un tableau est censé agir comme une collection ou d'une carte
  • Et le dernier mais non le moindre, refactoring devient signifficantly plus facile. Si vous souhaitez utiliser un béton de classe plutôt que de stdClass, tout ce que vous avez à faire est de créer une instance d'une autre classe. Ce qui vous permet également d'ajouter des méthodes.

greetz
back2dos

1voto

Je trouve stdClass objets sur des tableaux utile quand j'ai besoin de garder un code propre et un peu de phrase-comme lisible. Prenez l'exemple de la fonction getProperties() qui renvoie un ensemble de propriétés, dire des données sur une personne (nom, âge, sexe). Si getProperties() serait de retourner un tableau associatif, lorsque vous souhaitez utiliser l'un de l'retourné propriétés, vous écrivez deux instructions:

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

D'autre part, si getProperties() renvoie un stdClass alors vous pourriez écrire en une seule instruction:

echo getProperties()->name;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X