|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
![]() ![]() Tarik Zakaria BenmerarCEO Inscription : juillet 2012 Messages : 78 ![]() |
PHP introduit les générateurs
Par un mécanisme similaire à celui de Python avec le mot-clé yield Les générateurs sont un moyen simple et puissant de créer des itérateurs dans des langages tels que Python. Maintenant, c'est PHP qui fait le pas et s'approprie ce concept. Pour comprendre l'utilité et la puissance de ce dernier, on revoit l'exemple typique de lecture d'un fichier en entier : Code :
On peut certainement éviter ce comportement et récupérer les données ligne par ligne, en utilisant les itérateurs qui sont parfaits pour ce cas d'utilisation. Malheureusement, en PHP il n'existait jusque-là aucune manière simple d'implémenter les itérateurs. Pour y arriver, on est amené à créer une classe complexe implémentant une interface Iterator comme suit : Code :
Code :
En effet, l'instruction $lines = getLinesFromFile($fileName) ne renvoie aucune donnée, c'est simplement un générateur qui implémente l'itérateur qui vient d'être créé. Après, pendant l'exécution de la boucle foreach ($lines as $line), chaque itération génère les données renvoyées par yield, qui seront stockées dans $line. En fait, cette génération implémente un objet Iterator et des appels à Iterator::next() seront effectués. L'exécution s'arrête jusqu'à la rencontre du prochain yield, qui renvoie la prochaine donnée, et ainsi de suite... Quelques jours après l'introduction du mot clé Finally, se succèdent donc pour PHP les bonnes nouvelles. Ou les emprunts d’autres langages, diront certains. Source : détails du mot clé yield dans le site de PHP Et vous ? Quelle impression vous laisse cette annonce ? Pouvez-vous trouver d'autres cas d'utilisation intéressants ? Quelle autre approche de simplification des itérateurs auriez-vous préférée pour PHP ?
|
||||||
|
|
70
|
|
|
#2 | |||
|
Membre émérite
![]() Étudiant Inscription : septembre 2006 Messages : 510 ![]() |
Citation:
Code php :
C’est proche de l’approche employée, par exemple, par Scheme et sa fonction call-with-input-file. |
|||
|
|
30
|
|
|
#3 |
|
Membre du Club
![]() Mickaël WolffDéveloppeur informatique Inscription : juin 2012 Messages : 11 ![]() |
J'avais été enchanté de découvrir les générateurs avec Python. Mais c'est avec de la pratique qu'on peut vraiment juger de la pertinence d'une telle fonctionnalité. Donc je vais attendre de pester contre les bogues (et trous de sécurité) qu'aura introduit ce nouveau gadget.
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 568 ![]() |
Ce n'est pas mal à voir comme ça.
Mais déléguer un code de lecture de fichiers à une autre méthode, ça impliquerait presque une gestion d'erreur par exception. Si fgets retourne false, ça ne veut pas dire que la fin du fichier a été atteinte, ça peut être une erreur IO. |
|
|
00
|
|
|
#5 | ||
|
Membre éclairé
![]() Inscription : mars 2008 Messages : 284 ![]() |
Ce mot clé est un raccourci pour cette structure :
Code :
Je trouve donc ce mot clé comme un sucre syntaxique inutile. |
||
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Je trouve qu'avec l'exemple donnée on perd en lisibilité et compréhension.
Aucun retour de fonction mais il y en a bel et bien un de par l'implication de yield. Ils viennent de créer un second mot clé de retour de fonction mais que je ne trouve pas très pratique. J'ai parcouru la rfc et j'ai trouvé d'autres exemples qui me chagrinent comme celui là : Code :
Voilà pour mes deux sous de réflexions.
__________________
|
||
|
|
40
|
|
|
#7 |
|
Membre confirmé
![]() Étudiant Inscription : octobre 2011 Messages : 68 ![]() |
En bref, c'est du lazy-evaluation ? Mais limité pour un itérateur ?
|
|
|
00
|
|
|
#8 | |
|
Membre confirmé
![]() Développeur Java Inscription : octobre 2008 Messages : 100 ![]() |
Citation:
|
|
|
|
00
|
|
|
#9 |
|
Membre émérite
![]() Inscription : juillet 2010 Messages : 604 ![]() |
C'est bien mais on aimerai aussi que de vieux "bugs" soient corrigés , hein
http://phpsadness.com/ mais toute nouveauté est bonne à prendre. |
|
|
10
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 568 ![]() |
Oui, il faut imaginer que la boucle consommateur exécute elle-même la boucle fournisseur de façon transparente à chaque tour de boucle dans son propre thread. Si on le déroule on obtient surement un truc proche de ce qu'a posté Grimly.
|
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : juillet 2004 Messages : 1 028 ![]() |
Citation:
C'est du php. Le fichier toujours est présent, disponible en lecture, et le disque dur n'à jamais de défaillances. Sinon, c'est qu'il y à un problème qui mérite un déboggage manuel. Sans troll aucun, php est un langage et une communauté optimiste. mes 2 cents PS: Je vous vois venir les aficionados de l'exception ect. Ce n'est pas la peine de me rétorquer on peut faire ceci-cela, car oui vous aurez probablement raison, mais non ce n'est pas la philosophie de ce langage simple, syntaxiquement épuré et simplement fonctionnel. |
|
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 568 ![]() |
Citation:
Ce qui l'est déjà plus ce sont les applications qui continuent leur traitement en pensant être dans un état normal puis à la fin on remarque un beau jour qu'on a perdu des données. Et cet exemple fourni ci-dessus est typiquement un bon silent fail. |
|
|
|
00
|
|
|
#13 | ||
|
Membre actif
![]() Inscription : février 2010 Messages : 71 ![]() |
Je m'étonne du code impératif donné en exemple avec pour argument principal que ça fait charger tout le fichier en ram et que c'est moche.
En effet Il est inutile et même néfaste de charger tout le fichier en ram si on peut le traiter ligne à ligne. Sauf qu'il n'y a pas besoin d'usine à gaz pour traiter un fichier en une seule passe. L'exemple deviens Code :
Au cas ou ça ne serait pas clair, je ne critique pas le nouveau "yield" mais simplement que le problème soulevé dans l'exemple et prétendument résolu par ce nouvel élément relève largement plus d'une mauvaise approche que d'une limitation du langage. |
||
|
|
10
|
|
|
#14 |
|
Membre actif
![]() Matthieu VergneDoctorant (Requirements Engineering) Inscription : novembre 2011 Messages : 130 ![]() |
Même remarque que transgohan, j'aime pas car on perd en intuitivité. Pas de return, mais ça retourne quelque chose. De plus, on perd complètement la logique d'exécution :
- on appel la fonction - elle s'exécute et retourne le produit final - on utilise le produit final Là, on a : - on appel la fonction - on récupère un truc qui n'a rien à voir avec le contenu de la fonction - on utilise ce truc et là ça exécute le contenu de la fonction (alors qu'on n'appelle pas la fonction en question) Ou sinon, la fonction est belle et bien exécutée pour générer l'itérateur avec toutes ses itérations, mais dans ce cas où est la différence avec tout stocker dans un tableau (on a quand même remplit la mémoire) ? Vu l'article, je ne pense pas que ce soit le cas. Mais du coup le code perd en clarté : on ajoute un mot clé qui remet en cause le paradigme de base, qui est d'avoir une "suite d'instructions exécutées les unes à la suite des autres". |
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 85 ![]() |
Par rapport a la syntaxe et sa lisibilité :
si je fais une analogie avec un autre langage qui utilise yield : C# utilise bien "yield return" et pas juste "yield". J'aurai trouvé plus commode que PHP s'inspire de la syntaxe C# : de considérer yield comme un complément du return et pas comme un remplacant. |
|
|
10
|
|
|
#16 |
|
Membre émérite
![]() |
C'est bien, au moins ce genre de choses fera réagir les développeurs Php, et peut être qu'ils vont essayer d'apprendre python.
Je développe exclusivement en Php (99 % de mon temps), surtout principalement parce qu'il est le plus utilisé au monde, donc je ne fais pas un troll "Python est meilleur que Php". Python est très puissant, et j'aimerais ne faire que du Python, mais malheureusement pas assez de gens en font de manière professionnelle (même si Fabien Potencier, le créateur de Synfony, avoue qu'il s'est très largement inspiré du framework python Django qui est exceptionnellement puissant et qui montre par là même à quel point c'est dommage de préférer Synfony 2 à Django qui est toujours plus puissant, et qui a des années d'avance sur le reste (oui oui j'ai bien dit que je développais à 99 % en Php, mais il faut reconnaitre les qualités de certains outils (quand ils en ont (et même si je ne m'en sers pas Ci suivent quelques uns de mes articles, et peut être que des gens voudront ajouter une corde à leur arc voulant maîtriser Python en plus de Php :
Je dis cela dans le cadre de 'yield', parce que ceux qui connaissent déjà Python n'ont aucun mal avec cette possibilité de créer des itérateurs, ce qui ne semble pas être le cas pour les autres.
__________________
Il ne faut pas oublier que la politesse et le respect sont mutuels. Mon framework Web haute performance : |
|
00
|
|
|
#17 |
|
Membre du Club
![]() Inscription : février 2005 Messages : 85 ![]() |
(ceci reste mon strict point de vue)
j'ai fait quelques pas vers Python et meme Ruby : sans meme parler de puissance et tout ca rien que la syntaxe du langage me rebute, ca ressemble a du "vieux code". Avec des "def", des __INIT__, puis l'encapsulation optionnelle. C'est pas pour troller, juste expliquer pourquoi je suis réfractaire a Python. C'est sans doute une question d'affinité, car j'aime la syntaxe Java ou PHP avec des accolades et des points virgule, etc... Sans ca j'aurais surement adopté Python ou Ruby. |
|
|
20
|
|
|
#18 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2004 Messages : 16 ![]() |
Je vais faire mon captain obvious, mais...
Code php :
Si c'est juste pour traiter le fichier ligne par ligne, les itérateurs ou le yield me semblent hors de propos. Mais je loupe peut-être le sens caché de cette formidable avancée technologique ? Edit : Grilled by spidermario et pcdwarf. J'me sens moins seul !
|
||
|
|
10
|
Copyright © 2000-2013 - www.developpez.com