Aller au contenu

PHP

Un article de Wikipédia, l'encyclopédie libre.

PHP
Logo.
Image illustrative de l’article PHP

Date de première version 1995[1]
Paradigmes Impératif,orienté objet,fonctionnel,procédural,réflexifetinterprété
Auteur Rasmus Lerdorf
Développeurs The PHP Group
Dernière version 8.3.9 ()[2]Voir et modifier les données sur Wikidata
Version en développement 8.4.0 Alpha 1 ()[3]Voir et modifier les données sur Wikidata
Typage Dynamique,Faible
Influencé par C/C++
Java
Perl[4]
Écrit en CVoir et modifier les données sur Wikidata
Système d'exploitation Multi-plateforme
Licence Licence libre:
Licence PHP[5]
Site web https://www.php.net/
Extension de fichier php et pharVoir et modifier les données sur Wikidata

PHP: Hypertext Preprocessor[6],plus connu sous son siglePHP(sigle auto-référentiel), est unlangage de programmationlibre[7],principalement utilisé pour produire despages Web dynamiquesvia unserveur web[6],mais pouvant également fonctionner comme n'importe quellangage interprétéde façon locale. PHP est unlangage impératiforienté objet.

PHP a permis de créer un grand nombre de sites web célèbres, commeFacebooketWikipédia[8].Il est considéré comme une des bases de la création de sites web ditsdynamiquesmais également desapplications web.

Présentation

[modifier|modifier le code]

PHP est unlangage de script utilisé le plus souvent côté serveur:dans cette architecture, leserveurinterprète le code PHP des pages web demandées et génère du code (HTML,XHTML,CSSpar exemple) et des données (JPEG,GIF,PNGpar exemple) pouvant êtreinterprétésetrenduspar unnavigateur web.PHP peut également générer d'autres formats comme leWML,leSVGet lePDF.

