PHP est-il orienté objet? [fermé]

13

J'ai eu la chance d'avoir une conversation intéressante avec mes collègues. La plupart d'entre eux sont des scripts d'action flash ou des développeurs Java.

Nous avons parlé de la façon dont php gère bien la POO. J'ai dit que PHP peut gérer presque toutes les choses OOP à partir de PHP 5.2 ou 5.3. Ai-je tort? Je n'essaie pas d'obtenir une réponse oui / non, mais j'aimerais entendre plus d'opinions des développeurs.

user23583
la source
J'ai répondu à cela ici
Martin Wickman
12
les langues ne sont pas mauvaises, les programmeurs le sont
@Jarrod Roberson: Les langues sont innées, comment? Dans l'affirmative, veuillez faire référence à la recherche étayant cette affirmation, car je suis très intéressé à la lire.
bévue le
4
@Jarrod, il existe des langues légitimement mauvaises, en particulier lorsqu'elles sont dans leurs premières versions. Les premières versions d'Actionscript, Javascript, Java et PHP viennent à l'esprit.
Jordan
2
@JarrodRoberson, donc les programmeurs qui ont conçu PHP ...
dan_waterworth

Réponses:

34

PHP 5.3 a en fait un support assez décent pour la POO.

Le problème avec PHP en ce qui concerne la POO est que la POO était vraiment juste attachée au langage, tandis que dans des langages comme Java et ActionScript, elle fait partie du concept de base, bien que je considère les deux mauvais langages OOP en raison de leur sémantique d'objet médiocre.

Même si PHP est de nos jours largement adapté à la POO, le problème est que:

  1. la grande majorité de la base de code (bibliothèques, frameworks, code personnalisé) n'est pas écrite en PHP 5.3
  2. la grande majorité de l'API est procédurale. arrayest toujours le type le plus important et le plus utilisé et ce n'est pas un objet.
  3. la grande majorité des programmeurs PHP s'en tenir à un style procédural dans un avenir prévisible. PHP ne promeut pas la POO, contrairement à Objective-C par exemple: Objective-C a C comme sous-ensemble complet et permet ainsi la programmation procédurale sous l'une de ses formes les plus pures, mais il favorise clairement l'utilisation de la POO.

PHP ne peut pas simplement se débarrasser de toutes les choses héritées. Si un PHP 6 était sorti, qui en jette la majeure partie, il ne serait probablement pas utilisé. Cela irait à l'encontre de son objectif.
Et PHP n'a pas réussi à adopter un rythme suffisant de dépréciation progressive des choses. Il faudra donc un certain temps pour obtenir la clarté et la cohérence nécessaires à un bon langage.

