Petite découverte récente et sympa : Flysystem. Une bibliothèque de code PHP qui présente une abstraction assez simple et sympa autour des systèmes de fichier locaux, S3, dropbox, FTP, …
Catégorie : PHP
-
Documentation PHP
Quelques (nombreux) écrans de présentation de Willian Durand à propos de PHP
Je ne sais pas à qui est destiné cette documentation, mais c’est un boulot énorme et très bien fait de collecte, analyse et présentation des bonnes pratiques. Vous devriez passer dessus et prendre du temps à lire même si vous travaillez déjà avec PHP au jour le jour.
Pour m’être frotté à ce genre d’exercice, j’ai rarement vu un résultat aussi bon.
Il y a une version pour la suite qui parle plus particulièrement de Symfony, mais moins essentielle à mon avis.
-
Please stop pretending PHP is a good language
The first step to fixing a problem is admitting that there is one.
Bon, des critiques de PHP ce n’est pas ce qui manque mais pour une raison inconnue je m’étais dit que ça partait bien quand j’ai lu la première ligne. Sauf qu’au final…
- It’s not ok that you can’t reliably get the first element of an array using less than 4 lines of code without causing side effects.*[1]
- It’s not ok that the output of
echo 5/3
might depend on the country you live in if you don’t know the fine details of configuring PHP. - It’s not ok that you won’t be able can’t call array_map” or just “$iterator->reduce” on an iterator in 2014.
- It’s not ok to ignore the simple fact that most of the PHP world currently relies on parsing function and class comments for it’s code to function because people can’t get their shit together on mailing lists.
- It’s not ok to run around shouting “type hinting for literals would mean that passing an int to float hint would fatal PHP” and calling that an reasonable argument while people just write
$x = (float)$x;
in the cases where it actually does matter anyways. - It’s not ok to be not able to talk to 2 back end data sources in parallel, using “promises” or whatever, in a language that has “pull stuff out of database and put it into the internet” as a proclaimed core competency.
- It’s not ok that
echo 0.000001;
produces1.0E-6
and that casting it to string doesn’t help but putting quotes around it does. - It’s not ok that you have to clear the error buffer by generating a suppressed undefined variable error just to be able to sanely use token_get_all().
Au final la moitié des items ressemblent juste à « ça ne fait pas ce que j’espère ». Alors pour ceux qui m’ont fait suivre le lien :
Pour le premier item il existe plusieurs solutions, dont un simple array_values($tab)[0]. Bref, rien d’exceptionnel pour aller itérer sur un dictionnaire.
Pour le second, si on demande explicitement au niveau du système à afficher les résultats suivant les conventions d’un pays spécifique, PHP s’y conforme. C’est le cas de la plupart des langages, y compris la ligne de commande de base. Difficile d’avancer que c’est un problème, d’autant qu’il est bien évidemment possible d’ignorer la configuration du système pour forcer une locale au niveau du langage.
Quant à savoir comment afficher 0.000001 ou 1E-6, comme le langage n’a aucun moyen de savoir comment a été tapé la valeur initiale dans le code source (rien de spécifique à PHP, à ma connaissance aucun ne le fait), il faut bien qu’il choisisse une forme arbitrairement à la sortie. Si l’auteur veut forcer autre chose, il a tous les outils pour ça.
Pour le dernier item j’ai la flemme de vérifier les cas limites mais à priori c’est juste que l’auteur n’a pas eu le courage d’aller créer un gestionnaire d’erreur pour gérer ses erreurs.
Bref, tout ça c’est bien joli mais à première vue une bonne partie n’est qu’un problème de développeur frustré, pas un problème de langage.
Ce qui me frustre moi c’est que des problèmes de langages il y en a plein, et que pousser des faux problèmes décrédibilise ceux qui essayent de corriger les problèmes réels.
-
Je veux changer ça, et ça, et ça
Je pense que je ne suis pas le seul à imaginer régulièrement comment créer un nouveau langage ou modifier les existants à ma convenance. Sans aller jusque là, en croisant ce qui se fait dans les différents langages, on trouve toujours des point intéressants qu’on aimerait voir copiés.
Voilà donc quelques unes de mes frustrations, parce que les exprimer permet de s’en débarrasser un peu et de se concentrer sur l’important : ce qu’on fait avec le langage.
Persistance du code en PHP
Chaque requête web recharge entièrement l’applicatif PHP. APC apporte une béquille indispensable mais ça reste au niveau de la béquille. Toute l’initialisation est à refaire à chaque fois. Ça fonctionne, mais j’aimerai vraiment un mode de PHP ou un framework web PHP qui permette de commencer directement au traitement des requêtes sans avoir à tout refaire de zéro.
Accesseurs en PHP
Toujours côté PHP j’attends depuis bien longtemps l’apparition d’accesseurs transparents pour les attributs des objets. Ruby, Python et Javascript ont chacun leur façon de faire. Là il ne s’agit pas de repiquer une syntaxe au langage voisin mais bien de combler un manque.
Sérieusement, je n’en peux plus de ces getX() et setX(). C’est encore plus pénible à l’utilisation qu’à la création.Espaces de noms
Fut un temps je râlais beaucoup contre PHP mais ce dernier une bonne partie du retard qu’il avait. Mieux : Arrivé en dernier il s’est permis de parfois faire les choses plus intelligemment.
Dites, pourquoi n’ai-je pas d’espaces de nom en Javascript ?
Les « use » de PHP me manquent aussi en Ruby. Ils présentent une solution élégante et pour donner des noms courts en local à des classes qui viennent d’autres espaces de noms, mais ils permettent aussi les alias pour changer facilement une implémentation par une autre sans impacter le code.
Pendant qu’on y est, pourquoi pas d’auto-chargement en Ruby ? Si je charge X::Y::Z, j’aimerai bien que le langage se charge tout seul d’aller chercher le fichier X/Y/Z.rb. Ça fonctionne dans quasiment tous les autres langages mais Ruby continue de faire du spaghetti d’inclusion manuelle de fichiers.
Blocs et fermetures lexicales
Les blocs sont *la* fonctionnalité qui me fait utiliser Ruby. On peut certes faire beaucoup de choses similaires avec des fonctions anonymes en Javascript ou en PHP mais c’est juste moins élégant (et ça compte beaucoup pour se sentir à l’aise).
Par contre, sérieusement, la réception des paramètres dans les blocs est vraiment peu lisible. Le choix de la barre verticale comme délimiteur est juste illisible.
Le pire arrive avec les fermetures lexicales. Ruby laisse bien trop facilement utiliser par erreur une variable venant de la portée parente. La syntaxe pour forcer une variable comme locale ajoute encore plus au côté non lisible. |x, y=3; z| ? sérieusement ?
À côté de ça PHP et Python proposent des variables en lecture seule, ce qui limite la casse. PHP impose même de déclarer explicitement les variables à importer de la portée parente au lieu de déclarer les variables locales. Difficile à imaginer en monde Ruby mais assez confortable au final.
Et vous ? qu’est-ce que vous changeriez en premier ?
-
Évolution de PHP – accesseurs
Il y a matière à se réjouir : Le développement et l’évolution du langage PHP a repris. Nous avons eu les fonctions anonymes, les espaces de nom, et quelques nouveautés bienvenues, souvent attendues de trèèèèès longue date.
Bref, ça bouge, bien. Nous avons cependant encore deux courants très opposés au niveau du langage : L’un qui souhaite le garder simple et « comme il est », avec souvent un historique quick’n dirty, et qui au final freine quasiment toutes les évolutions. L’autre qui souhaite le voir profondément changé, et reprendre les bonnes idées des autres langages, au risque de trop vouloir copier ces autres langages.
Si je devais caricaturer je dirai qu’une majorité des développeurs de PHP (surtout les historiques) sont ceux qui freinent, et qu’une majorité des utilisateurs actifs de PHP sont ceux qui poussent. Si ça bouge depuis PHP 5.3, c’est que l’excès du « on ne touche rien » a provoqué un trop grand ras-le-bol, et les développeurs de PHP ont été forcés de mettre de l’eau dans leur vin.
Malheureusement les deux courants existent toujours et rien n’a été tranché. On le voit très bien sur la RFC concernant les accesseurs : Une bonne partie des « contre » sont ceux que je qualifie de « développeurs historiques du langage », et une partie des « pour » sont ceux que je qualifie de « utilisateurs actifs dans le langage ».
Il est plus que temps de décider où l’on va, sinon nous allons continuer à avoir un Frankenstein.