Il a été conçu pour permettre la création d'applications dynamiques, le plus souvent développées pour leWeb.PHP est le plus souventcoupléà un serveurApachebien qu'il puisse être installé sur la plupart desserveurs HTTPtels queIISounginx.Ce couplage permet de récupérer des informations issues d'unebase de données,d'unsystème de fichiers(contenu de fichiers et de l'arborescence) ou plus simplement des données envoyées par lenavigateurafin d'être interprétées ou stockées pour une utilisation ultérieure.

C'est un langage peutypéet souple et donc facile à apprendre par un débutant mais, de ce fait, des bugs et des failles de sécurité peuvent rapidement apparaître dans les applications. Pragmatique, PHP ne s'encombre pas de théorie et a tendance à choisir le chemin le plus direct. Néanmoins, lenom des fonctions(ainsi que le passage des arguments) ne respecte pas une logique uniforme, ce qui peut être préjudiciable à l'apprentissage.

Son utilisation commence avec le traitement des formulaires puis par l'accès auxbases de données.L'accès aux bases de données est aisé une fois l'installation des modules correspondants effectuée sur le serveur. La force la plus évidente de ce langage est qu'il a permis au fil du temps la résolution aisée de problèmes autrefois compliqués et est devenu par conséquent un composant incontournable des offres d'hébergements.

Il estmulti-plateforme:autant surLinuxqu'avecWindowsil permet aisément de reconduire le mêmecodesur un environnement à peu près semblable (quoiqu'il faille prendre en compte les règles d'arborescences de répertoires, qui peuvent changer).

Libre, gratuit, simple d'utilisation et d'installation, ce langage nécessite néanmoins une connaissance aiguë des problèmes de sécurité qui lui sont liés.

La version 5.3 a introduit de nombreuses fonctions nouvelles: lesespaces de noms(Namespace) — un élément fondamental de l'élaboration d'extensions,debibliothèqueset deframeworksstructurés, lesfonctions anonymes,lesfermetures,etc.

En 2018, près de 80 % des sites web utilisent le langage PHP sous ses différentes versions[9].

Le langage PHP fait l'objet, depuis plusieurs années maintenant, de rassemblements nationaux organisés par l'AFUP[10](l'Association Française des Utilisateurs de PHP), où experts de la programmation et du milieu se retrouvent pour échanger autour du PHP et de ses développeurs. L'association organise ainsi deux évènements[11]majeurs: le « Forum PHP », habituellement en fin d'année, et les « AFUP Day », qui ont lieu au cours du premier semestre, simultanément dans plusieurs villes.

Le langage PHP a été créé en1994parRasmus Lerdorfpour sonsite web.C'était à l'origine unebibliothèque logicielleenC[12]dont il se servait pour conserver une trace des visiteurs qui venaient consulter sonCV.Au fur et à mesure qu'il ajoutait de nouvelles fonctionnalités, Rasmus a transformé la bibliothèque en une implémentation capable de communiquer avec desbases de donnéeset de créer des applications dynamiques et simples pour leWeb.Rasmus a alors décidé, en1995,de publier son code, pour que tout le monde puisse l'utiliser et en profiter[13].PHP s'appelait alors PHP/FI (pourPersonalHomePage Tools/FormInterpreter). En1997,deux étudiants,Andi GutmansetZeev Suraski,ont redéveloppé le cœur de PHP/FI. Ce travail a abouti un an plus tard à la version 3 de PHP, devenu alorsPHP: Hypertext Preprocessor.Peu de temps après, Andi Gutmans et Zeev Suraski ont commencé la réécriture du moteur interne de PHP. C’est ce nouveau moteur, appeléZend Engine— le motZendest la contraction deZeevetAndi— qui a servi de base à la version 4 de PHP[14].

En2002,PHP est utilisé par plus de 8 millions de sites Web à travers le monde[15],en2007par plus de 20 millions[16]et en 2013 par plus de 244 millions[17].

De plus, PHP est devenu le langage deprogrammation web côté serveurle plus utilisé depuis plusieurs années:

Année Part de marché
2010 75 %
2013 75 %[18]
2016 82 %[19]
2022 78 %[20]

Enfin en 2010, PHP est le langage dont les logiciels open source sont les plus utilisés dans les entreprises, avec 57 % detaux de pénétration[21].

Depuiset le nouveau processus de livraison de PHP[22],le cycle de livraison de PHP se résume à une mise à jour annuelle comportant des changements fonctionnels importants. La durée de vie d'une branche est de 3 ans, laissant trois branches stables et maintenues (cela signifie que lorsqu'une nouvelle version de PHP 5.x sort, la version 5.x-3 n'est plus supportée).

La version 8.3, sortie le 23 novembre 2023, introduit de nouvelles fonctionnalités comme:

  • constantes de classe typées;
  • une nouvelle fonctionjson_validate();
  • clonage en profondeur des propriétés dereadonly;
  • nouvel attribut#[\Override];
  • récupération dynamique des constantes de classe et des membres de l’Enum;
  • nouvelle méthodegetBytesFromString();
  • nouvelles méthodesgetFloat()etnextFloat().

La version 8.2, sortie le 8 décembre 2022, introduit de nouvelles fonctionnalités comme:

  • les classes en lecture seule:readonly classsignifie que tous les arguments de son constructeur sont implicitement enreadonly;
  • les typesnull,trueetfalse;
  • les constantes dans les traits;
  • laforme normale disjonctivede type (combinaison de l'union et de l'intersection).

La version 8.1, sortie le 25 novembre 2021, introduit de nouvelles fonctionnalités comme:

  • les énumérations[23];
  • les fibers pour créer descoroutines[24];
  • la propriétéreadonlypour empêcher une variable d'être modifiée[25].

Sortie le,cette version majeure se démarque principalement par la fonctionnalité de «compilation à la volée» (Just-in-time compilation[26]) qui permet un gain de vitesse d'exécution de plus de 45 %[27]pour certaines applications Web. D'autres nouveautés sont également introduites comme:

  • la promotion des propriétés du constructeur[28];
  • les weakmaps[29];
  • la Stringable Interface[30];
  • l'expression throw[31].

La version 7.4 est sortie le[32].Elle vise à être maintenue jusqu'enet se démarque de ses précédentes versions par:

  • les propriétés typées 2.0[33];
  • le pré-chargement[34];
  • l'opérateur d'affectation de coalescence nulle[35];
  • improve openssl_random_pseudo_bytes[36];
  • les références faibles[37];
  • FFI (Foreign Function Interface)[38];
  • l'extension dehachageomniprésente[39];
  • le registre de hachage de mot de passe[40];
  • le fractionnement des chaînes multi-octets[41];
  • la réflexion sur les références[42];
  • le retrait de ext/wddx[43];
  • un nouveau mécanisme desérialisationd'objets personnalisés[44].

Le,la sortie de la version 7.3 mettait l'accent sur:

  • l'évolution de la syntaxeHeredocet Nowdoc[45];
  • la prise en charge de l'affectation de référence et de la déconstruction de tableau avec `list()`[46];
  • la prise en charge de PCRE2[47];
  • l'introduction de la fonction High Resolution Time `hrtime()` function[48].

Le,la version de PHP 7.2, qui utiliseZend Engine 2,a introduit unemodélisation objetplus performante, une gestion des erreurs fondée sur le modèle des exceptions, ainsi que des fonctionnalités de gestion pour les entreprises. PHP 5 apporte beaucoup de nouveautés, telles que le support deSQLiteainsi que des moyens de manipuler des fichiers et des structuresXMLbasés surlibxml2:

  • uneAPIsimple nomméeSimpleXML;
  • uneAPIDocument Object Modelassez complète;
  • une interfaceXPathutilisant les objets DOM et SimpleXML;
  • l'intégration de libxslt pour les transformationsXSLTvia l'extensionXSL;
  • une bien meilleure gestion des objets par rapport à PHP 4, avec des possibilités qui tendent à se rapprocher de celles deJava.

Version 7 (PHP7)

[modifier|modifier le code]

Au vu des orientations différentes prises par le langage de celles prévues par PHP 6, une partie des développeurs propose de nommer la version succédant à PHP 5 « PHP 7 » au lieu de « PHP 6 ». Un vote parmi les développeurs valide cette proposition par 58 voix contre 24[49].

PHP 7.0.0 est sorti en.

La nouvelle version propose une optimisation du code et, d'après la société Zend, offre des performances dépassant celles demachines virtuellescommeHHVM[50],[51].Lesbenchmarksexternes montrent des performances similaires pour HHVM et PHP 7, avec un léger avantage d'HHVM dans la plupart des scénarios[52].

PHP 6 et Unicode

[modifier|modifier le code]

En 2005, le projet de faire de PHP un langage fonctionnant d'origine en Unicode a été lancé par Andrei Zmievski, ceci en s'appuyant sur la bibliothèqueInternational Components for Unicode(ICU) et en utilisant UTF-16 pour représenter les chaînes de caractères dans le moteur[53].

Étant donné que cela représentait un changement majeur tant dans le fonctionnement du langage que dans le code PHP créé par ses utilisateurs, il fut décidé d'intégrer cela dans une nouvelle version 6.0 avec d'autres fonctionnalités importantes alors en développement[54].Toutefois, le manque de développeurs experts en Unicode ainsi que les problèmes de performance résultant de la conversion des chaînes de et vers UTF-16 (rarement utilisé dans un contexte web), ont conduit au report récurrent de la livraison de cette version[55].Par conséquent, une version 5.3 fut créée en 2009 intégrant de nombreuses fonctionnalités non liées à Unicode qui était initialement prévues pour la version 6.0, notamment le support des espaces de nommage (namespaces) et des fonctions anonymes. En,le projet 6.0 intégrant Unicode fut abandonné et la version 5.4 fut préparée afin d'intégrer la plupart des fonctionnalités non liées à l'Unicode encore dans la branche 6.0, telles que les traits ou l'extension des fermetures au modèle objet[56].

Le projet est depuis passé à un cycle de livraison prévisible (annuel) contenant des avancées significatives mais contenues tout en préservant au maximum la rétro-compatibilité avec le code PHP existant (5.4 en 2012, 5.5 en 2013, 5.6 prévue pour l'été 2014). Depuis[57],l'idée d'une nouvelle version majeure introduisant Unicode mais se basant sur UTF-8 (largement devenu depuis le standard du Web pour l'Unicode) et permettant certains changements pouvant casser la rétro-compatibilité avec du code PHP ancien est de nouveau discutée et les RFC sont maintenant triées selon leur implémentation en 5.x (évolutions ne causant pas ou marginalement de cassure de la rétro-compatibilité) ou dans la future version majeure (évolutions majeures du moteur et évolutions impliquant une non-compatibilité ascendante).

Il est à noter qu'historiquement, PHP disposait d'une configuration par défaut privilégiant la souplesse à la sécurité (par exemple register globals, qui a été activé par défaut jusqu'à PHP 4.2[58]). Cette souplesse a permis à de nombreux développeurs d'apprendre PHP mais le revers de la médaille a été que de nombreuses applications PHP étaient mal sécurisées. Le sujet a bien été pris en main par le PHPGroup qui a mis en place des configurations par défaut mettant l'accent sur la sécurité. Il en résultait une réputation de langage peu sécurisé,réputation d'insécurité qui n'a plus de raison d'être[réf. nécessaire].

Détail de l'historique complet des versions

[modifier|modifier le code]
Historique des versions
Version majeure Version mineure Support Date de sortie Notes
1.0 1.0.0 Ancienne version, non supportée Appelé officiellement « Personal Home Page Tools (PHP Tools) », outils pour page personnelle. C'est la première apparition du nom « PHP »[59].
2.0 2.0.0 Ancienne version, non supportée
3.0 3.0.0 Ancienne version, non supportée Passage d'une personne à une équipe de développeurs. Zeev Suraski et Andi Gutmans réécrivent la base de cette version[59].
4.0 4.0.0 Ancienne version, non supportée Ajout d'un système d'analyse syntaxiqueplus avancé appelé le Zend Engine. Ce moteur procède en deux étapes d'analyse puis d'exécution.
4.1.0 Ancienne version, non supportée Introduit lessuperglobals($_GET,$_POST,$_SESSION,etc.)
4.2.0 Ancienne version, non supportée Désactive register_globals par défaut. Les données en provenance du réseau ne sont plus insérées directement dans l'espace de nomglobal,réduisant ainsi les possibilités de failles de sécurité
4.3.0 Ancienne version, non supportée Introduit leCLI,en addition auCGI.
4.4.0 Ancienne version, non supportée Ajout du manuel (pages accessibles par la commandeman) pour les scriptsphpizeetphp-config.
5.0 5.0.0 Ancienne version, non supportée Zend Engine II avec un nouveau modèle objet[60].
5.1 5.1.0 Ancienne version, non supportée Amélioration de performances par l'introduction de variables de compilation dans un moteur PHP repensé[60].
5.2 5.2.0 Ancienne version, non supportée Activation par défaut de l'extension «filter»[60].
5.3 5.3.0 Ancienne version, non supportée [61] Support desespaces de noms;Late Static Bindings(résolution statique à la volée); étiquettes de saut (gotolimité);fermetures(closures);Native PHP archives(phar);ramasse-miettesde références cycliques; connexion persistante avecMySQLi,sqlite3; ajout de fileinfo en tant que remplacement de mime_magic pour un meilleur support deMIME;raccourci pour l’opérateur ternaire (?:);fonctions anonymes;nombreuses corrections de bogue[62]...
5.3.3 Ancienne version, non supportée IntroduitPHP-FPM[63]
5.4 5.4.0 Ancienne version, non supportée Support destraits;syntaxe courte des tableaux introduite; accès aux index de tableaux en sortie de fonctions; les fermetures supportent $this; <?= toujours disponible; accès aux attributs d'un objet dès l'instanciation; ajout syntaxe Class::{expr}(); ajout format de nombres binaires; suivi des envois de fichiers via l'extension de session; serveur web embarqué en CLI[64]dédié au développement; support deDtrace;suppression des extensionsmagic quotes,safe_mode,register_globalsetregister_long_array[64].
5.4.26 Ancienne version, non supportée Ajout deldap_modify_batch()
5.5 5.5.0 Ancienne version, non supportée Support desgénérateurset descoroutines;ajout d'uneAPIdehachagedes mots de passe; intégration en standard du système decacheZend OPcache[65];correction de nombreux bogues; arrêt du support deWindows XPetWindows Server 2003;mise à jour de la bibliothèqueGD;les fonctions mysql_ sont maintenant considérées comme obsolètes (mise en avant de mysqli_ et de PDO_MySQL).
5.5.4 Ancienne version, non supportée Amélioration de fputcsv().
5.5.5 Ancienne version, non supportée Nouvelle fonction opcache_compile_file(), support du système GNU Hurd, ajout du type MIME application/pdf dans le serveur de développement.
5.5.6 Ancienne version, non supportée Amélioration des performances de array_merge() et func_get_args().
5.5.7 Ancienne version, non supportée Ajout du support de getallheaders() et de types MIME dans le serveur de développement, ajout de apache_response_headers().
5.5.10 Ancienne version, non supportée Passage à PCRE 8.34. Ajout deldap_modify_batch()
5.5.13 Ancienne version, non supportée Ajout des types MIME xsl/xml au serveur de développement intégré.
5.6 5.6.0 Ancienne version, non supportée Nouvelle syntaxe pour lesfonctions à paramètres variableset dépaquetage de paramètres, importation de fonctions au sein d'espaces de noms,intégration dudébogueurphpdbg en standard, amélioration de l'extension zip, expressions acceptées pour la définition de constantes, amélioration de la gestion desdonnées POST,support de lasurcharge d'opérateursdans le Zend Engine, nouvelle méthode magique __debugInfo() fournissant des informations de débogage sur les objets, améliorations diverses sur le support deSSL/TLS,ajout de l'opérateur d'exponentiation«**», téléchargements de poids supérieur à 2Godésormais supportés.
5.6.32 Ancienne version, non supportée Correction de 3 bogues (Date, mcrypt, PCRE)
5.6.33 Ancienne version, non supportée Correction de 2 bogues (GD, Phar)
7.0 7.0.0 Ancienne version, non supportée Performance améliorée grâce au moteur « phpng » (jusqu'à deux fois plus rapide que PHP 5.6), support homogène des architectures 64 bits, ajout d'exceptionspermettant d'intercepter des erreurs fatales, ajout des opérateurs «??» (dit «null coalescing(en)») et «<=>» (dit « combined comparison »), possibilité de déclarer explicitement le type retourné par une fonction ainsi que les types scalaires des arguments, support des classes anonymes[66]...
7.0.25 Ancienne version, non supportée [67] Correction de 14 bogues.
7.0.26 Ancienne version, non supportée [68] Correction de 18 bogues.
7.0.27 Ancienne version, non supportée Correction de 11 bogues.
7.0.28 Ancienne version, non supportée Correction de bogues.
7.0.29 Ancienne version, non supportée Correction de 1 bogue.
7.0.30 Ancienne version, non supportée Correction de 4 bogues.
7.0.31 Ancienne version, non supportée Correction de 3 bogues.
7.0.32 Ancienne version, non supportée Correction de 1 bogues: Apache2 (XSS)
7.0.33 Ancienne version, non supportée Correction de 5 bogues: Core, IMAP, Phar
7.1 7.1.0 Ancienne version, non supportée Types nullables(en),type de retourvoid,pseudo-typeiterable,visibilité des constantes de classes, améliorations delist(),catch de plusieurs types d'exception,etc.[69]
7.1.1 Ancienne version, non supportée [70] Correction de 33 bogues et optimisation mémoire de mysqlnd.
7.1.3 Ancienne version, non supportée [71] Correction de 24 bogues.
7.1.11 Ancienne version, non supportée [72] Correction de 19 bogues.
7.1.12 Ancienne version, non supportée [73] Correction de 18 bogues.
7.1.13 Ancienne version, non supportée Correction de 20 bogues.
7.1.14 Ancienne version, non supportée Correction de bogues.
7.1.15 Ancienne version, non supportée Correction de 12 bogues.
7.1.16 Ancienne version, non supportée Correction de 9 bogues.
7.1.17 Ancienne version, non supportée Correction de 14 bogues.
7.1.18 Ancienne version, non supportée Correction de 6 bogues.
7.1.19 Ancienne version, non supportée Correction de 6 bogues.
7.1.20 Ancienne version, non supportée Correction de 15 bogues.
7.1.21 Ancienne version, non supportée Correction de 16 bogues sur: Calendar, Filter, PDO_Firebird, PDO_PgSQL, SQLite3, Standard & Zip
7.1.22 Ancienne version, non supportée 13 sept 2018 Correction de 20 bogues sur: Core, Apache2, Bz2, gettext, iconv, intl, libxml, mbstring, Opcache, OpenSSL, phpdbg, SPL, Standard & libzip
7.1.23 Ancienne version, non supportée Correction de 11 bogues sur: Core, cURL, iconv, Opcache, POSIX, Reflection, Standard, Zlib
7.1.24 Ancienne version, non supportée Correction de 11 bogues sur: Core, date, FCGI, FTP, intl, Standard, Tidy, XML
7.1.25 Ancienne version, non supportée 06 decembre 2018 Correction de 13 bogues sur: Core, FTP, iconv, IMAP, OBDC, Opcache, Phar, PGSQL, SOAP, Sockets
7.2 7.2.0 Ancienne version, correctifs de sécurité uniquement [74] Ajout de l'interfaceCountable,de la constantePHP_OS_FAMILY,etc.
7.2.1 Ancienne version, correctifs de sécurité uniquement [75] Correction de 21 bogues.
7.2.2 Ancienne version, correctifs de sécurité uniquement [75] Correction de 25 bogues.
7.2.3 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 18 bogues.
7.2.4 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 16 bogues.
7.2.5 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 18 bogues.
7.2.6 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 8 bogues.
7.2.7 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 7 bogues.
7.2.8 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 19 bogues.
7.2.9 Ancienne version, correctifs de sécurité uniquement 16 aout 2018[75] Corrections de 9 bogues.
7.2.10 Ancienne version, correctifs de sécurité uniquement 13 sept 2018[75] Corrections de 19 bogues.
7.2.11 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 13 bogues.
7.2.12 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 20 bogues.
7.2.13 Ancienne version, correctifs de sécurité uniquement [75] Corrections de 16 bogues.
7.2.14 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.15 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.16 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.31 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.32 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.33 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.2.34 Ancienne version, correctifs de sécurité uniquement [75] Corrections de bogues.
7.3 7.3.0 Ancienne version, améliorations et correctifs de sécurité [76] Syntaxe Heredoc et Nowdoc plus flexibles, virgule de fin dans l’appel de fonction,JSON_THROW_ON_ERROR,affectation par référence avec la fonctionlist(),is_countable(),array_key_first()etarray_key_last(),algorithme de hachageArgon2id,etc.[77]
7.3.1 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.2 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.3 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.4 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.5 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.6 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.7 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.8 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.9 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.10 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.11 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.12 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.13 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.14 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.15 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.16 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.17 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.18 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.19 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.20 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.21 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.22 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.23 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.3.24 Ancienne version, améliorations et correctifs de sécurité [76] Corrections de bogues.
7.4 7.4.0 Ancienne version, améliorations et correctifs de sécurité Propriétés typées 2.0, préchargement, opérateur d’affectation par coalescence nulle,openssl_random_pseudo_bytespeut lancer une exception, ajout des références faibles, l’extension de hash de l’interface FFI (Foreign Function Interface) est toujours obligatoire, registre des hashs de mots de passe, split sur les chaînes multi‐octets, réflexion pour les références, unbundle ext/wddx, nouveau mécanisme de sérialisation personnalisée des objets et correction de multiples bogues[78].
7.4.1 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.2 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.3 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.4 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.5 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.6 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.7 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.8 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.9 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.10 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.11 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.12 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
7.4.13 Ancienne version, améliorations et correctifs de sécurité [78] Corrections de bogues.
8.0 8.0.0 Version actuelle, améliorations et correctifs de sécurité [79] « Compilation à la volée » (Just-in-time compilation[26]), unions de types, type « mixed », type de retour « static », paramètres nommés, opérateur « nullsafe », mot-clé « match »,...
8.1 8.1.0 Version actuelle, améliorations et correctifs de sécurité 25 novembre 2021
8.1.1 Version actuelle, améliorations et correctifs de sécurité 16 décembre 2021 Corrections de bogues.
8.1.2 Version actuelle, améliorations et correctifs de sécurité 21 janvier 2022 Corrections de bogues.
8.1.3 Version actuelle, améliorations et correctifs de sécurité 17 février 2022 Corrections de bogues.
8.1.4 Version actuelle, améliorations et correctifs de sécurité 17 mars 2022 Corrections de bogues.
8.1.5 Version actuelle, améliorations et correctifs de sécurité 14 avril 2022 Corrections de bogues.
8.1.6 Version actuelle, améliorations et correctifs de sécurité 12 mai 2022 Corrections de bogues.
8.2 8.2.0 8 décembre 2022
8.3 8.3.0 23 novembre 2023


Fonctionnement

[modifier|modifier le code]

PHP appartient à la grande famille des descendants duC,dont lasyntaxeest très proche. En particulier, sa syntaxe et sa construction ressemblent à celles des langagesJavaetPerl,à ceci près que du code PHP peut facilement être mélangé avec du codeHTMLau sein d'un fichier PHP.

Dans une utilisation destinée à l'internet, l'exécution du code PHP se déroule ainsi: lorsqu'un visiteur demande à consulter une page de site web, sonnavigateurenvoie une requête auserveur HTTPcorrespondant. Si la page est identifiée comme un script PHP (généralement grâce à l'extension.php), le serveur appelle l'interprètePHP qui va traiter et générer le code final de la page (constitué généralement d'HTMLou deXHTML,mais aussi souvent defeuilles de style en cascadeet deJS). Ce contenu est renvoyé au serveur HTTP, qui l'envoie finalement au client.

Ce schéma explique ce fonctionnement:

Une étape supplémentaire est souvent ajoutée: celle du dialogue entre PHP et labase de données.Classiquement, PHP ouvre une connexion au serveur deSGBDvoulu, lui transmet des requêtes et en récupère le résultat, avant de fermer la connexion.

Capture d'écran deVimen fond, affichant un script PHP, et à droite le résultat du script interprété par PHP

L'utilisation de PHP en tant que générateur de pages Web dynamiques est la plus répandue, mais il peut aussi être utilisé commelangage de programmationou de script en ligne de commande sans utiliser de serveur HTTP ni de navigateur. Il permet alors d'utiliser de nombreuses fonctions du langage C et plusieurs autres sans nécessiter de compilation à chaque changement du code source.

Pour réaliser en Linux/UNIX un script PHP exécutable en ligne de commande, il suffit comme enPerlou enBashd'insérer dans le code en première ligne leshebang:#! /usr/bin/php[80].Sous un éditeur de développement commeSciTE,même en Windows, une première ligne<?phpsuffit, si le fichier possède un type.php.

Il existe aussi une extension appeléePHP-GTKpermettant de créer des applications clientes graphiques sur un ordinateur disposant de la bibliothèque graphiqueGTK+,ou encore son alternativeWinBinder.

PHP possède un grand nombre de fonctions permettant des opérations sur lesystème de fichiers,exécuter des commandes dans leterminal,la gestion desbases de données,des fonctions detriethachage,le traitement dechaînes de caractères,la génération et la modification d'images, desalgorithmesdecompression...

Le moteur de Wikipédia,MediaWiki,est écrit en PHP et interagit avec une baseMySQLouPostgreSQL

Quelques exemples du traditionnelHello world:

<?php

echo'Hello World';

?>

echoétant une structure du langage, il est possible – et même recommandé – de ne pas mettre de parenthèses.

Il est aussi possible d'utiliser la version raccourcie:

<?='Hello World'?>

Résultat affiché:

Hello World

Le code PHP doit être inséré entre les balises<?phpet?>(la balise de fermeture est facultative en fin de fichier).

Il y existe d'autres notations pour les balises:

  • <?=et?>(notation courte avec affichage);
  • <?et?>(notation courte sans affichage non disponible en PHP 8);
  • <%et%>(notationASP);
  • <script language= "php" >et</script>(notation script).

Les notations autres que la standard (<?phpet?>)et la notation courte avec affichage (<?=et?>)sont déconseillées, car elles peuvent être désactivées dans la configuration du serveur (php.ini ou.htaccess): la portabilité du code est ainsi réduite.

Depuis PHP 7, les notations ASP et script ont été supprimées[81].La notation courte sans affichage reste déconseillée.

Les instructions sont séparées par des;(il n'est pas obligatoire après la dernière instruction) et les sauts de ligne ne modifient pas le fonctionnement du programme. Il serait donc possible d'écrire:

<?phpecho'Hello World';echo'Comment allez-vous?';echo'Il fait beau non?'?>

Pour des raisons de lisibilité, il est néanmoins recommandé d'écrire une seule instruction par ligne. Il est aussi préférable d'écrire le dernier;.

Structures de contrôle

[modifier|modifier le code]

Le code PHP est composé par des appels à des fonctions, dans le but d'attribuer des valeurs à des variables, le tout encadré dans des conditions, des boucles. Exemple:

<?php

// la fonction strtolower renvoie en minuscules la chaîne de caractères passée en paramètre
$lang=strtolower($_POST['lang']);

if($lang==='fr'){
echo'Vous parlez français!';
}elseif($lang==='en'){
echo'You speak English!';
}else{
echo'Je ne vois pas quelle est votre langue!';
}

Une condition est appliquée quand l'expression entre parenthèses est évaluée àtrue,et elle ne l'est pas dans le cas defalse.Sous forme numérique,0représente lefalse,et1(et tous les autres nombres) représentent letrue.

Le code précédent pourrait aussi être écrit de cette manière:

<?php

$lang=strtolower($_POST['lang']);
$isLangFr=$lang==='fr';
$isLangEn=$lang==='en';

if($isLangFr){
echo'Vous parlez français!';
}elseif($isLangEn){
echo'You speak English!';
}else{
echo'Je ne vois pas quelle est votre langue!';
}

Ici on teste l'égalité entre$langet'fr',mais pas directement dans leif:le test retourne un boolean (c'est-à-dire soittrue,soitfalse) qui est stocké dans la variable$is_lang_fr.On entre ensuite cette variable dans leifet celui-ci, selon la valeur de la variable, effectuera ou non le traitement.

Les blocsif,elseifetelsesont généralement délimités par les caractères{et},qui peuvent être omis, comme dans les codes précédents, lorsque ces blocs ne contiennent qu'une instruction.

Il est également possible d'écrireelse ifen deux mots, comme en C/C++.

Génération de code HTML

[modifier|modifier le code]

On peut générer du code HTML avec le script PHP, par exemple:

<?php

$nom='Albert';
echo'<div>Bonjour '.$nom.'!</div>';

Il est également possible d'utiliser une syntaxe alternative pour la structure if/else:

<?php

$nomsAutorises=['Albert','Bertrand'];
$nomEnCours='Eve';

?>

<?phpif(in_array($nomEnCours,$nomsAutorises)):?>
<p>Bonjour<?phpecho$nomEnCours;?>!</p>
<?phpelse:?>
<p>Vous n'êtes pas un utilisateur autorisé!</p>
<?phpendif;?>

Une autre approche consiste àconcaténerl'intégralité du code HTML dans une variable et de réaliser unechode la variable en fin de fichier:

<?php

$out='';

// On ajoute progressivement tout le code html
$out.='<p>a'.'b'.'c</p>';
$out.='<div class= "bottom" ><p>d'.'e'.'f</p></div>';

// On affiche le contenu
echo$out;

Dans le cas où l'utilisateur aura préféré l'utilisation de la commandeechoà la concaténation, il lui sera possible de capturer le flux en utilisant les fonctionsob_start()etob_get_clean():

<?php

// On place le flux dans un tampon
ob_start();

// On fait des affichages
echo'abc'."\n";
echo'def'."\n";
require_once'fichier.php';// De nombreux affichages (echo)

// On stoppe la mise en tampon, on récupère son contenu et on met le tampon à vide (pour une éventuelle prochaine tamporisation)
$out=ob_get_clean();

// On affiche le contenu du tampon
echo$out;

PHP, tout commeJavaScript,permet aussi de construire un modèle objet de document (DOM)[82],ce qui permet de créer ou modifier un document (X)HTML sans écrire de HTML, comme le montre l'exemple suivant:

<?php

$doctype=DOMImplementation::createDocumentType('html');
$dom=DOMImplementation::createDocument(null,'html',$doctype);
$html=$dom->documentElement;
$html->head=$dom->createElement('head');
$html->appendChild($html->head);
$html->head->title=$dom->createElement('title');
$html->head->title->nodeValue='Exemple de HTML';
$html->head->appendChild($html->head->title);
$html->head->charset=$dom->createElement('meta');
$html->head->charset->setAttribute('http-equiv','Content-Type');
$html->head->charset->setAttribute('content','text/html; charset=utf-8');
$html->head->appendChild($html->head->charset);
$html->body=$dom->createElement('body');
$html->appendChild($html->body);
$html->body->p=$dom->createElement('p');
$html->body->p->nodeValue='Ceci est un paragraphe.';
$html->body->appendChild($html->body->p);
$html->body->p->br=$dom->createElement('br');
$html->body->p->appendChild($html->body->p->br);
$html->body->p->a=$dom->createElement('a');
$html->body->p->a->nodeValue='Ceci est un lien.';
$html->body->p->a->setAttribute('href','cible.html');
$html->body->p->appendChild($html->body->p->a);

echo$dom->saveHTML();

Qui crée le code HTML suivant:

<!DOCTYPE html>
<html>
<head>
<title>Exemple de HTML</title>
<metahttp-equiv="Content-Type"content="text/html; charset=utf-8">
</head>
<body><p>Ceci est un paragraphe.<br><ahref="cible.html">Ceci est un lien.</a></p></body>
</html>

Cette méthode est cependant peu utilisée pour générer un document complet, on l'utilise généralement pour générer un fichierXML.

La commandephpinfo()est aussi utilisée pour générer un code HTML décrivant les paramètres du serveur; elle est aussi très utilisée pour tester la bonne exécution du moteur d’exécution PHP.

Programmation orientée objet

[modifier|modifier le code]

Comme en C++ et en Java, PHP permet de programmer en orienté objet, en créant des classes contenant des attributs et des méthodes, qui peuvent être instanciées ou utilisées en statique.

Toutefois, PHP est un langage à héritage simple[83],c'est-à-dire qu'une classe ne peut hériter que d'au plus une seule autre classe (sinon il faut utiliser untraitpour simuler l'héritage multiple par composition). Cependant les interfaces peuvent en étendre plusieurs autres[84].

Voici un exemple de création d'une classe:

<?php

interfaceEtreVivant
{
// Cette méthode devra être déclarée dans les classes implémentant cette interface.
publicfunctionisDead():bool;
}

classPersoimplementsEtreVivant
{
publicconstintPV_INITIAL=2000;

privateint$pv=0;

// Constructeur: celui-ci est appelé lors de l'instanciation de l'objet.
// Ce constructeur possède un paramètre optionnel.
publicfunction__construct(int$pv=0)
{
if($pv<0||$pv>100000000){
$this->pv=self::PV_INITIAL;
}else{
$this->pv=$pv;
}
}

// Accesseurs
publicfunctiongetPv():int
{
return$this->pv;
}

// Implémentation de la méthode de l'interface.
publicfunctionisDead():bool
{
return$this->pv===0;
}
}

// Création d'une classe enfant de Perso
classMagicienextendsPerso
{
privateint$mana;
}

// Création d'une instance de classe
$mage=newMagicien(1000);

// Utilisation de l'objet
echo'Votre mage a '.$mage->getPv().' PV.';

// Constantes de classes
echo'Le PV par défaut attribué à un nouveau personnage est de '.Perso::PV_INITIAL.'.';

// Destruction de l'objet
unset($mage);
L'éléPHPant, la mascotte de PHP.

Comme de nombreux projets Open Source, PHP possède une mascotte. Il s'agit de l'éléPHPant, dessiné en 1998 par El Roubio[85].

El Roubio s'est inspiré de la ressemblance des lettres PHP avec unéléphantet du fait que deux des lettres du langage soient déjà présentes dans ce mot, ce qui a permis de créer le néologisme éléPHPant. Toutes les œuvres d'El Roubio sont distribuées sous licenceGNU GPL.Unepeluchede l'ÉléPHPant[86]bleu existe. D'autres versions ont vu le jour ces dernières années (rose, jaune, rouge, violet et orange) sous l'impulsion de sociétés (PHP Architect ou Zend Technologies) ou de groupes utilisateurs comme PHP Women ou PHPAmsterdam.

Le site afieldguidetoelephpants.net recense tous les éléphpants existants[87].

Exemples d'application

[modifier|modifier le code]

Un serveur Web enarchitecture trois tiersest composé d'unsystème d'exploitation,unserveur HTTP,unlangage serveuret enfin unsystème de gestion de base de données(SGBD), cela constituant une plate-forme.

Dans le cas de PHP comme langage serveur, les combinaisons les plus courantes sont celles d'une plateformeLAMP(pour Linux Apache MySQL PHP) etWAMP(Windows Apache MySQL PHP). Une plate-forme WAMP s'installe généralement par le biais d'un seul logiciel qui intègre Apache, MySQL et PHP, par exempleEasyPHP,VertrigoServ,WampServerou UwAmp. Il existe le même type de logiciels pour les plates-formes MAMP (Mac OS Apache MySQL PHP), à l'exemple du logicielMAMP.

Il existe d'autres variantes, par exemple les plates-formes LAPP (le M de MySQL est remplacé par le P dePostgreSQL) ou encore le logicielXAMPP(Apache MySQL Perl PHP; le X indique que le logiciel estmultiplate-forme), un kit de développement multiplate-forme.

On peut décliner une grande variété d'acronymes sous cette forme. Des confusions peuvent parfois exister entre la plate-forme en elle-même et le logiciel permettant de l'installer, si elles ont le même nom. Il faut également remarquer que la grande majorité des logiciels « tout en un » sont destinés au développement d'applications Web en local, et non à être installés sur des serveurs Web. Une exception à cette règle est peut-être Zend Server, le serveur distribué parZend Technologies,qui est prévu pour fonctionner aussi bien en environnement de développement que de production.

Accélération

[modifier|modifier le code]

PHP est à la base un langage interprété, ce qui est au détriment de la vitesse d'exécution du code. Sa forte popularité associée à son utilisation sur des sites Web à très fort trafic (Yahoo,Facebook[89]) ont amené un certain nombre de personnes à chercher à améliorer ses performances pour pouvoir servir un plus grand nombre d'utilisateurs de ces sites Web sans nécessiter l'achat de nouveaux serveurs.

La réécriture du cœur de PHP, qui a abouti auZend Enginepour PHP 4 puis au Zend Engine 2 pour PHP 5, est une optimisation. Le Zend Engine compile en interne le code PHP enbytecodeexécuté par unemachine virtuelle.Les projetsopen sourceAPCeteAcceleratorfonctionnent en mettant le bytecode produit par Zend Engine encacheafin d'éviter à PHP de charger et d'analyser les scripts à chaque requête. À partir de la version 5.5 de PHP, le langage dispose d'un cache d'opcode natif (appelé OpCache) rendant obsolète le module APC.

Il existe également des projets pourcompilerdu code PHP:

Notes et références

[modifier|modifier le code]
  1. «Histoire de php»
  2. aetb«Version 8.3.9»,(consulté le)
  3. «PHP 8.4.0 Alpha 1 available for testing»,(consulté le)
  4. «PHP: Préface - Manual», surwww.php.net.
  5. «source»
  6. aetb«Manuel PHP: Préface», surPHP.net(consulté le).
  7. (en)«La licence de PHP est reconnue libre par laFree Software Foundation»(consulté le)
  8. «Introduction à PHP», suropenclassrooms.com(consulté le).
  9. «PHP is dead…Viva le PHP! – Hacker Noon»,
  10. «Afup - Association française des utilisateurs de PHP», surafup.org(consulté le)
  11. «AFUP Day 2019», surevent.afup.org(consulté le)
  12. RasmusLerdorfI wonder why people keep writing that PHP was ever written in Perl. It never was. #php»[html],Twitter,(consulté le)
  13. «Google Groups», surgroups.google.com
  14. «Histoire de PHP», surPHP.net(consulté le).
  15. (en)«Netcraft web Server Survey - février 2002»(consulté le)
  16. «PHP: PHP Usage Stats», surwww.php.net
  17. «PHP just grows & grows - Netcraft», surnews.netcraft.com
  18. «Server-side programming language statistics»,
  19. «Server-side Programming Languages», w3techs,
  20. «Server-side Programming Languages», w3techs,
  21. «PHP and Perl crashing the enterprise party»
  22. «PHP: rfc:releaseprocess», surwiki.php.net
  23. «PHP: Enumerations - Manual», surwww.php.net(consulté le)
  24. «PHP: rfc:fibers», surwiki.php.net(consulté le)
  25. «PHP: rfc:readonly_properties_v2», surwiki.php.net(consulté le)
  26. aetb«PHP: rfc:jit», surwiki.php.net(consulté le)
  27. «PHP 8: toutes les infos sur la nouvelle version», surIONOS Digitalguide(consulté le)
  28. «Constructeurs et destructeurs»(consulté le)
  29. «PHP: rfc:weak_maps», surwiki.php.net(consulté le)
  30. «PHP: rfc:stringable», surwiki.php.net(consulté le)
  31. «PHP: rfc:throw_expression», surwiki.php.net(consulté le)
  32. (en)«Historique des sorties de PHP», surPHP.net(consulté le)
  33. «PHP: rfc:typed_properties_v2», surwiki.php.net(consulté le)
  34. «PHP: rfc:preload», surwiki.php.net(consulté le)
  35. «PHP: rfc:null_coalesce_equal_operator», surwiki.php.net(consulté le)
  36. «PHP: rfc:improve-openssl-random-pseudo-bytes», surwiki.php.net(consulté le)
  37. «PHP: rfc:weakrefs», surwiki.php.net(consulté le)
  38. «PHP: rfc:ffi», surwiki.php.net(consulté le)
  39. «PHP: rfc:permanent_hash_ext», surwiki.php.net(consulté le)
  40. «PHP: rfc:password_registry», surwiki.php.net(consulté le)
  41. «PHP: rfc:mb_str_split», surwiki.php.net(consulté le)
  42. «PHP: rfc:reference_reflection», surwiki.php.net(consulté le)
  43. «PHP: rfc:deprecate-and-remove-ext-wddx», surwiki.php.net(consulté le)
  44. «PHP: rfc:custom_object_serialization», surwiki.php.net(consulté le)
  45. «PHP: rfc:flexible_heredoc_nowdoc_syntaxes», surwiki.php.net
  46. «PHP: rfc:list_reference_assignment», surwiki.php.net
  47. «PHP: rfc:pcre2-migration», surwiki.php.net
  48. «PHP: hrtime – Manual», surphp.net
  49. Andrea Faulds, Zeev Suraski, «PHP RFC: Name of Next Release of PHP»,(consulté le)
  50. «PHP Next Generation is outperforming Facebook’s HHVM», surThe Zend Blog,(consulté le)
  51. Antoine Crochet-Damais, «Andi Gutmans (Zend Technologies): "PHP Next Generation est plus performant que HHVM de Facebook"», surLe Journal du Net,(consulté le)
  52. Zeev Suraski, «Benchmarking PHPNG!», surZeev's blog,(consulté le)
  53. (en)Andrei Zmievski, «PHP Unicode support design document (mailing list post)»,(consulté le).
  54. (en)«PHP 5.5 or 6.0»(consulté le).
  55. (en)Andrei Zmievski, «The Good, the Bad, and the Ugly: What Happened to Unicode and PHP 6»(consulté le).
  56. (en)Rasmus Lerdorf, «PHP 6 (mailing list post)»,(consulté le).
  57. (en)Adam Harvey, «Ruminations on PHP 5++ (message de liste de discussion)»,(consulté le).
  58. «Register Globals».
  59. aetb(en)«History of PHP», The PHP Group(consulté le)
  60. abetc(en)«PHP: PHP 5 ChangeLog», The PHP Group,(consulté le)
  61. (en)PHP 5.3.0 Released!
  62. (en)PHP 5.3.0 Changelog
  63. (en)FPM in 5.3
  64. aetb«PHP: Serveur web interne - Manual», surphp.net
  65. (en)PHP 5.5.0 released.
  66. (en)PHP 7.0.0 Released
  67. (en)[1]
  68. (en)[2]
  69. (en)PHP 7.1.0 Released
  70. (en)PHP 7.1.1 Released
  71. (en)PHP 7.1.3 Released
  72. (en)Released
  73. (en)Released
  74. (en)[3]
  75. abcdefghijklmnopqrsett(en)[4]
  76. abcdefghijklmnopqrstuvwxety(en)«PHP 7.3.x changeLogs», surwww.php.net(consulté le)
  77. «Nouveautés de PHP 7.3 – CODE|DESIGN•fr», surcodedesign.fr(consulté le)
  78. abcdefghijklmetn(en)«PHP 7.4.x changeLogs», surphp.net(consulté le)
  79. «PHP: todo:php80», surwiki.php.net(consulté le).
  80. /usr/bin/est le répertoire standard des fichiers binaires exécutables sur la plupart des distributions.
  81. (en)«PHP RFC: Remove alternative PHP tags»
  82. «PHP: DOM - Manual», surphp.net
  83. SébastienRohaut,Algorithmique: Techniques fondamentales de programmation (avec des exemples en PHP),Editions ENI,(lire en ligne)
  84. «PHP: Interfaces - Manual», surphp.net
  85. «Elroubio - elePHPant creator since 1995», surwww.elroubio.net
  86. elephpantAdopt your elePHPant!», surwww.elephpant.com
  87. «A field Guide to Elephpants»
  88. «IMAC - La seule formation publique d’ingénieur alliant Arts et Sciences», suringenieur-imac.fr(consulté le)
  89. «Facebook looks to fix PHP performance with HipHop virtual machine»
  90. HipHop for PHP: Move Fast«Copie archivée»(version dusurInternet Archive),Haiping Zhao le

Sur les autres projets Wikimedia:

Bibliographie

[modifier|modifier le code]

Articles connexes

[modifier|modifier le code]

Liens externes

[modifier|modifier le code]