2010-01-23 13 views
17

Il existe de nombreux débats sur la question de savoir si la programmation orientée objet est bonne ou non. Mais, en utilisant OOP dans Php est plus lent. Serait-il bon d'utiliser la programmation procédurale et la vitesse plus rapide et la POO avec une vitesse plus lente (puisque les classes doivent être lancées chaque fois qu'une page se charge et que les gros sites Web commencent à devenir lents). Plus important encore, serait-il bon d'emballer des choses à l'intérieur d'une classe et d'utiliser des fonctions statiques ou serait-il préférable d'avoir juste de nombreuses fonctions menteuses avec un préfixe ex: wp_function().Est-ce que la POO vaut la peine d'être utilisée en PHP?

+20

sont des microsecondes de traitement valant des cellules cérébrales? ouvrez la source de quelque chose comme CakePHP ou CodeIgniter, puis comparez avec la source de wordpress, puis dites-moi que ce dernier ne vous encourage pas à écraser votre visage dans le clavier. – seanmonstar

+5

Vous avez raison. La vie est trop courte pour essayer et optimiser pour 50 millisecondes d'optimisations par requête. – ambiguousmouse

+0

@seanmonstar: Vous voulez dire que Wordpress n'est pas OO ?! ** o_O '** –

Répondre

10

Oui, c'est presque toujours une bonne idée d'utiliser OOP. C'est parce que la POO est un style de codage, et que les styles de codage sont en grande partie facilement transférables à travers les langues.

Les personnes n'utilisent pas de styles de codage car elles utilisent un langage spécifique. Les gens utilisent des styles de codage parce que le style de codage offre de bonnes méthodes pour faire les choses qu'ils jugent souhaitables. Par conséquent, tant que les éléments de base sont présents (héritage, propriétés de classe, etc.), il sera toujours possible d'écrire dans ce style de codage. Non, l'utilisation de fonctions procédurales pour y accéder n'est probablement pas une bonne idée. C'est parce que, vous devrez probablement faire quelque chose comme ça pour maintenir l'état.

function myFunc() 
{ 
    global $class; 
    $class->doMethod(); 
} 

function myFunc2() 
{ 
    global $class; 
    $class->doMethod2(); 
} 

Ceci est une mauvaise idée car cela crée une tonne d'état global.

+0

Toujours en utilisant global dans les fonctions est une mauvaise idée, car il prend beaucoup d'espace. Mais, serait-il bon d'utiliser $ GLOBALS ['class']? Il pourrait être plus long à écrire mais il serait bon d'utiliser si vous n'utilisiez la classe qu'une seule fois. – ambiguousmouse

+3

'$ GLOBALS' est fondamentalement la même chose. Vous créez une variable globale. –

+0

Donc je peux juste utiliser $ GLOBALS ['class']. Ensuite, sur une autre ligne, utilisez simplement $ class? – ambiguousmouse

12

Si la raison pour laquelle vous vous inquiétez d'utiliser OO avec PHP est la vitesse, ne craignez rien: PHP est un langage lent tout autour. Si vous faites quelque chose d'assez gourmand en ressources processeur pour que la perte de vitesse due à l'utilisation d'objets soit importante, vous ne devriez pas utiliser PHP du tout. En ce qui concerne les fonctions statiques, c'est un choix de conception, mais j'éviterais d'éviter les classes constituées entièrement de fonctions statiques. Il n'y a vraiment aucun avantage sur les préfixes, et l'utilisation d'une construction juste parce qu'elle est là n'est pas une bonne idée.

2

Oui, au fur et à mesure que votre application grandit ... (et elle le fera), elle vous épargnera de nombreuses heures de frustration. Et vous répéter (copier le code de collage partout) .. :)

+0

Huh. pourquoi ne pas utiliser OOP implique copier + coller-codage? –

+0

La programmation procédurale n'est pas réutilisable. Bien que vous pouvez faire cette erreur dans OOP trop :) – Chris

+0

Pourquoi ne pas réutilisable? Vous pouvez écrire du code procédural très, très générique. Voir la bibliothèque standard C++ (par exemple, 'std :: sort'), voir la bibliothèque standard C (plus particulièrement' qsort'). Le code de procédure n'étant pas réutilisable impliquerait totalement que vous pouvez utiliser chaque fonction une fois et une fois seulement, ce qui est bien sûr un peu mauvais. –

5

À mon humble avis, les développeurs PHP ne devraient pas essayer d'aller seulement une direction. (procédural vs orienté objet) Dans certains cas, tout ce dont vous avez besoin est de quelques fonctions globales, d'autres fois il est plus avantageux d'utiliser des objets. N'essayez pas de forcer tout dans un sens ou dans l'autre, soyez flexible et utilisez ce qui fonctionne le mieux pour chaque situation.

5

Je ne suis pas du tout d'accord avec la réponse de Chacha102.

Une bonne réponse à cette question remplirait plusieurs livres - sans parler d'un article de 20 lignes ici.

