Ce n'est probablement pas quelque chose que vous comprendrez profondément avant d'avoir travaillé sur un grand projet logiciel pendant plusieurs années. De nombreux jeunes diplômés en informatique vous donneront une réponse avec tous les mots justes (encapsulation, fonctionnalité avec les données et maintenabilité), mais peu d'entre eux comprendront vraiment pourquoi tout cela est bon à avoir.
Voyons quelques exemples.
- Si des tableaux sont renvoyés, soit toutes les valeurs doivent être calculées dès le départ, soit il faut renvoyer un grand nombre de petites valeurs à partir desquelles on peut construire des valeurs plus complexes.
Pensez à une méthode API qui renvoie une liste d'articles WordPress. Ces articles ont tous des auteurs, les auteurs ont des noms, des adresses e-mail, peut-être même des profils avec leurs biographies.
Si vous renvoyez tous les messages dans un tableau, vous devrez vous limiter à renvoyer un tableau d'identifiants de messages :
[233, 41, 204, 111]
ou renvoyer un tableau massif qui ressemble à quelque chose comme :
[ title: 'somePost', body: 'blah blah', 'author': ['name': 'billy', 'email': 'bill@bill.com', 'profile': ['interests': ['interest1', 'interest2', ...], 'bio': 'info...']] ]
[id: '2', .....]]
Le premier cas, qui consiste à renvoyer une liste d'identifiants, n'est pas très utile, car vous devez alors effectuer un appel API pour chaque identifiant afin d'obtenir des informations sur ce message.
Dans le second cas, vous obtiendrez beaucoup plus d'informations que ce dont vous avez besoin dans 90 % des cas et vous aurez beaucoup plus de travail (surtout si l'un de ces champs est très compliqué à construire).
Un objet, quant à lui, peut vous permettre d'accéder à toutes les informations dont vous avez besoin, mais sans les avoir réellement extraites. La détermination des valeurs des champs peut se faire de manière paresseuse (c'est-à-dire lorsque la valeur est nécessaire et non à l'avance) lorsqu'on utilise un objet.
- Les tableaux exposent plus de données et de capacités que prévu.
Revenez à l'exemple du tableau massif retourné. Maintenant, quelqu'un peut probablement construire une application qui itère sur chaque valeur du tableau de messages et l'imprime. Si l'API est mise à jour pour ajouter un seul élément supplémentaire à ce tableau de messages, le code de l'application va s'interrompre car il va imprimer un nouveau champ qu'il ne devrait probablement pas. Si l'ordre des éléments du tableau de messages renvoyé par l'API change, le code de l'application sera également perturbé. Le renvoi d'un tableau crée donc toutes sortes de dépendances possibles qu'un objet ne créerait pas.
Un objet peut contenir des informations qui lui permettront de vous fournir des fonctionnalités utiles. Un objet post, par exemple, pourrait être assez intelligent pour renvoyer les messages précédents ou suivants. Un tableau ne pourrait jamais faire cela pour vous.
Tous les avantages des objets mentionnés ci-dessus contribuent à créer un système plus flexible.
5 votes
Je suis curieux de savoir ce qu'il en est par rapport à la inconvénients d'objets, comme le fait de ne pas pouvoir utiliser
count()
oarray_*()
sur eux (au moins en ce qui concerne le stockage/renvoi de données clé => valeur). Personne ne semble le mentionner, ou est-ce que je rate quelque chose ?8 votes
Les objets peuvent être rendus dénombrables et itérables en implémentant les interfaces Countable ou Iterator. Consultez php.net/manuel/fr/book.spl.php également.
0 votes
Si vous avez installé SPL et que vous implémentez l'interface countable pour votre classe d'objets, vous pouvez appeler
count()
sur un objet.2 votes
Dans de nombreux cas, un tableau n'a même pas de sens parce que vous ne retournez pas une collection d'objets, ou un type de collection qui n'est pas facilement émulé par des tableaux. Si vous n'avez qu'une séquence d'autres valeurs et qu'aucune sémantique supplémentaire n'est associée, alors, pour l'amour de Dieu, retournez un tableau - mais vous constaterez que c'est rarement le cas.
8 votes
@delnan et d'autres : Veuillez noter que @Dennis parle de tableaux associatifs (aka. Dictionaries, aka. Maps), et non des tableaux normaux (à index entiers). Ils sont une fonctionnalité essentielle de PHP, et servent plus ou moins le même but que les classes dynamiques (
stdClass
). Je ne suis pas sûr que cette question ait une réponse autre que "Parce que les programmeurs qui travaillent principalement en POO préfèrent la sémantique de l'utilisation des objets".