Introduction
On vous a confiĂ© une base de code PHP, que vous lâayez demandĂ©e ou non. Vous ouvrez le premier fichier, vous y trouvez $this->, des ->, des :: et une fonction qui sâappelle htmlspecialchars, et vous vous demandez si câest bien le langage dont tout le monde vous a dit du mal.
En bonne partie, oui, mais pas celui dâaujourdâhui. Le PHP dont on vous a parlĂ© a existĂ©, et il a presque entiĂšrement disparu. Ce qui reste est un langage typĂ©, orientĂ© objet, avec ramasse-miettes, un gestionnaire de paquets, un style de code standardisĂ©, un Ă©cosystĂšme dâanalyse statique sĂ©rieux, une version par an chaque novembre, et un modĂšle dâexĂ©cution qui ne ressemble Ă rien de ce que vous avez utilisĂ© jusquâici. Ce modĂšle dâexĂ©cution est la seule chose que vous ayez vraiment Ă apprendre.
Ce qui était vrai
PHP est nĂ© en 1995 comme un jeu de gabarits avec un peu de logique dedans, et pendant sa premiĂšre dĂ©cennie il a Ă©tĂ© permissif jusquâĂ lâabsurde. Les variables apparaissaient de nulle part, "abc" == 0 valait vrai, les erreurs sâimprimaient dans la page et lâexĂ©cution continuait, les requĂȘtes SQL se construisaient par concatĂ©nation, et la bibliothĂšque standard sâest assemblĂ©e une fonction Ă la fois, au grĂ© des besoins de chacun, ce qui explique que strpos voisine avec str_replace et array_key_exists avec in_array.
Toute une gĂ©nĂ©ration a appris Ă programmer sur ce PHP-lĂ , en a Ă©crit Ă©normĂ©ment, et une bonne partie de ce code tourne encore. Câest de ce PHP que parlent les blagues.
Ce qui a changé
PHP 7 (2015) a doublĂ© les performances et ajoutĂ© les dĂ©clarations de types scalaires. PHP 8 (2020) a apportĂ© un vrai systĂšme de types avec les types union, match, les arguments nommĂ©s, les attributs, les Ă©numĂ©rations, readonly, les callables de premiĂšre classe et un compilateur JIT. PHP 8.4 a ajoutĂ© les hooks de propriĂ©tĂ© et la visibilitĂ© asymĂ©trique, et PHP 8.5 un opĂ©rateur pipe. Dans le mĂȘme mouvement, les rĂšgles de comparaison ont Ă©tĂ© corrigĂ©es, les propriĂ©tĂ©s dynamiques dĂ©prĂ©ciĂ©es, les vieilles fonctions mysql_* supprimĂ©es, et lâinterprĂ©teur lĂšve dĂ©sormais une TypeError lĂ oĂč il devinait.
Autour du langage, la communautĂ© a construit Composer, le gestionnaire de paquets que tout projet utilise ; les standards du PHP-FIG, pour que les bibliothĂšques dâauteurs diffĂ©rents sâemboĂźtent ; PHPUnit et Pest pour les tests ; PHPStan et Psalm, deux analyseurs statiques qui vous donnent lâessentiel de ce quâun compilateur donnerait ; et Rector, qui réécrit le vieux code en syntaxe moderne. Depuis 2021, la PHP Foundation salarie des dĂ©veloppeurs du cĆur du langage, pour que son avenir ne dĂ©pende plus des soirĂ©es de bĂ©nĂ©voles.
Ce qui pique encore
Tout nâa pas Ă©tĂ© corrigĂ©, et un livre pour gens pressĂ©s doit le dire dâemblĂ©e. Les chaĂźnes sont des suites dâoctets, donc strlen('Ă©') vaut 2 et il vous faut les fonctions mb_ dĂšs quâil sâagit de texte. La bibliothĂšque standard garde ses noms et ses ordres dâarguments incohĂ©rents, == convertit toujours ses opĂ©randes, quoique bien moins sauvagement quâavant, le typage strict est un interrupteur par fichier quâil faut activer, les tableaux se copient Ă lâaffectation, et le langage lui-mĂȘme nâa pas de gĂ©nĂ©riques. Chacun de ces points a une pratique moderne qui le neutralise, et chacun est traitĂ© au chapitre oĂč vous le rencontrerez.
La rĂ©putation de PHP est restĂ©e en 2010, alors que le langage a continuĂ© dâavancer.
LâidĂ©e Ă saisir en premier
Une requĂȘte web PHP dĂ©marre sans rien, exĂ©cute votre code de haut en bas, envoie sa rĂ©ponse et jette tout. Il nây a pas de mĂ©moire partagĂ©e entre les requĂȘtes, pas dâobjet application qui reste en vie, pas de boucle dâĂ©vĂ©nements et pas de threads : le serveur web tend une requĂȘte Ă PHP, PHP produit une rĂ©ponse, puis oublie tout ce quâil vient de faire.
Si vous venez de Node, de Java, de Go ou dâun serveur Python ASGI, câest la diffĂ©rence la plus importante, et la plupart des idiomes PHP en dĂ©coulent : lâabsence de pool de connexions par dĂ©faut, « lâĂ©tat global » qui nâest quâune notion par requĂȘte, le plantage qui nâaffecte quâun visiteur, la montĂ©e en charge par ajout de processus, lâexistence dâOPcache, et les serveurs PHP persistants comme FrankenPHP ou RoadRunner qui forment un sujet Ă part entiĂšre. Comment PHP sâexĂ©cute traite tout cela, et câest le seul chapitre Ă ne pas sauter.
Comment lire ce livre
Chaque chapitre rĂ©pond Ă une question et se suffit Ă lui-mĂȘme. Les phrases en gras portent le fil : en ne lisant que celles-lĂ , vous obtenez le delta entre PHP et ce que vous connaissez dĂ©jĂ . Les blocs de code vous donnent la syntaxe, et le reste du texte est lĂ pour le jour oĂč un dĂ©tail compte pour vous.
Les comparaisons avec Python, JavaScript, Java et quelques autres langages sont des points de repĂšre, pas des traductions, et vous pouvez sauter celles des langages que vous ne connaissez pas sans rien perdre de lâexplication.
Chaque exemple tourne sur une installation nue de PHP avec php fichier.php, sans framework ni bibliothĂšque, pour que la leçon porte sur PHP lui-mĂȘme. Installez dâabord PHP : votre gestionnaire de paquets lâa, php.net liste les builds officiels, et lâimage Docker officielle est php:8.5-cli. Gardez ensuite un terminal ouvert et exĂ©cutez ce que vous lisez.
Trois chapitres sâadressent Ă un lecteur en particulier. Revenir Ă PHP aprĂšs des annĂ©es fait correspondre les vieilles habitudes aux pratiques modernes, pour ceux qui reviennent au langage. Venir de Python, JavaScript ou Java est une table de correspondance, et PHP 8.0 Ă 8.5 en un coup dâĆil vous dit ce que la version PHP de votre projet sait faire.
Dans deux ou trois heures, la base de code que vous avez ouverte aura changĂ© dâaspect : pas forcĂ©ment plus simple, mais lisible.