Personnellement, je n'aime vraiment pas PHP, simplement à cause de tout ce bagage, de l'API et de tout.
Cependant, les frameworks comme Flow3, Symfony, CakePHP et Codeigniter fournissent une base solide pour la POO et d'autres paradigmes puissants. En raison de la restriction d'ActionScript et de Java, avec un effort suffisant (une couche d'abstraction au sommet des failles PHP), PHP peut être à la hauteur ou même les dépasser.

Pour résumer: il n'y a rien de particulièrement mal avec les fonctionnalités OOP de PHP. Par conséquent, vous pourriez dire que ce n'est pas un mauvais langage OO . Cependant, il y a beaucoup de choses particulièrement erronées avec PHP, telles que les fonctionnalités OOP qui ne sont pas vraiment intégrées , mais plutôt simplement incluses , donc vous pourriez dire que c'est un mauvais langage OO.

back2dos
la source
4
Par curiosité, pourriez-vous expliquer pourquoi vous pensez que Java est un mauvais POO?
dkuntz2
2
Ahem .. Je pourrais mettre à jour votre réponse pour qu'elle soit spécifique à Actionscript 3 . Auparavant, Actionscript n'était pas conçu pour être OO (étant basé sur ECMA) et même Actionscript 2 était simplement un wrapper pour AS1.
Demian Brecht
1
Je suis également curieux de savoir pourquoi vous pensez que Java est un mauvais langage OOP
starcorn
2
@Demian Brecht: Douglas Crockford semble relativement convaincu que JavaScript (et donc le script ECMA) est OO: javascript.crockford.com/javascript.html
back2dos
2
Distinction qui résume bien: PHP est capable d' objet, pas orienté objet.
vartec
11

Vous constaterez que « peut gérer » n'est pas la même chose que « prend en charge ». Je veux dire, au fond des choses, même C " peut gérer " OOP si vous structurez correctement votre code. La question est de savoir si le langage va au-delà de simplement permettre à la POO de l'encourager en faisant de la POO la façon la plus naturelle de programmer.

Dans mon expérience (certes limitée), les dialectes PHP 5.n ne le font pas. Il est trop facile de se glisser hors de la POO et de passer au code de procédure à peu près pur. (Notez que je ne pense pas que PHP soit un mauvais langage pour cette raison. Il y a plusieurs raisons pour lesquelles je pense que PHP est un mauvais langage, mais le support OOP n'en fait pas partie.;))

JUSTE MON AVIS correct
la source
12
Mec, je pourrais continuer pendant des siècles à ce sujet, Moon. Voici un extrait de code qui échoue: $e = function_that_returns_an_array()[0];. Voici ce que vous devez faire pour y remédier: $a = function_that_returns_an_array(); $e = $a[0];. Les langages dont la syntaxe ne vous permet pas d'utiliser directement le résultat d'un appel de fonction me cochent. Aussi, dites - moi ce que le numéro est en décimal: 0246875. (Astuce: vous ne serez pas en mesure de trouver un moyen plus stupide d'implémenter ce lexer!) PHP est juste plein à craquer de ce genre de stupidité.
JUSTE MON AVIS correct
6
@Moon Voici quelques lectures pour vous: softwarebashing.org/blog/2009/09/php-the-ultimate-suck et tommorris.org/wiki/PHP%20Sucks Il y a de sérieux problèmes, mais beaucoup ne sont que nits cueillette. Ce que je déteste vraiment à propos de PHP, c'est la culture, ce n'est tout simplement pas aussi professionnel ou académique que les alternatives, à savoir ruby ​​et python. Les alternatives sont plus agréables et attirent les meilleurs programmeurs. Par exemple, ruby ​​et python ont tous deux des shells interactifs, des fonctionnalités fonctionnelles décentes et une syntaxe propre. Ils sont beaucoup plus amusants à utiliser. Outre la part de marché dans l'hébergement Web partagé, pourquoi utiliser PHP?
Keyo
8
"Il n'y a que deux types de langues: celles dont les gens se plaignent et celles que personne n'utilise." Bjarne Stroustrup. Méditer.
Sylverdrag
4
@JUST, heureusement, ils ont corrigé le problème de déréférencement de tableau dans 5.4 .
Charles
5
Stroustrup est juste énervé que le C ++ soit l'un des langages dont les gens se moquent.
JUSTE MON AVIS correct
8

Il y a vraiment deux définitions de l'orientation d'un objet dans un langage: comment orienté objet est sa propre syntaxe intégrée et bibliothèques standard, et quelle influence cela a-t-il sur les programmeurs de logiciels qui l'écrivent.

Selon la première définition, PHP semble être vers le bas de la liste. Les gens citent souvent des chaînes et des tableaux sans objet comme preuve de cela. À mon avis, cette définition n'a pas vraiment d'importance. Vous pouvez toujours l'envelopper dans un objet si vous en avez vraiment besoin , mais les gens n'en ont pas parce qu'ils n'en ont pas. En général , la seule différence qu'il fera au code est en train de changer function(var)pour var.function(). La syntaxe seule ne change pas quelque chose de non-OOP en OOP.

Quant à la deuxième définition, les gens parviennent à écrire du code mal orienté objet même dans les langages qui appliquent fortement de telles constructions, et les gens qui écrivent un bon code orienté objet sont à peine affectés par le langage, sauf pour être ennuyés par des bizarreries syntaxiques. En d'autres termes, d'après mon expérience, il n'y a pas de mauvais langages orientés objet, juste de mauvais programmeurs orientés objet . PHP est aussi bon que tout autre langage à cet égard.

Peut-être que certains langages sont mieux adaptés à l' apprentissage de la programmation orientée objet, mais je pense que cela variera selon le développeur. Pour moi, ça n'a pas cliqué jusqu'à ce que je lise le livre de chameaux de Larry Wall sur la façon dont perl fait (fait?) OOP. Le fait de devoir explicitement bénir les références comme appartenant à une classe m'a vraiment fait comprendre ce qu'est réellement une instance d'un objet par rapport à ce qu'est une classe. Certaines personnes préfèrent l'approche tout-objet-tout-le-temps de Java pour l'apprentissage. Étant donné que la POO est davantage une préoccupation architecturale, il est plus facile d'apprendre une fois que vous connaissez les variables de base, les expressions, la séquence, la sélection et l'itération, donc tout langage qui ne vous impose pas la POO immédiatement a un avantage éducatif à mon avis.

Lorsque ma femme a fait une introduction au cours de programmation avec java, elle était constamment frustrée par le public static void mainfait de tout mettre dans une classe, qu'elle n'avait pas encore de connaissances, mais son professeur lui avait dit juste de croire qu'elle en avait besoin. J'ai essayé de l'expliquer, mais il est très difficile d'expliquer à quelqu'un qui vient à peine d'apprendre sur les variables pourquoi il serait utile d'empêcher d'autres parties du code d'y accéder et comment décider comment le diviser. Vous pourriez faire valoir que l'apprentissage de la programmation procédurale inculque d'abord de mauvaises habitudes, mais qu'en est-il de l'habitude de copier et coller du code que vous ne comprenez pas?

Karl Bielefeldt
la source
Il semble que les termes "objet", "langage", "orienté" et "programmation" n'aient pas été convenus et sont ambigus et relatifs, donc aucune réponse possible en noir ou blanc n'est possible. Mais encore une fois "noir" et "blanc" ne sont pas convenus et leur signification est insaisissable, etc. etc. etc.
Tulains Córdova
5

PHP n'est pas mauvais pour la programmation orientée objet. Cependant, la nature de PHP encourage les hacks et les corrections rapides par rapport au développement de logiciels orientés objet, et de nombreux livres et tutoriels ignorent complètement les concepts de POO. Il peut très bien prendre en charge les concepts de POO, mais il incombe au développeur de savoir les appliquer. Vous pouvez faire presque tout ce que vous pourriez faire en PHP dans un "vrai" langage OOP comme Java ou C #, mais ces langages ont plus d'application des techniques OOP que PHP, qui pourrait être utilisé si vous le souhaitez.

Je ne me souviens pas de la citation exacte, mais elle provenait de quelqu'un qui comparait PHP brut à l'utilisation du tout nouveau Ruby on Rails, et a dit quelque chose comme ceci: Rails facilite l'écriture de bon code et l'écriture de mauvais code est difficile. PHP facilite l'écriture de mauvais code et rend difficile l'écriture de bon code. La ligne sur PHP résume à peu près sur OOP; il est parfaitement capable d'être un bon langage OO, mais cela le rend un peu plus difficile à faire.

Wayne Molina
la source
4

PHP catégorisé

PHP n'est qu'un langage glue comme BASH ou Perl. C'est bon à cela, mais pas bon à autre chose, à part un travail sérieux. La langue n'est pas conçue. Il est simplement évolué en piratant divers codes ensemble de manière aléatoire (code-and-fix).

Langues compilées

Contrairement à PHP, Java est un langage compilé qui a été correctement conçu. Il existe des JSR définissant le langage, de nombreux cadres et concepts de niveau entreprise tels que EJB, JMS, ESB, Spring, Struts, Hibernate et autres.

Logiciels d'entreprise

En termes de systèmes d'entreprise, Java EE est une solution qui correspond à l'objectif (Enterprise Edition) tandis que PHP est utilisé dans les entreprises qui essaient de réduire les coûts en embauchant une main-d'œuvre bon marché avec des qualifications moindres.

Il y a eu un effort considérable pour faire glisser PHP dans le segment Entreprise à l'aide de divers cadres. Plus particulièrement, Zend Framework 2 . Le problème fondamental ici n'est pas l'orientation objet de PHP, mais c'est le manque de conception, le manque de typage fort, les solutions non standard aux problèmes standard (sorte de hacks pour tout) et l'absence totale d'architecture prescrite.

Conception de logiciels (architecture discutée)

Avec PHP, le fardeau de l'architecture du logiciel est toujours entièrement à la charge des développeurs qui ont fait un très mauvais travail, c'est-à-dire qui n'ont souvent aucune architecture du tout, juste coder et corriger de manière aléatoire. La sécurité et les transactions manquent et doivent être corrigées par les développeurs. En Java, une solution est EJB annotée. Tenez également compte du fait qu'en PHP, rien ne se produit si vous omettez de détecter des exceptions ou de faire diverses erreurs. C'est jusqu'à l'exécution. Avec Java, vous obtiendrez des avertissements et des erreurs directement au moment de la conception. C'est ce qu'on appelle la robustesse, mais avec PHP, vous ne pouvez que rêver.

Multithreading

PHP ne prend pas en charge le multithreading. Le code est toujours un seul thread. Cela entrave ses performances pour les problèmes non triviaux sous une charge plus lourde. Avec Java EE, le multithreading est entièrement pris en charge, par exemple via l'interface Runnable.

Support et normes

Tenez également compte du déploiement, des services Web et d'autres normes. Alors qu'à Java, il existe de grandes entreprises comme Oracle, IBM, RedHat, Apache et bien d'autres, PHP n'a que Zend.

Conclusion

Pour conclure, PHP est un très mauvais langage orienté objet. À strictement parler, il n'est même pas orienté objet, mais hybride, ce qui est mauvais à partir des versions> 5 car la POO est mélangée à la programmation procédurale. Je ne recommanderais que PHP comme colle comme BASH, mais pour un travail sérieux, j'utiliserais Java EE.

Réflexions connexes

Le principal problème avec le dernier Zend Framework 2 est qu'il essaie de ressembler à Java EE, mais ne parvient pas à fournir au moins un ensemble comparable à distance de packages, fonctionnalités, outils, automatisation, vérification des erreurs, architecture, conception et tout.

D'après mon expérience, il est plus coûteux d'utiliser PHP pour des projets complexes qu'avec Java.

Il y a aussi des rumeurs telles que PHP signifie Pretty Horrible Programming . Je peux les confirmer.

Michael Borgwardt
la source
3

Dans quelle mesure un langage gère-t-il la POO? Je préfère demander dans quelle mesure puis-je écrire un programme de manière OO. Je peux faire un pied de nez à la position tout-devrait-être-une-classe prise par Java en rendant tout public statique .
PHP prend en charge la POO; cela ne me force pas à écrire uniquement à la manière OO. La façon dont il gère dépend de la façon dont je comprends et écris le programme d'une manière orientée objet.

Srisa
la source
2

PHP prend en charge les traits! (à partir de 5.4) . Tout langage capable de gérer nativement la réutilisation horizontale est un langage OO suffisamment bon dans mon livre.

dukeofgaming
la source
1

Eh bien, nous devons penser à ce qui rend une langue plus OO et quelles sont les raisons qui l'ont rendu ainsi.

JavaScript est une implémentation d'ECMAScript qui devait s'exécuter dans un environnement de navigateur en tant que langage interprété . Le fait qu'il soit considéré comme un langage interprété a eu un très grand effet sur sa conception syntaxique / comportementale.

Par exemple, il ne suit pas la POO. Mais en dehors de cela, il existe de nombreux faits comme, le programmeur OO peut trouver certains de ses comportements comme le levage de fonction très déroutant.

Encore une fois, il y a beaucoup de choses fournies avec les langages OO comme C ++, Java, C # pour les rendre efficaces pour le compilateur, comme le typage fort . Cependant, étant donné que JS s'exécute dans un environnement interprété, il ne suit pas un typage fort à la place, il s'agit d'un langage vaguement typé .

En dehors des différences de comportement ci-dessus, il existe de nombreuses différences syntaxiques comme JS ont une notation Object Literal qui peut très bien confondre les programmeurs C #. Cependant, C # a également une syntaxe de type littéral objet, même s'il s'agit d'un langage compilé et qu'une telle syntaxe est rarement utilisée car elle n'est pas traditionnellement du style de code OO.

Maintenant, il y a un autre point qui dicte si le langage est bon OO: est-il évolué à partir de C ++. Comme Java, C # sont issus du C ++ et suivent un comportement et une syntaxe similaires, une grande communauté perçoit ce comportement et cette syntaxe comme la seule chose OO , et pense que tout langage qui n'inhibe pas de telles similitudes n'est tout simplement pas OO.

Mais n'oublions pas que OO est un concept très abstrait, il n'est lié à aucun style de syntaxe et même à aucune propriété comportementale spécifique.

Et PHP est très bien OO. Tout simplement ne pas ressembler et ne pas ressembler à Java, C ++, C # ne rend pas le langage OO pauvre. Eh bien, j'ai appris le C ++ puis le Java puis le C #.

Donc, jusqu'à présent, ma tête était très bien OO. Ensuite, j'ai appris JS dans un très bon livre "Wrox Pro", et ça m'a tout simplement exagéré. J'ai juste apprécié le comportement et la distinction syntaxique de JS. Ensuite, je me rends compte que la syntaxe objet littérale était dans leur en C #. Et maintenant, tout en apprenant PHP, j'ai l'impression que cela apporte beaucoup de choses des deux mondes.

Tout ce que nous avons vraiment à faire est d'apprendre la syntaxe et les subtilités de comportement d'un langage lors de l'implémentation d'OO. Une fois que nous les maîtrisons, nous pouvons penser que c'est une meilleure implémentation OO.

Maha
la source