Comment passer des données de manière orientée objet en PHP?


11

Je trouve que même lorsque je travaille avec un framework MVC (par exemple CodeIgniter), je recourt régulièrement à des tableaux imbriqués plutôt qu'à des objets.

Cela ne suit pas bien ma compréhension de l'objet orienté. Par exemple, si je portais le code sur Java, je ne rêverais pas de passer des tableaux (ou des vecteurs, ou autre) comme ça.

Je me demandais si c'était la façon appropriée de gérer les données. Y a-t-il une raison pour laquelle les tableaux sont passés comme ça en PHP, ou pourquoi les objets ne sont pas utilisés? Quelle est la meilleure façon de transmettre des données?

Réponses:


8

Ne confondez pas OO Java avec PHP. Java est un langage à paradigme unique, ce qui signifie qu'il ne fait que OO. PHP d'autre part est un langage multi paradigme, vous pouvez soit faire de la programmation fonctionnelle ou OO ou les deux.

Maintenant, il n'y a pas de "mauvaise" implémentation d'OO. L'OO de Java n'est pas une implémentation définitive que tout autre langage doit ou doit suivre. Il existe des concepts définitifs, et les deux langages les implémentent entièrement à leur manière (Java depuis le début, PHP depuis la version 5).

Donc, pour répondre à votre question: ce que fait CI et ce que vous en faites est juste dans le monde PHP. Les tableaux de PHP sont l'une de ses structures les plus flexibles et les plus utiles et c'est en fait une bonne chose d'utiliser des tableaux sur des objets lorsque vos données ne sont que des informations (ne transportez pas de logique avec elles). Un code entièrement OO n'est pas la même chose que «uniquement le code OO».

Si vous commencez avec PHP, utilisez Java comme référence pour les bonnes pratiques OO mais ne limitez pas votre compréhension de PHP à cause de la chose "Java fait les choses différemment". Vous pouvez vraiment bousiller les deux, le paradigme ne vous sauvera pas si vous ne comprenez pas les concepts.

Si dans tous les cas vous trouvez Java plus à votre goût (comme préférence personnelle), consultez Ruby pour le développement Web, ils sont un peu plus étroitement liés.


Pourquoi ne devrions-nous pas confondre Java OO avec PHP OO? Ils sont à peu près les mêmes, sauf que PHP a un type de données tableau / hachage natif.
Martin Wickman

Les implémentations sont assez similaires. Je parlais de la façon dont ils sont utilisés dans les deux langues.
yannis

J'ai un problème avec la POO. Je veux créer une conception OOP pour une application (base PHP), où un objet dépendra d'autres objets. Comment gérer cela en PHP? plz aidez-moi ...
Imran Khan

Exemple de scénario: un objet Hôtel a un objet Chambre, où un objet Chambre doit des objets Date ... et un objet Date a des prix pour les types de personne. Maintenant, comment gérer ce type de scénario en PHP par base OOP (car il y a de grandes données qui doivent être traitées à chaque niveau).
Imran Khan

@Walter j'attends votre réponse .... plz aidez-moi.
Imran Khan

2

Utiliser des objets au lieu de tableaux simplement parce que ce sont des objets n'est pas un paradigme OO, c'est juste des préférences personnelles :)

Les objets donnent l'achèvement de code pratique dans l'IDE, les interfaces (indication de type) et l'héritage peuvent être utilisés.

Si vous voulez utiliser des objets au lieu d'un tableau parce que vous voyez des avantages - utilisez-les, mais si vous voulez les utiliser simplement parce que ce sont des objets - ne perdez pas votre temps à ce refactoring :)


"Les objets d'utilisation, tout comme les tableaux, prendront plus de mémoire et de CPU. " Ce n'est pas (toujours) vrai. Un objet contenant la même quantité de données avec un tableau occupera presque exactement la même quantité de mémoire.
yannis

@Yannis Rizos, oui, les objets peuvent même utiliser moins de mémoire, édités.
OZ_

Ce n'est pas seulement qu'ils peuvent utiliser moins de mémoire, c'est que leur utilisation de la mémoire n'est pas pertinente car elle est triviale par rapport aux autres aspects des performances de la mémoire du système et aux avantages de l'utilisation d'objets. Si nous nous soucions autant de l'utilisation de la mémoire, nous n'utiliserons jamais d'objets. Ce qui nous importe, c'est que les objets nous donnent de meilleurs outils pour raisonner et construire des systèmes.
Rein Henrichs

@Rein Henrichs, je le sais, merci. C'est pourquoi tous les mots sur la «mémoire» ont été supprimés de ma réponse. Je n'essaye pas de faire une optimisation idiote, mais je suis sûr que ce objects just because they are objectsn'est pas une raison pour une refactorisation :) Lisez ma réponse, pas seulement des commentaires.
OZ_

Assez juste, j'ai commenté avant les modifications.
Rein Henrichs

1

Vous ne transmettez pas vraiment de données dans un système OO - vous transmettez des objets . La différence est que les objets contiennent des comportements ainsi que des données. C'est pourquoi ils l'appellent orienté objet et non orienté données.

Tant que vous n'avez pas besoin de comportement avec vos données, les anciens tableaux PHP sont tout aussi bons (ou mauvais, selon votre point de vue) que les objets de valeur.


0

Je pense que c'est juste une question d'ajustement - il existe de nombreuses implémentations d '"objets" en programmation - Python et Javascript ont des propriétés très différentes. PHP OO est sans doute un hack - les tableaux PHP ne sont pas des "objets" au sens traditionnel - mais ils servent un objectif évident. À moins que vous ne vouliez que les données aient un COMPORTEMENT personnalisé, alors pourquoi utiliser un objet?

ÉDITER:

re: objets de valeur immuables

http://bradley-holt.com/2010/09/immutable-value-objects-in-php/


Pour donner aux données une structure fiable. Oui, je peux construire une fonction qui génère un format / imbrication particulier de tableau mais qui dira que je n'écris pas une autre fonction qui le modifie légèrement puis le transmet.
Matthew

1
bien sûr - alors vous auriez besoin d'un objet pour protéger l'accès aux variables - puisqu'il n'y a pas d'équivalent PHP de tuples Python par exemple. Mais voilà - vous avez défini le problème, vous devez simplement utiliser les constructions disponibles pour le langage ... ou simplement apprendre à vivre avec ses "bizarreries". J'ai ajouté un lien vers mon message initial qui a une discussion intéressante sur le problème.
sunwukung
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.