Les deux approches ont leurs avantages et leurs inconvénients. Je recommanderais à tous ceux qui veulent se considérer comme un bon programmeur d'avoir une expérience significative en programmation procédurale, non procédurale et orientée objet. Ainsi que l'expérience avec différentes méthodologies telles que SCRUM, cascade et RAD. En ce qui concerne l'adéquation des PHPs pour OO vs codage procédural, certainement les racines du langage sont dans le dernier (mais notez que Java et ASP sont hybrides plutôt que les langages OO vrai).

Peronally, j'ai tendance à écrire du code procédural quand j'ai besoin de produire quelque chose qui est soit très simple ou doit avoir son comportement pour être défini et prédictible. Cependant, lorsque j'écris un code complexe où le comportement varie beaucoup au moment de l'exécution, je trouve OO beaucoup plus efficace en termes de temps de développement - bien que la conception soit basée sur un ensemble fini de cas d'utilisation.

Affirmer que vous devez toujours écrire du code de procédure car il fonctionne plus rapidement que le code OO:

1) n'est pas nécessairement vrai 2) ne tient pas totalement le coût relatif du temps de développement vs coûts de matériel

serait-il bon d'envelopper choses à l'intérieur d'une classe et d'utiliser les fonctions statiques

Étant donné que espaces de noms sont maintenant disponibles en PHP, c'est une façon vraiment désordre pour éviter namespace col lisions et pas quelque chose que je recommanderais.

C.

5

Les mêmes arguments sur la performance ont été faites au sujet Objective C et C++ dans la journée. Et la réponse à ce problème était de tirer parti de la mémoire disponible et de la puissance de traitement qui devient de plus en plus grande, meilleure et plus rapide.

Oui, OO nécessite plus de ressources pour s'exécuter. Mais les avantages de l'utilisation de OO l'emportent sur le coût du matériel $$ (qui est susceptible d'être insignifiant) des applications OO de support.

Cependant, il est bon d'être préoccupé par les performances du logiciel. Cependant, regarder sous le capot de la procédure vs oo comme un point de départ est un peu erroné. Vous devez vous concentrer sur l'écriture d'un code efficace pour commencer, que ce soit procédural ou OO (et les deux sont pertinents). Gardez à l'esprit que même si PHP n'est peut-être pas la plate-forme la plus rapide (Java, par exemple), PHP est utilisé pour alimenter certains des sites Web les plus encombrants sur Internet: Facebook.

Si vous avez d'autres doutes sur PHP et OO, regardez simplement Zend et Magento (basé sur Zend). Magento est une plate-forme à forte consommation de ressources VERY, l'utilisation de la mémoire peut être supérieure à 36 Mo par instance. Cependant, la plate-forme elle-même est capable de gérer des millions de hits. C'est parce qu'un environnement de serveur correctement configuré avec une portion saine de ressources matérielles fait que tous les avantages d'utiliser OO surpassent de loin le coût du serveur lui-même. Mais dans un monde d'ordinateurs en cluster, ne pas utiliser la puissance de traitement et de la mémoire (responsable) à votre disposition est - à mon humble avis - la folie clinique.

3

Il n'y a vraiment pas de réponse parfaite car cela dépend de tant de variables inconnues, et il n'est pas nécessaire d'avoir tout ou rien. Par exemple, si vous divisez votre application dans le modèle MVC, vous pouvez avoir votre modèle comme OO mais garder le contrôleur de manière plus simpliste.

Vous pouvez utiliser des classes comme moyen de regrouper simplement des fonctions statiques communes, ou vous pourriez l'amener beaucoup plus loin dans le modèle d'enregistrement actif.

Si vous créez un petit formulaire Web d'une seule page qui déclenche un POST dans un e-mail, vous n'avez vraiment pas besoin d'OO - de peur que vous n'incluiez une classe de messagerie existante pour en tirer parti.

Personne ne peut vous donner des conseils appropriés sans comprendre le projet que vous entreprenez. Cela dit, si votre seule préoccupation est la rapidité, OO sera légèrement plus lent. Et il y a beaucoup de choses sournoises que vous pouvez faire même dans PHP procédurale pour imiter certains des gains OO. Mais à moins que vous ne preniez en charge un énorme projet, les frais généraux supplémentaires n'atteindront jamais beaucoup. Et au moment où vous avez un énorme projet, les avantages d'OO pourraient l'emporter sur les inconvénients de ses frais généraux.

2

J'étais curieux de moi-même. Malheureusement, après avoir changé mon code de procédure à oop, j'ai fait quelques tests et non pas avant.

Voici le code de référence.

class game{ 
    function maxp($val){ 
    return max(0,pow($val,0.5));   
    } 
} 

$game = new game; 

for($i=0;$i<100000;$i++){ 
    $game->maxp(100); 
    //game::maxp(100); 
} 

Les résultats de la POO variaient entre 0,13 et 0,2 seconde;

Les résultats opératoires variaient entre 0,08 et 0,1 seconde.

Les résultats sont restés cohérents pendant une bonne période de temps.

Je vous encourage à exécuter vos propres tests.

php 5.4.3