PHP est un langage de paradigme mixte, permettant d’utiliser et de retourner des types de données non-objets, tels que des tableaux. Je pose une question pour essayer de clarifier certaines lignes directrices pour la sélection de tableaux par rapport à des objets lors du choix de la structure de programmation à utiliser dans une situation donnée.
Il s’agit en réalité de questions sur les moyens de coder des données à l’aide de constructions en langage PHP et sur la manière de choisir un moyen plutôt que l’autre à des fins de transmission de données (architecture orientée services ou services Web, par exemple).
Exemple
Supposons que vous ayez un type d'élément composé de {coût, nom, numéro de pièce, nombre d'élément}. Votre programme appelle à l'affichage de plusieurs de ces types d'élément, à l'endroit où vous décidez d'utiliser un tableau comme conteneur externe pour contenir chacun des types d'élément. [Vous pouvez également utiliser PHP ArrayObject
pour le paradigme OO, mais ma question ne concerne pas ce tableau (externe)]. Ma question porte sur la manière de coder les données de type d'élément et sur le paradigme à utiliser. PHP vous permet d'utiliser PHP Native Arrays
ou PHP Objects
.
Je peux encoder de telles données, de deux manières ici, comme ceci:
//PHP's associative arrays:
$ret = array(
0 => array(
'cost' => 10.00,
'name' => 'item1',
'part_number' => 'zyz-100',
'item_count' => 15
),
1 => array(
'cost' => 34.00,
'name' => 'item2',
'part_number' => 'abc-230',
'item_count' => 42
),
);
contre
//here ItemType is encapsulated into an object
$ret = array(
0 => new ItemType(10.00, 'item1', 'zyz-100', 15),
1 => new ItemType(34.00, 'item2', 'abc-230', 42),
);
class ItemType
{
private $price;
private $name;
private $partNumber;
private $itemCount;
function __construct($price, $name, $partNumber, $itemCount) {..}
}
Ce que je pense
L'encodage de tableau est léger, et plus compatible JSON, mais peut être plus facile à gâcher. Misspell une des clés de tableau associatif et vous pouvez avoir une erreur plus difficile à détecter. Mais il est également plus facile de changer sur un coup de tête. Supposons que je ne souhaite item_count
plus stocker de données , je peux utiliser n’importe quel logiciel de traitement de texte pour supprimer facilement toutes les item_count
instances du tableau, puis mettre à jour les autres fonctions qui l’utilisent en conséquence. C'est peut-être un processus plus fastidieux, mais c'est simple.
Le codage orienté objet fait appel aux fonctionnalités des langages IDE et PHP et facilite la détection préalable des erreurs, mais il est en premier lieu plus difficile de programmer et de coder. Je dis plus fort, car vous devez réfléchir un peu sur vos objets, penser à l’avenir, et le codage en sortie d’objet prend une charge cognitive un peu plus lourde que de taper des structures de tableau. Cela dit, une fois codés, certaines modifications item_count
seront peut-être plus faciles à mettre en œuvre, dans un sens, la suppression , par exemple, nécessitera de modifier moins de lignes de code. Cependant, les changements eux-mêmes peuvent nécessiter une charge cognitive plus importante par rapport à la méthode de la matrice, car des installations OO de niveau supérieur sont impliquées.
Question
Dans certains cas, cela est clair, comme dans les cas où je devrai manipuler les données. Mais dans certains cas, où je n'ai besoin que de stocker quelques lignes de données "Type d'élément", je ne dispose pas de directives ou de considérations claires sur lesquelles s'appuyer lorsque j'essaie de décider d'utiliser des tableaux ou de construire des objets. Il semble que je peux juste lancer une pièce et en choisir une. est-ce le cas ici?
array
, 2: User-defined Class
, 3: stdClass
. Les performances en termes de vitesse sont à peu près les mêmes lorsque vous comparez array
et un User-defined class
(tel que votre ItemType
), mais les définitions class
ont tendance à utiliser moins de mémoire que d’utiliser array
s. stdClass
d'autre part, est la plus lente des trois options et utilise également le plus de mémoire.
(object)['foo'=>'bar']
. La valeur résultante a classStdClass
, sera codée JSON dans sa totalitéjson_encode()
et les propriétés peuvent être renommées aussi facilement que des index de tableau (ce qui n’est pas toujours aussi facile, lorsqu’il est accédé indirectement via une variable). Cependant, il existe différentes opérations sur ces valeurs; Par exemple, vous n'avez pas de unions d'objets comme vous avez des unions de tableaux et vous ne pouvez pas utiliser directement lesarray_*()
fonctions.