Copyright @ 1997 - 2013 par le PHP Documentation Group. Ce document ne peut être redistribué qu'aux termes et aux conditions mentionnés dans la licence Open Publication License, version 1.0 ou plus récente. Une copie de la licence Creative Commons Attribution 3.0 est distribuée avec ce manuel ; la dernière version est disponible à » http://creativecommons.org/licenses/by/3.0/.
Dans le cas où vous seriez intéressés par la distribution partielle ou totale de ce document (modifié ou non) ou auriez des questions, merci de contacter les propriétaires du Copyright à » doc-license@lists.php.net. Notez que cette adresse courriel est directement redirigée vers une liste de diffusion publique et archivée.
PHP est un acronyme récursif, qui signifie "PHP: Hypertext Preprocessor" : c'est un langage de script HTML, exécuté côté serveur. Sa syntaxe est empruntée aux langages C, Java et Perl, et est facile à apprendre. Le but de ce langage est de permettre aux développeurs web d'écrire des pages dynamiques rapidement, mais vous pouvez faire beaucoup plus avec PHP.
Ce manuel est essentiellement une référence des fonctions, mais il contient aussi des informations de référence sur le langage, des explications sur les fonctionnalités principales de PHP et diverses informations supplémentaires.
Vous pouvez télécharger ce manuel sous divers formats, sur » http://www.php.net/download-docs.php. Plus d'informations sur ce manuel sont disponibles dans l'appendice À propos du manuel. Si vous voulez découvrir l'histoire de PHP.
Nous mettons en avant les personnes les plus actives dans la préface du manuel mais il y a bien plus de contributeurs qui nous aident actuellement dans notre travail ou qui ont fournis une aide précieuse au projet dans le passé. Il y a beaucoup d'inconnus qui nous ont aidés à travers leurs notes concernant les pages du manuel qui sont continuellement incluses dans le manuel, travail dont nous sommes très reconnaissants. La liste fournie ci-dessous est classée par ordre alphabétique.
Les contributeurs suivants ont eu un impact énorme en ajoutant du contenu dans le manuel : Bill Abt, Jouni Ahto, Alexander Aulbach, Daniel Beckham, Stig Bakken, Nilgün Belma Bugüner, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Peter Cowburn, Daniel Egeberg, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Justin Martin, Rafael Martinez, Rick McGuire, Moacir de Oliveira Miranda Júnior, Kalle Sommer Nielsen, Yasuo Ohgaki, Richard Quadling, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, Yannick Torres, Michael Wallner, Lars Torben Wilson, Jim Winstead, Jeroen van Wolffelaar et Andrei Zmievski.
Les contributeurs suivants ont énormément aidé dans l'édition du manuel : Stig Bakken, Gabor Hojtsy, Hartmut Holzgraefe et Egon Schmid.
Les mainteneurs actuellement les plus actifs sont : Daniel Brown, Nuno Lopes, Felipe Pena, Thiago Pojda et Maciek Sokolewicz.
Ces personnes ont également déployé énormément d'efforts dans le maintien des notes utilisateurs : Mehdi Achour, Daniel Beckham, Friedhelm Betz, Victor Boivie, Jesus M. Castagnetto, Nicolas Chaillan, Ron Chmara, Sean Coates, James Cox, Vincent Gevers, Sara Golemon, Zak Greant, Szabolcs Heilig, Oliver Hinckel, Hartmut Holzgraefe, Etienne Kneuss, Rasmus Lerdorf, Matthew Li, Andrew Lindeman, Aidan Lister, Hannes Magnusson, Maxim Maletsky, Bobby Matthis, James Moore, Philip Olson, Sebastian Picklum, Derick Rethans, Sander Roobol, Damien Seguy, Jason Sheets, Tom Sommer, Jani Taskinen, Yasuo Ohgaki, Jakub Vrana, Lars Torben Wilson, Jim Winstead, Jared Wyles et Jeroen van Wolffelaar.
PHP (officiellement, ce sigle est un acronyme récursif pour PHP: Hypertext Preprocessor) est un langage de scripts généraliste et Open Source, spécialement conçu pour le développement d'applications web. Il peut être intégré facilement au HTML.
Bien... mais qu'est ce que cela veut dire ? Un exemple :
Exemple #1 Exemple d'introduction
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Exemple</title>
</head>
<body>
<?php
echo "Bonjour, je suis un script PHP !";
?>
</body>
</html>
Au lieu d'utiliser des tonnes de commandes afin d'afficher du HTML (comme en
C ou en Perl), les pages PHP contiennent des fragments HTML dont du code
qui fait "quelque chose" (dans ce cas, il va afficher
"Bonjour, je suis un script PHP !").
Le code PHP est inclus entre
une balise de début
<?php et une balise de fin ?>
qui permettent au serveur web de passer en mode PHP.
Ce qui distingue PHP des langages de script comme le Javascript, est que le code est exécuté sur le serveur, générant ainsi le HTML, qui sera ensuite envoyé au client. Le client ne reçoit que le résultat du script, sans aucun moyen d'avoir accès au code qui a produit ce résultat. Vous pouvez configurer votre serveur web afin qu'il analyse tous vos fichiers HTML comme des fichiers PHP. Ainsi, il n'y a aucun moyen de distinguer les pages qui sont produites dynamiquement des pages statiques.
Le grand avantage de PHP est qu'il est extrêmement simple pour les néophytes, mais offre des fonctionnalités avancées pour les experts. Ne craignez pas de lire la longue liste de fonctionnalités PHP. Vous pouvez vous plonger dans le code, et en quelques instants, écrire des scripts simples.
Bien que le développement de PHP soit orienté vers la programmation pour les sites web, vous pouvez en faire bien d'autres usages. Lisez donc la section Que peut faire PHP ? ou bien le tutoriel d'introduction si vous êtes uniquement intéressé dans la programmation web.
Tout. PHP est principalement conçu pour servir de langage de script coté serveur, ce qui fait qu'il est capable de réaliser tout ce qu'un script CGI quelconque peut faire, comme collecter des données de formulaire, générer du contenu dynamique, ou gérer des cookies. Mais PHP peut en faire bien plus.
Il y a trois domaines différents où PHP peut s'illustrer.
PHP est utilisable sur la majorité des systèmes d'exploitation, comme Linux, de nombreuses variantes Unix (incluant HP-UX, Solaris et OpenBSD), Microsoft Windows, Mac OS X, RISC OS et d'autres encore. PHP supporte aussi la plupart des serveurs web actuels dont Apache, IIS et bien d'autres. Et ceci inclut tous les serveurs web qui peuvent utiliser le binaire PHP FastCGI, comme lighttpd et nginx. PHP fonctionne sous forme de module, ou comme processeur CGI.
Avec PHP vous avez le choix de votre système d'exploitation et de votre serveur web. De plus, vous avez aussi le choix d'utiliser la programmation procédurale ou objet (OOP), ou encore un mélange des deux.
Avec PHP, vous n'êtes pas limité à la production de code HTML. Les capacités de PHP lui permettent de générer aussi bien des images, des fichiers PDF, des animations Flash (avec l'aide des bibliothèques libswf et Ming) à la volée. Vous pouvez aussi générer facilement du texte, du code XML ou XHTML. PHP génère tous ces fichiers et les sauve dans le système de fichiers, ou bien les envoie directement au navigateur web.
Une des forces les plus significatives de PHP est qu'il supporte énormément de bases de données. Écrire une page web faisant appel à une base de données devient terriblement simple, en utilisant une des extensions spécifiques aux bases de données (i.e., pour mysql), ou utilisant une classe d'abstraction comme PDO, ou une connexion à n'importe quelle base de données supportant la connexion standard ouvert via l'extension ODBC. Les autres bases de données peuvent utiliser l'extension cURL ou sockets comme CouchDB.
PHP supporte de nombreux protocoles comme LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (sous Windows) et encore d'autres. Vous pouvez ouvrir des sockets réseau, et interagir avec n'importe quel autre protocole. PHP supporte le format complexe WDDX, qui permet de communiquer entre tous les langages web. En terme d'interconnexion, PHP supporte aussi les objets Java, et les utilise de manière transparente comme objets intégrés.
PHP possède des fonctionnalités utiles dans le traitement de texte, incluant les expressions rationnelles compatibles Perl (PCRE), ainsi que de nombres extensions et utilitaires pour analyser et accéder aux documents XML. PHP standardise toutes les extensions XML sur la solide base de libxml2, et étend le jeu de fonctionnalités en ajoutant le support de SimpleXML, XMLReader et XMLWriter.
Beaucoup d'autres extensions existent, catégorisées alphabétiquement et par catégorie. Et enfin, il existe des extensions PECL qui peuvent (ou pas) être documentées dans le manuel PHP, comme » XDebug.
Comme vous le voyez, cette page n'est pas assez grande pour lister toutes les puissantes fonctionnalités de PHP. Lisez la section sur l'installation de PHP et étudiez la liste de fonctions pour avoir plus de détails sur toutes ces technologies.
Dans cette section, nous voulons illustrer les principes de base de PHP dans une courte introduction. Ce chapitre traite uniquement de création de pages web dynamiques avec PHP, laissant de coté temporairement les autres possibilités de PHP. Voyez la section Ce que peut faire PHP pour plus d'informations.
Les pages web qui exploitent PHP sont traitées comme des pages HTML standards, et vous pouvez les créer, éditer et effacer tout comme vous le faites normalement avec des pages HTML classiques.
Dans ce tutoriel, nous présumons que vous avez un serveur web avec le support PHP activé, et que les fichiers terminés par l'extension .php sont traités par PHP. Sur la plupart des serveurs, c'est la configuration par défaut, mais n'hésitez pas à interroger votre administrateur système en cas de doute. Si votre serveur web supporte PHP, vous n'avez rien à faire. Simplement, créez un dossier, puis créez un fichier texte, avec l'extension .php : le serveur va automatiquement l'exécuter avec PHP. Il n'y a pas de compilation, ou d'installation compliquée. Gardez en tête que les fichiers sont comparables à des fichiers HTML, dans lesquels vous allez utiliser des balises magiques, qui feront beaucoup de choses pour vous. Beaucoup d'hébergeurs web proposent PHP mais si ce n'est pas le cas, lisez la section des » liens PHP pour trouver un hébergeur web le proposant.
Supposons que vous souhaitiez économiser du temps en ligne et travailler localement. Dans ce cas, vous devez installer un serveur web comme » Apache, et bien sur » PHP. Vous souhaiterez aussi installer une base de données comme » MySQL.
Vous pouvez soit installer ces logiciels individuellement ou bien d'une manière simplifiée. Notre manuel contient les instructions d'installation de PHP (en supposant que vous avez déjà un serveur web d'installé). Si vous rencontrez des problèmes dans l'installation de PHP, nous vous suggérons de poser vos questions sur notre » liste de diffusions réservée à cet usage. Si vous choisissez une version simplifiée, vous pouvez utiliser des » des installeurs qui prennent en charge l'ensemble de l'installation en quelques clics. Il est facile de configurer un serveur web avec le support de PHP sur n'importe quel système d'exploitation, y compris MacOs, Linux et Windows. Sous Linux, vous pouvez aussi trouver des commandes comme » rpmfind et » PBone très pratiques pour rechercher les paquets pré-compilés. Vous pouvez aussi visiter » apt-get, pour des paquets Debian.
Créez un fichier appelé bonjour.php dans votre dossier web racine (DOCUMENT_ROOT) avec le contenu suivant :
Exemple #1 Notre premier script PHP : bonjour.php
<html>
<head>
<title>Test PHP</title>
</head>
<body>
<?php echo '<p>Bonjour le monde</p>'; ?>
</body>
</html>
Utilisez votre navigateur pour accéder au fichier via votre serveur web, en ajoutant le nom de fichier /bonjour.php. Si vous développez localement, votre URL ressemblera à http://localhost/bonjour.php ou encore http://127.0.0.1/bonjour.php mais cela dépend de la configuration de votre serveur web. Si celui-ci est configuré correctement, le fichier sera analysé par PHP et le résultat suivant affiché :
<html> <head> <title>Test PHP</title> </head> <body> <p>Bonjour le monde</p> </body> </html>
Ce programme est extrêmement simple et vous n'avez pas besoin de PHP pour créer une page web comme ceci. Elle ne fait qu'afficher Bonjour le monde, grâce à la fonction echo de PHP. Notez que ce fichier n'a pas besoin d'être exécutable ou autre, dans aucun cas. Le serveur sait que ce fichier a besoin d'être interprété par PHP car vous utilisez l'extension ".php", et le serveur est configuré pour les passer à PHP. Voyez cela comme une page HTML normale qui contient une série de balises spéciales qui vont vous permettre de réaliser beaucoup de choses intéressantes.
Si vous avez essayé cet exemple et qu'il n'a rien affiché de spécial, ou même qu'une boîte de dialogue a surgi pour vous proposer de le télécharger, ou encore vous avez vu le code tel que nous l'avons écrit dans le fichier, alors votre serveur web ne supporte probablement pas PHP ou est mal configuré. Demandez à votre administrateur de l'activer pour vous, en utilisant le chapitre Installation. Si vous développez localement, lisez également le chapitre d'installation afin de vous assurer que tout est configuré correctement. Assurez-vous que vous tentez d'accéder au fichier via http et que le serveur web vous fournit la sortie. Si vous appelez votre fichier depuis votre gestionnaire de fichiers, il ne sera pas analysé par PHP. Si le problème persiste malgré cela, n'hésitez pas à utiliser une » des options de support de PHP.
Le point important de cet exemple était de montrer le format des balises spéciales PHP. Nous avons utilisé ici <?php pour indiquer le début de la balise PHP. Puis, nous avons introduit les commandes PHP et refermé les balises PHP avec ?>. Vous pouvez passer du mode PHP au mode HTML et vice-versa, de cette manière, et à votre guise. Pour plus d'informations, lisez la section du manuel sur la syntaxe basique de PHP.
Note: Une note sur les retours à la ligne
Les retours à la ligne ont une signification minime en HTML, cependant, c'est toujours une bonne idée de rendre votre HTML aussi joli et proche que possible en y ajoutant des retours à la ligne. Un retour à la ligne suivant immédiatement une balise de fermeture PHP (?>) sera supprimé par PHP. Ceci peut être vraiment très utile lorsque vous insérez plusieurs blocs PHP ou fichiers inclus contenant du PHP qui n'est pas supposé afficher quoi que ce soit. En même temps, ce peut être confus. Vous pouvez ajouter un espace après la balise fermante PHP (?>) pour forcer l'espace et un retour à la ligne à afficher, ou vous pouvez ajouter explicitement un retour à la ligne dans le dernier echo/print de votre bloc PHP.
Note: Une note sur les éditeurs de texte
Il existe de nombreux éditeurs de texte et environnements de développement (IDE) que vous pouvez utiliser pour créer, éditer et gérer vos applications PHP. Une liste partielle de ces outils est entretenue à l'adresse » PHP Editor's List. Si vous voulez recommander un éditeur particulier, rendez donc une visite à cette page, et demandez au webmestre d'ajouter votre éditeur. Avoir au minimum un éditeur de texte avec la coloration syntaxique est vivement recommandé.
Note: Une note sur les traitements de texte
Les traitements de texte tels que StarOffice Writer, Microsoft Word et Abiword sont de très mauvais choix pour éditer des scripts PHP. Si vous voulez utiliser l'un d'entre eux, malgré tout, pour tester vos scripts, vous devez vous assurer que vous sauvez les fichiers au format texte seul (plain text) : sinon, PHP ne sera pas capable de lire et d'exécuter ces scripts.
Note: Une note sur le Notepad de Windows
Si vous écrivez vos scripts PHP avec Windows Notepad, vous devez vous assurer que vos fichiers sont sauvés avec l'extension .php (Notepad ajoute automatiquement une extension .txt à vos fichiers, à moins que vous ne preniez l'une des mesures suivantes). Lorsque vous sauvez un fichier, et que vous êtes invité à lui donner un nom, placez le nom du fichier entre doubles guillemets (i.e. "hello.php"). Vous pouvez également cliquer dans le menu 'Documents texte' du dialogue de sauvegarde, et choisir l'option 'Tous les fichiers'. Vous pourrez alors saisir le nom de votre fichier sans les doubles guillemets.
Maintenant vous avez créé un script PHP qui fonctionne, c'est le moment de créer le meilleur script PHP ! Faites un appel à la fonction phpinfo() et vous verrez beaucoup d'informations intéressantes sur votre système et sa configuration comme les variables pré-définies disponibles, les modules PHP chargés ainsi que la configuration. Prenez du temps pour revoir ces informations importantes.
Exemple #2 Récupération des informations du système depuis PHP
<?php phpinfo(); ?>
Réalisons maintenant quelque chose de plus puissant. Nous allons vérifier le type de navigateur que le visiteur de notre site utilise. Pour cela, nous allons accéder aux informations que le navigateur du visiteur nous envoie, lors de sa requête HTTP. Cette information est stockée dans une variable. Les variables sont faciles à repérer, car elles commencent toutes par un signe dollar. La variable qui nous intéresse ici est $_SERVER['HTTP_USER_AGENT'].
Note:
$_SERVER est une variable spéciale de PHP, qui contient toutes les informations relatives au serveur web. C'est une variable réservée de PHP, et une superglobale. Reportez-vous aux pages du manuel traitant des Auto-globales (aussi connues sous le nom de super-globales). Ces variables spéciales ont été introduites en » PHP 4.1.0. Auparavant, il fallait utiliser les variables $HTTP_*_VARS, comme $HTTP_SERVER_VARS. Bien qu'obsolètes, ces variables existent toujours. (Voir aussi la note sur l'ancien code.)
Pour afficher cette variable, nous pouvons simplement faire :
Exemple #1 Afficher le contenu d'une variable (élément de tableau)
<?php
echo $_SERVER['HTTP_USER_AGENT'];
?>
Un résultat possible du script pourra alors être :
Il y a de nombreux types de variables disponibles en PHP. Dans l'exemple ci-dessus, nous avons affiché un élément de Tableau (Array). Les tableaux peuvent être très utiles.
$_SERVER est juste une variable qui est automatiquement disponible dans votre script. Une liste de toutes les variables qui sont rendues disponibles est fournie dans la section Variables réservées ou vous pouvez aussi en obtenir une liste complète en lisant l'affichage de la fonction phpinfo() utilisée dans l'exemple de la section précédente.
Vous pouvez ajouter plusieurs commandes PHP dans une balise PHP, et créer de petits blocs de code qui réalisent des opérations plus complexes qu'un simple affichage. Par exemple, si nous voulons vérifier que le navigateur est bien de la famille des Internet Explorer, nous pouvons faire cela :
Exemple #2 Exemple utilisant les structures de contrôle et les fonctions
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
echo 'Vous utilisez Internet Explorer<br />';
}
?>
Le résultat de ce script, si vous utilisez Internet Explorer, sera :
Vous utilisez Internet Explorer<br />
Ici, nous introduisons plusieurs nouveaux concepts. Nous avons une structure if. Si vous êtes familier avec les syntaxes de base du langage C, cela ne vous surprendra pas. Si vous ne connaissez pas assez le langage C ou un autre langage dont la syntaxe est similaire à celle ci-dessus, il vaudrait mieux que vous lisiez une introduction à PHP, et assimiliez les premiers chapitres, ou bien lisez le chapitre consacré à la référence du langage.
Le second concept que nous avons introduit est la fonction strpos().
strpos() est une fonction intégrée à PHP, qui recherche
la présence d'une chaîne dans une autre. Dans notre cas, nous
avons recherché la chaîne "MSIE" dans la chaîne
$_SERVER['HTTP_USER_AGENT']. Si cette
chaîne est trouvée, la fonction retourne sa position dans la chaîne et, sinon, FALSE.
Si elle ne retourne pas FALSE, la structure if
reçoit TRUE et le code entre accolades {} est exécuté. Sinon, le code n'est pas
exécuté. N'hésitez pas à
expérimenter d'autres exemples, à l'aide de
if,
else, et d'autres
fonctions comme strtoupper() et
strlen(). Chaque page de la documentation contient aussi
des exemples. Si vous n'êtes pas sûr de l'utilisation de ces fonctions, vous devez lire
la page du manuel
"comment lire une définition de fonction"
ainsi que la section sur les fonctions PHP.
Nous pouvons maintenant progresser et vous montrer comment utiliser le mode PHP, au milieu du code HTML :
Exemple #3 Passer du mode PHP au mode HTML et vice-versa
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() n'a pas retourné FALSE</h3>
<p>Vous utilisez Internet Explorer</p>
<?php
} else {
?>
<h3>strpos() a retourné FALSE</h3>
<p>Vous n'utilisez pas Internet Explorer</p>
<?php
}
?>
Un exemple de résultat obtenu dans ce script est :
<h3>strpos() n'a pas retourné FALSE</h3> <p>Vous utilisez Internet Explorer</p>
Au lieu d'utiliser une commande echo, pour afficher du texte, vous pouvez utiliser du code HTML pur. Le point important à noter ici et que la logique de programmation est conservée. Seul un des deux blocs HTML sera affiché, suivant le résultat de la fonction strpos(). En d'autres termes, cela dépend si la chaîne MSIE a été trouvée ou non.
L'un des points forts de PHP est sa capacité à gérer les formulaires. Le concept de base qui est important à comprendre est que tous les champs d'un formulaire seront automatiquement disponibles dans le script PHP d'action. Lisez le chapitre du manuel concernant les variables depuis des sources externes à PHP pour plus d'informations et d'exemples sur la façon d'utiliser les formulaires. Voici un exemple de formulaire HTML :
Exemple #1 Un simple formulaire HTML
<form action="action.php" method="post"> <p>Votre nom : <input type="text" name="nom" /></p> <p>Votre âge : <input type="text" name="age" /></p> <p><input type="submit" value="OK"></p> </form>
Il n'y rien de particulier dans ce formulaire. Il est en HTML pur, sans aucune configuration particulière. Lorsque le visiteur remplit le formulaire, et clique sur le bouton OK, le fichier action.php est appelé. Dans ce fichier, vous pouvez écrire le script suivant :
Exemple #2 Afficher des données issues d'un formulaire
Bonjour, <?php echo htmlspecialchars($_POST['nom']); ?>.
Tu as <?php echo (int)$_POST['age']; ?> ans.
Voici le résultat que vous pourriez obtenir, selon les valeurs que vous avez saisies :
Bonjour Jean. Tu as 29 ans.
Mise à part les parties htmlspecialchars() et (int), ce script ne fait que des choses évidentes. htmlspecialchars() s'assure que tous les caractères spéciaux HTML sont proprement encodés afin d'éviter des injections de balises HTML et de Javascript dans vos pages. Pour l'âge, vu que nous savons que c'est un entier, vous pouvez le convertir en un entier. Vous pouvez également demander à PHP de le faire automatiquement à votre place en utilisant l'extension filter. Les variables $_POST['nom'] et $_POST['age'] sont automatiquement créées par PHP. Un peu plus tôt dans ce tutoriel, nous avons utilisé la variable $_SERVER, une superglobale. Maintenant, nous avons introduit une autre superglobale $_POST qui contient toutes les données envoyées par la méthode POST. Notez que dans notre formulaire, nous avons choisi la méthode POST. Si vous avions utilisé la méthode GET alors notre formulaire aurait placé ces informations dans la variable $_GET, une autre superglobale. Vous pouvez aussi utiliser la variable $_REQUEST, si vous ne souhaitez pas vous embarrasser de la méthode utilisée. Elle contient un mélange des données de GET, POST, COOKIE et FILE. Voyez aussi la fonction import_request_variables().
Vous pouvez également utiliser des champs XForms dans PHP, même si vous vous sentez bien avec l'utilisation des formulaires HTML. Bien que le travail avec XForms ne soit pas fait pour les débutants, vous pourriez être intéressé par cette technologie. Nous avons également une courte introduction sur le traitement des données reçues par XForms dans notre section sur les fonctionnalités.
Maintenant que PHP est devenu un langage de script populaire, il existe de nombreuses ressources qui vous proposent des portions de code que vous pouvez réutiliser dans vos codes. Pour la plupart, les développeurs de PHP ont tâché d'assurer la compatibilité ascendante, ce qui fait que de nombreux scripts écrits pour les anciennes versions sont aussi valables pour les nouvelles versions de PHP, idéalement sans modification. En pratique, certaines modifications doivent être apportées.
Les deux modifications récentes les plus importantes qui affectent les anciens codes sont :
Avec ce que vous savez, vous êtes maintenant capable de comprendre l'essentiel de la documentation PHP, et les différents scripts d'exemples disponibles dans les archives. Vous pouvez aussi trouver d'autres exemples dans la section liens ("links", en anglais) du site » http://www.php.net/links.php.
Différentes présentations des capacités de PHP sont disponibles sur le site des conférences PHP : » http://talks.php.net/.
Avant d'installer PHP, vous devez savoir ce que vous voulez faire avec PHP. Il y a trois cas d'utilisation que vous a décrit la section Que peut faire PHP ? :
Pour la première tâche, qui est de loin la plus répandue, vous avez besoin de trois choses : PHP lui-même, un serveur Web et un navigateur. Vous avez probablement un navigateur, et en fonction de votre système d'exploitation, vous pouvez aussi disposer d'un serveur Web (i.e. Apache sous Linux ou IIS sous Windows). Vous pouvez aussi louer un espace à une société. De cette façon, vous n'aurez pas à mettre en place PHP, mais uniquement à écrire vos scripts, les charger sur le serveur et voir le résultat sur votre navigateur.
Si vous installez PHP et le serveur par vous-même, vous avez deux choix. Soit sous la forme d'un module du serveur Web (via une interface directe appelée SAPI). Les serveurs qui supportent cette solution comptent notamment Apache, Microsoft Internet Information Server, Netscape et iPlanet. D'autres serveurs ont aussi le support ISAPI, l'interface de module Microsoft (OmniHTTPd par exemple). Si PHP ne supporte pas l'interface de module de votre serveur Web, vous pouvez toujours l'utiliser comme processeur CGI ou FastCGI. Cela signifie que vous devez configurer votre serveur pour qu'il utilise l'exécutable CGI de PHP, pour qu'il traite les fichiers PHP sur le serveur.
Si vous souhaitez aussi utiliser PHP en ligne de commande (écrire des scripts de génération d'image hors ligne, par exemple, ou bien traiter des textes en fonctions d'informations que vous leur fourniriez), vous aurez besoin d'un exécutable PHP. Pour plus de détails, lisez la section écrire des applications PHP en ligne de commande. Dans ce cas, vous n'aurez pas besoin de serveur Web, ni de navigateur.
Avec PHP, vous pouvez aussi écrire des interfaces graphiques clientes, en utilisant l'extension PHP-GTK. C'est une approche complètement différente de l'écriture des pages web, car vous ne générerez pas de fichiers HTML, mais vous aurez à gérer des fenêtres et des objets. Pour plus de détails sur PHP-GTK, voyez le » site officiel. PHP-GTK n'est pas inclus dans la distribution officielle de PHP.
À partir de maintenant, cette section décrit l'installation de PHP avec un serveur Web sous Unix et Windows, sous forme de module ou d'exécutables CGI.
Les codes source et les exécutables compilés pour certains OS (y compris Windows), sont disponibles à » http://www.php.net/downloads.php. Nous recommandons l'utilisation du » miroir le plus proche pour télécharger les distributions.
Cette section va vous guider lors du processus d'installation et de configuration de PHP sous Unix. Commencez par étudier les sections spécifiques à votre plate-forme ou à votre serveur Web avant de passer à l'installation.
Comme ce que nous avons écrit dans le manuel dans la section Considérations générales sur l'installation, nous traiterons de l'installation de PHP sur des serveurs Web dans cette section, bien que nous couvrirons également la configuration de PHP pour l'utilisation en ligne de commande.
Il y a plusieurs manières d'installer PHP sur des plates-formes Unix : soit avec un processus de compilation/configuration, soit avec des paquets précompilés. Cette documentation est particulièrement focalisée sur le processus de compilation/configuration. Beaucoup de systèmes basés sur Unix ont plusieurs sortes de paquets d'installation pour leur système. Ils permettent de vous assister dans une configuration standard, mais si vous avez besoin d'avoir des fonctionnalités différentes (comme un serveur sécurisé ou un driver différent de bases de données), vous aurez besoin de construire PHP et/ou votre serveur Web. Si vous n'êtes pas familiarisé avec la construction et la compilation de vos propres logiciels, il sera plus simple de vérifier si quelque part, personne n'a déjà construit une version de paquet de PHP avec les fonctionnalités dont vous avez besoin.
Pré-requis :
Lors de la compilation depuis Git directement, ou après une modification des sources personnalisée, vous pourriez avoir aussi besoin de :
La configuration initiale de PHP et le processus de configuration sont contrôlés par l'utilisation du fichier configure et de ces options en lignes de commande. Vous pouvez récupérer une liste de toutes les options disponibles accompagnées d'une courte description en exécutant la commande ./configure --help. Notre manuel documente les différentes options séparément. Vous pouvez trouver les options internes en annexe, bien que les différentes options spécifiques à chaque extension sont décrites sur les pages de référence.
Lorsque PHP est configuré, vous êtes prêt à construire le module et/ou l'exécutable. La commande make devrait s'occuper de cela. Si elle échoue et que vous ne savez pas pourquoi, lisez la section Problèmes.
Cette section contient des notes spécifiques pour l'installation de PHP avec Apache sur les systèmes Unix. Des notes spécifiques pour Apache 2 sont aussi disponibles sur une page séparée.
Vous pouvez sélectionner des options à ajouter au fichier configure à la ligne 10 depuis la liste complète des options de configuration. Les numéros de versions ont été omis ici afin de s'assurer que les instructions ne soient pas incorrectes. Vous devrez donc remplacer les 'xxx' par les versions correctes de vos fichiers.
Exemple #1 Instructions d'installation de PHP (en module Apache)
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/www --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. Maintenant, configurez votre PHP. C'est le moment où vous configurez PHP
avec diverses options, comme les extensions qui seront activées. Lancez
./configure --help pour une liste des options disponibles. Dans notre exemple,
nous ferons un ./configure assez simple avec uniquement le support Apache et MySQL.
Votre chemin vers apxs peut être différent de notre exemple.
./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install
Si vous décidez de changer vos options de configuration après l'installation,
vous aurez juste besoin de répéter les trois dernières étapes. Vous aurez aussi besoin
de redémarrer apache pour que le nouveau module soit chargé. Une recompilation de
Apache n'est pas nécessaire.
Notez que, à moins de l'avoir explicitement désactivé, 'make install' installera aussi PEAR,
et des outils PHP tels que phpize, installera le CLI PHP, etc.
13. Configurez votre fichier php.ini :
cp php.ini-development /usr/local/lib/php.ini
Vous pouvez éditer votre fichier .ini pour régler certaines options PHP. Si vous souhaitez
votre php.ini à un autre endroit, utilisez --with-config-file-path=/votre/chemin lors de
l'étape 10.
Si vous utilisez plutôt php.ini-production, assurez-vous de lire l'ensemble des changements
qui y sont contenus, car ils modifient le fonctionnement de PHP.
14. Éditez votre httpd.conf afin de charger le module PHP. Le chemin dans la partie droite de la
directive LoadModule doit pointer vers l'endroit où se trouve le module PHP sur votre système.
Le make install lancé plus haut l'y aura certainement déjà déposé pour vous,
mais assurez vous en.
LoadModule php5_module libexec/libphp5.so
15. Et dans la section AddModule de httpd.conf, quelque part en dessous de
ClearModuleList, ajoutez ceci :
AddModule mod_php5.c
16. Dites à Apache de faire analyser certaines extensions par PHP. Par exemple,
faites analyser l'extension .php par PHP. Vous pouvez ajouter n'importe quelle(s)
extension(s) à analyser juste en l'(les)ajoutant à la suite, séparée(s) par un espace.
Nous ajouterons .phtml dans notre exemple.
AddType application/x-httpd-php .php .phtml
Il est assez fréquent de configurer l'extension .phps comme code source PHP colorisé,
ce qui peut être fait ainsi :
AddType application/x-httpd-php-source .phps
17. Utilisez votre méthode habituelle pour démarrer le serveur Apache.
(vous devez l'éteindre et le redémarrer, pas seulement lui envoyer
un signal HUP ou USR1.)
Alternativement, pour installer PHP en tant qu'objet statique :
Exemple #2 Instructions d'installation (installation en tant que module statique d'Apache) de PHP
1. gunzip -c apache_1.3.x.tar.gz | tar xf -
2. cd apache_1.3.x
3. ./configure
4. cd ..
5. gunzip -c php-5.x.y.tar.gz | tar xf -
6. cd php-5.x.y
7. ./configure --with-mysql --with-apache=../apache_1.3.x
8. make
9. make install
10. cd ../apache_1.3.x
11. ./configure --prefix=/www --activate-module=src/modules/php5/libphp5.a
(La ligne ci-dessus est correcte ! Oui, nous savons que libphp5.a n'existe pas à
ce moment. On ne le suppose pas non plus. Il sera créé.)
12. make
(vous devriez avoir maintenant un binaire httpd que vous pouvez copier dans votre
dossier de binaire Apache ; si c'est votre première installation, vous devez exécuter la
commande "make install")
13. cd ../php-5.x.y
14. cp php.ini-development /usr/local/lib/php.ini
15. Vous pouvez éditer le fichier /usr/local/lib/php.ini pour définir les options de PHP.
Éditez votre fichier httpd.conf ou srm.conf et ajoutez :
AddType application/x-httpd-php .php
Suivant votre installation d'Apache et votre variante d'Unix, il existe de nombreuses façons d'arrêter et redémarrer Apache. Voici une liste des commandes typiques, pour différentes installations. Remplacez /path/to/ par le chemin d'accès à vos applications sur votre système.
Exemple #3 Exemples de commandes pour le redémarrage d'apache
1. Nombreuses variantes Linux SysV : /etc/rc.d/init.d/httpd restart 2. Avec les scripts apachectl : /path/to/apachectl stop /path/to/apachectl start 3. httpdctl et httpsdctl (utilisant OpenSSL), similaires à apachectl : /path/to/httpsdctl stop /path/to/httpsdctl start 4. En utilisant mod_ssl, ou un autre serveur SSL, vous pouvez vouloir l'arrêter et le démarrer manuellement : /path/to/apachectl stop /path/to/apachectl startssl
L'emplacement des exécutables apachectl et http(s)dctl peut varier. Si votre système est pourvu des commandes locate, whereis ou which, elles peuvent vous aider à retrouver vos programmes.
Différents exemples de compilation PHP pour Apache suivent :
./configure --with-apxs --with-pgsql
Cette commande va créer une bibliothèque partagée libphp5.so qui sera chargée par Apache avec une ligne LoadModule dans le fichier httpd.conf. Le support PostgreSQL est aussi inclus dans cette bibliothèque.
./configure --with-apxs --with-pgsql=shared
Cette commande va créer une bibliothèque partagée libphp5.so pour Apache, mais va aussi créer la bibliothèque partagée pgsql.so qui sera chargée dans PHP avec une directive du fichier php.ini ou en la chargeant explicitement dans le script avec la fonction dl().
./configure --with-apache=/path/to/apache_source --with-pgsql
Cette commande va créer une autre bibliothèque partagée libmodphp5.a, un fichier mod_php5.c et quelques fichiers associés dans le dossier src/modules/php4 du dossier source Apache. Puis, vous devez compiler Apache avec --activate-module=src/modules/php5/libphp5.a et le système de compilation d'Apache va créer un fichier libphp5.a et le lier statiquement avec httpd. Le support PostgreSQL est alors inclus directement dans l'exécutable httpd, ce qui fait que le résultat final est un fichier unique httpd, qui inclut Apache et PHP.
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
Comme précédemment, mais au lieu d'inclure le support PostgreSQL directement dans l'exécutable httpd final, vous allez obtenir une bibliothèque partagée pgsql.so que vous pouvez charger dans PHP soit grâce au fichier de configuration php.ini ou dynamiquement avec dl().
Lorsque vous faites votre choix entre les différents modes de compilation de PHP, vous devez prendre en compte leurs avantages et inconvénients respectifs. Les objets partagés permettent de compiler PHP et Apache de manière séparée, et vous n'aurez pas à compiler l'ensemble pour faire évoluer PHP. La compilation statique permet de charger et d'exécuter plus rapidement PHP. Pour plus d'informations, voyez la page web sur le » support des DSO.
Note:
Le httpd.conf par défaut d'Apache est fourni avec une section qui ressemble à ceci :
À moins que vous ne changiez cette valeur par "Group nogroup" ou quelque chose comme ça ("Group daemon" est aussi classique), PHP ne sera pas capable d'ouvrir des fichiers.User nobody Group "#-1"
Note:
Assurez-vous que vous spécifiez la version installée de apxs avec l'option --with-apxs=/path/to/apxs . Vous NE devez PAS utiliser la version d'apxs qui est dans les sources d'Apache, mais celle qui est réellement installée sur votre système.
Cette section contient les notes et conseils d'installation de PHP avec le serveur Apache 2.x sur les systèmes Unix.
Nous ne recommandons pas l'utilisation de PHP dans un environnement threadé MPM, avec Apache 2. Utilisez le mode prefork MPM, qui est le MPM par défaut pour Apache 2.0 et 2.2. Pour savoir pourquoi, lisez l'entrée de la FAQ correspondante à l'utilisation d'Apache 2 dans un environnement threadé MPM.
La » Documentation Apache est la meilleure source d'informations sur le serveur Apache 2.x. La plupart des informations sur les options d'installation d'Apache peut y être trouvée.
La version la plus récente du serveur HTTP Apache peut être obtenue depuis la » page de téléchargement d'Apache, et une version adaptée de PHP depuis les liens ci-dessus. Ce guide couvre uniquement les bases de fonctionnement d'Apache 2.x avec PHP. Pour plus d'informations, lisez la » documentation Apache. Les numéros de version sont omis ici, pour s'assurer que les instructions ne soient pas incorrectes. Dans les exemples ci-dessous, 'NN' devra être remplacé par la version spécifique d'Apache à utiliser.
Il y a actuellement 2 versions d'Apache 2.x - 2.0 et 2.2. Il y a plusieurs raisons de choisir l'une plutôt que l'autre ; néanmoins, la version 2.2 est actuellement la dernière versions disponible et c'est aussi celle que nous vous recommandons. Cependant, les instructions contenues dans ce guide devraient fonctionner pour la version 2.2 comme pour la version 2.0.
Téléchargez le serveur HTTP Apache depuis le site ci-dessus et décompressez-le :
gzip -d httpd-2_x_NN.tar.gz tar -xf httpd-2_x_NN.tar
De la même façon, téléchargez et décompressez les sources de PHP :
gunzip php-NN.tar.gz tar -xf php-NN.tar
Compilez et installez Apache. Consultez la documentation sur l'installation d'Apache pour plus de détails quant à la compilation de ce logiciel.
cd httpd-2_x_NN ./configure --enable-so make make install
Maintenant que vous avez Apache 2.x.NN de disponible sous /usr/local/apache2, configurez-le avec le support pour le chargement de modules, ainsi que le MPM prefork standard. Pour tester votre installation, utilisez la procédure normale pour démarrer le serveur Apache, i.e. :
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
Maintenant, configurez et compilez PHP. Ce sera à ce moment là où vous pourrez personnaliser PHP avec les diverses options disponibles, comme la liste des extensions à activer. Dans notre exemple, nous effectuerons une configuration simple, avec Apache 2 et le support MySQL.
Si vous avez construis Apache depuis les sources, tel que décrit ci-dessus, l'exemple suivant devrait être correct concernant les chemins vers les apxs, mais si vous avez installez Apache d'une autre façon, vous devrez prendre en compte vos spécificités et ajustez les chemins apxs en conséquent. Notez que suivants les distributions, vous pourriez être amené à renommer apxs en apxs2.
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install
Si vous décidez de modifier les options de configuration après l'installation, vous devrez exécuter de nouveau les étapes "configure", "make" et "make install". Vous n'aurez alors qu'à redémarrer Apache pour que le nouveau module prenne effet. Une re-compilation d'Apache n'est pas nécessaire.
Notez que, sauf indications contraires, l'étape "make install" installera également PEAR, mais aussi divers outils PHP comme phpsize, PHP CLI et bien plus encore.
Setup your php.ini
cp php.ini-development /usr/local/lib/php.ini
Vous devez éditer le fichier .ini pour définir les options PHP. Si vous préférez bouger ce fichier dans un autre répertoire, utilisez l'option --with-config-file-path=/some/path à l'étape 5.
Si vous choisissez le fichier php.ini-production, assurez-vous de lire la liste des modifications correspondante car il peut affecter considérablement la façon dont PHP fonctionnera.
Éditez le fichier httpd.conf pour charger le module PHP. Le chemin spécifié à droite de la chaîne LoadModule, doit correspondre au chemin système du module PHP. L'étape "make install" ci-dessus devrait avoir réalisé cette opération à votre place, mais une simple vérification permettra de s'en assurer.
LoadModule php5_module modules/libphp5.so
Dîtes à Apache d'analyser certaines extensions comme étant des scripts PHP. Par exemple, laissez Apache passer à PHP les fichiers dont l'extension est .php. Au lieu d'utiliser seulement la directive AddType d'Apache, nous souhaitons éviter tout risque potentiellement dangereux, lors d'un téléchargement de de la création de fichier comme exploit.php.jpg, d'exécution PHP. En utilisant cette exemple, vous pouvez avoir n'importe quelle extension d'analyser par PHP. Nous avons ajouté .php pour l'exemple.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Ou, si vous voulez autoriser les fichiers .php, .php2, .php3, .php4, .php5, .php6, et .phtml à être analysés par PHP, mais rien d'autre, nous utiliserons ceci :
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Et pour autoriser les fichiers .phps à être gérer par le filtre du code source de PHP, et ains, être affichés comme code source avec la coloration syntaxique, utilisez ceci :
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
mod_rewrite peut être utilisé pour permettre à n'importe quel fichier .php d'être affiché comme code source avec coloration syntaxique, sans pour autant avoir besoin de le renommer ou de le copier avec une extension .phps. :
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
Le filtre de code source PHP ne devrait pas être actif sur des systèmes de production, car il peut exposer du code confidentielle ou des informations sensibles contenues dans le code source.
Utilisez la procédure normale pour démarrer le serveur Apache, i.e. :
/usr/local/apache2/bin/apachectl start
Ou
service httpd restart
Si vous avez suivi les étapes précédentes, vous avez maintenant un serveur web Apache2 fonctionnel avec le support PHP comme module SAPI. Bien sûr, il y a une multitude d'autres options de configuration de disponibles avec Apache et PHP. Pour plus d'informations, entrez la commande ./configure --help dans l'arbre source correspondant.
Apache peut être compilé en mode multi-threadé, en sélectionnant le MPM worker, plutôt que le standard MPM prefork. Ceci est fait en ajoutant l'option suivante à l'argument de la commande "./configure", à l'étape 3 ci-dessus :
Cela ne devrait pas être entreprise sans être conscients des conséquences, et ayant au moins une juste compréhension de ce que cela implique. La documentation Apache concernant » MPM-Modules vous apportera d'importantes informations qui vous permettra de prendre votre décision.
Note:
La FAQ Apache MultiViews traite de l'utilisation MultiViews avec PHP.
Note:
Pour compilez une version multi-threadée d'Apache, le système cible doit supporter les threads. Dans ce cas, PHP doit également être construit avec l'expérimental Zend Thread Safety (ZTS). Sous cette configuration, toutes les extensions ne seront pas disponibles. Nous vous recommandons de compiler Apache avec le prefork MPM-Module.
Cette section contient des informations spécifiques sur l'installation de PHP avec Lighttpd 1.4 sur les systèmes Unix.
Reportez-vous à » Lighttpd pour une installation correcte de Lighttpd avant de continuer.
Fastcgi est le SAPI préféré pour connecter PHP et Lighttpd. Fastcgi active automatiquement php-cgi depuis PHP 5.3.0, mais pour les versions antérieures, vous devez configurer PHP avec l'option de compilation --enable-fastcgi. Pour vous assurez de l'activation de fastcgi, le résultat de la commande php -v doit contenir PHP 5.2.5 (cgi-fcgi). Avant PHP 5.2.3, fastcgi était activé dans le binaire PHP (php-cgi n'existait pas).
Pour configurer Lighttpd afin qu'il se connecte à PHP et appelle le processus fastcgi, vous devez éditez le fichier lighttpd.conf. Une connexion par sockets est la solution préférée pour les systèmes locaux.
Exemple #1 Portion du fichier lighttpd.conf
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
La directive bin-path permet à lighttpd d'appeler le processus fastcgi dynamiquement. PHP appellera les fils suivant la variable d'environnement PHP_FCGI_CHILDREN. La directive "bin-environment" définit l'environnement pour les processus appelés. PHP terminera un processus fils lorsque le nombre de requêtes spécifié par PHP_FCGI_MAX_REQUESTS a été atteint. Les directives "min-procs" et "max-procs" peuvent généralement être ignorées avec PHP. PHP gère ces propres fils et caches opcode comme APC qui partage uniquement les fils gérés par PHP. Si "min-procs" est défini à quelque chose de supérieur à 1, le nombre total de réponses PHP sera multiplié par PHP_FCGI_CHILDREN (2 min-procs * 16 fils, donne 32 réponses).
Lighttpd fournit un programme appelé spawn-fcgi afin de rendre plus facile les appels des processus fastcgi.
Il est possible d'appeler des processus sans spawn-fcgi, avec un minimum de configuration. La variable d'environnement PHP_FCGI_CHILDREN contrôle le nombre de fils que PHP appelle pour gérer les demandes. La variable d'environnement PHP_FCGI_MAX_REQUESTS détermine la durée de vie, en nombre de requêtes, de chaque fils. Voici un script bash simple qui permet d'aider les appels aux répondeurs PHP.
Exemple #2 Appel des répondeurs FastCGI
#!/bin/sh
# Localisation du binaire php-cgi
PHP=/usr/local/bin/php-cgi
# Localisation du fichier PID
PHP_PID=/tmp/php.pid
# Liaison à une adresse
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Liaison à un socket du domaine
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
Les instances Fastcgi peuvent être appelées sur plusieurs machines distantes afin de répartir les applications.
Exemple #3 Connexion à des instances distantes de php-fastcgi
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)
Cette section contient les notes et détails spécifiques à l'installation de PHP sur les serveurs Web Sun Java System Web Server, Sun ONE Web Server, iPlanet et Netscape server sur les systèmes Sun Solaris.
Depuis PHP 4.3.3, vous pouvez utiliser les scripts PHP avec le module NSAPI pour gérer des listes de dossiers et des pages d'erreurs personnalisées. Des fonctions supplémentaires sont disponibles pour assurer la compatibilité avec Apache. Pour du support sur les serverus courants, voyez la note sur les sous-requêtes.
Vous pouvez trouver plus d'informations sur la configuration de PHP avec Netscape Enterprise Server : » http://benoit.noss.free.fr/php/install-php4.html
Pour construire PHP avec les serveurs Web Sun JSWS/Sun ONE WS/iPlanet/Netscape, entrez le répertoire valide d'installation pour l'option --with-nsapi=[DIR]. Le répertoire par défaut est habituellement /opt/netscape/suitespot/. Lisez également le fichier /php-xxx-version/sapi/nsapi/nsapi-readme.txt.
Installez les packages suivants depuis le serveur » http://www.sunfreeware.com/ ou un miroir ad hoc :
export PATH.
gunzip php-x.x.x.tar.gz
(si vous avez une distribution .gz, ou bien allez en 4).
tar xvf php-x.x.x.tar
cd ../php-x.x.x
Pour les étapes suivantes, assurez-vous que /opt/netscape/suitespot/ correspond bien à votre installation du serveur netscape. Sinon, indiquez le chemin correct :
./configure --with-mysql=/usr/local/mysql \ --with-nsapi=/opt/netscape/suitespot/ \ --enable-libgcc
Après avoir fait l'installation de base et lu les fichiers readme.txt, vous pouvez avoir besoin de faire des configurations supplémentaires.
Tout d'abord, vous aurez besoin d'ajouter des chemins dans la variable LD_LIBRARY_PATH pour que Netscape trouve son bonheur. Il est préférable de le faire dans le script de démarrage du serveur Netscape. Les utilisateurs Windows peuvent ignorer cette étape. Le script de démarrage est souvent situé dans : /path/to/server/https-servername/start. Vous aurez peut être à éditer le fichier de configuration situé dans /path/to/server/https-servername/config/.
Ajoutez les lignes suivantes dans mime.types en tant qu'administrateur :
type=magnus-internal/x-httpd-php exts=php
Éditez le fichier magnus.conf (pour les serveurs >= 6) ou le fichier obj.conf (pour les serveurs < 6) et ajoutez-y les lignes suivantes. shlib peut varier en fonction de votre OS. Pour Unix, c'est quelque chose comme /opt/netscape/suitespot/bin/libphp4.so. Il est conseillé de placer les lignes suivantes après les lignes de mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="/opt/netscape/suitespot/bin/libphp4.so" Init fn="php4_init" LateInit="yes" errorString="Failed to initialize PHP!" [php_ini="/path/to/php.ini"]
Configurez l'objet par défaut dans le fichier obj.conf (pour les classes de serveur virtuel [version 6.0+] dans leur fichier vserver.obj.conf) :
<Object name="default"> . . . .#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog' lines Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...] . . </Object>
Cela est nécessaire uniquement si vous voulez configurer un répertoire pour accueillir des scripts PHP tout comme un répertoire cgi-bin :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Configuration de l'identification : les identifications PHP ne peuvent être utilisées avec aucune autre identification. TOUTES LES IDENTIFICATIONS SONT PASSEES À VOS SCRIPTS PHP. Pour configurer l'identification PHP pour tout le serveur web, ajoutez la ligne suivante à votre objet par défaut :
<Object name="default"> AuthTrans fn=php4_auth_trans . . . </Object>
Pour utiliser l'identification PHP dans un seul répertoire, ajoutez ce qui suit :
<Object ppath="d:\path\to\authenticated\dir\*"> AuthTrans fn=php4_auth_trans </Object>
Note:
La taille de la pile que PHP utilise dépend de la configuration du serveur Web. Si vous rencontrez des crashs avec les grands scripts PHP, il est recommandé d'augmenter la taille de la pile avec la console d'administration : dans la section "MAGNUS EDITOR".
Il est important de garder en tête que iPlanet/SunONE/Netscape est un serveur Web multi-threadé. Comme toutes les requêtes se situent dans le même contexte (c'est le contexte sur serveur Web), et que ce contexte est unique, si vous voulez accéder à des variables comme PATH_INFO, HTTP_HOST etc., il n'est pas recommandé d'y accéder à l'ancienne manière de PHP, avec la fonction getenv() ou une autre méthode (register globals, $_ENV). De cette manière, vous n'aurez que des valeurs d'environnement du serveur, et non pas des valeurs correctes pour le CGI.
Note:
Pourquoi est-ce que les variables CGI sont invalides ?
C'est lié au fait que le processus du serveur Web est lancé par l'administrateur du serveur, qui utilise le script de lancement au démarrage. En fait, il aurait fallu que vous lanciez vous-même le processus. C'est pour cela que l'environnement du serveur Web contient des variables d'environnement CGI. Vous pouvez vérifier cela en lançant le serveur Web depuis un autre endroit que l'administrateur du serveur : utilisez la ligne de commande Unix en tant que root : vous verrez alors qu'il n'y a pas de variables d'environnement.
Changez simplement vos scripts pour lire les variables CGI, en utilisant le tableau superglobal $_SERVER. Si vous avez d'autres scripts qui utilisent encore $HTTP_HOST et compagnie, il est recommandé d'activer l'option register_globals dans le php.ini et de changer l'ordre des variables. IMPORTANT : supprimez le "E" dans cette option, car vous n'en avez pas besoin pour cet environnement.
variables_order = "GPCS" register_globals = On
Vous pouvez utiliser PHP pour générer des pages d'erreurs de type "404 Not Found" ou apparentée. Ajoutez la ligne suivante dans le fichier obj.conf pour chaque page d'erreur que vous souhaitez remplacer :
Error fn="php4_execute" code=XXX script="/chemin/vers/script.php" [inikey=value inikey=value...]
Une autre possibilité est de générer une liste de dossiers personnalisée. Créez simplement un script PHP qui affiche le contenu du dossier, et remplacez la ligne Service par défaut par type="magnus-internal/directory" dans obj.conf avec ceci :
Service fn="php4_execute" type="magnus-internal/directory" script="/chemin/vers/script.php" [inikey=value inikey=value...]
Le module NSAPI supporte désormais la fonction nsapi_virtual() (alias : virtual()), pour réaliser des sous requêtes au serveur Web, et inclure le résultat dans une page. Le problème est que cette fonction utilise une fonctionnalité non documentée de la bibliothèque NSAPI. Sous Unix, ce n'est pas un problème, car le module va automatiquement rechercher les fonctions nécessaires, et les utiliser si elles sont disponibles. Sinon, nsapi_virtual() sera désactivée.
Note:
Soyez prévenu : le support de nsapi_virtual() est EXPERIMENTAL !
Par default, PHP est construit comme programmes à la fois CLI et CGI, pouvant être utilisé comme processeur CGI. Si vous utilisez un serveur qui supporte le module PHP, vous devriez en général utiliser cette solution pour des raisons de performances. Cependant, la version CGI permet aux utilisateurs de lancer des pages PHP sous différent id utilisateurs (Unix).
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Si vous avez compilé PHP comme programme CGI, vous pouvez tester votre produit en tapant : make test. C'est toujours une bonne chose de tester le résultat d'une compilation. Cela vous permet de repérer des problèmes entre PHP et votre plate-forme, plutôt que d'attendre qu'ils surviennent.
Certaines variables d'environnement fournies par les serveurs Web ne sont pas disponibles dans les » spécifications CGI/1.1 actuelles. Seules les variables suivantes sont définies, et les autres doivent être considérées comme spécifiques aux serveurs Web : AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL et SERVER_SOFTWARE.
Cette section contient les notes et conseils d'installation de PHP sur les distributions HP-UX.
Il y a deux façons d'installer PHP sur les systèmes HP-UX. Soit en le compilant, soit en installant des binaires précompilés.
Les paquets pré-compilés officiels sont disponibles ici : » http://software.hp.com/
En attendant que cette section du manuel soit réécrite, la documentation concernant la compilation de PHP (ainsi que les extensions associées) sur les systèmes HP-UX a été effacée. Pour le moment, veuillez-vous référer à cette ressource externe : » Mise en place d'Apache et de PHP sous HP-UX 11.11
Cette section contient les notes spécifiques à l'installation de PHP sous » OpenBSD 3.6.
Cette méthode est la méthode recommandée pour installer PHP sur OpenBSD. C'est aussi la méthode la plus simple. Le paquet core a été séparé des modules et chacun d'entre eux peut être installé et supprimé indépendamment des autres. Les fichiers dont vous avez besoin sont sur le CD OpenBSD ou sur le site FTP.
Le paquet principal que vous devez installer est php4-core-4.3.8.tgz, qui contient le moteur de base, plus gettext et iconv). Puis, jetez un oeil aux paquets de module, comme php4-mysql-4.3.8.tgz ou php4-imap-4.3.8.tgz. Vous devez utiliser la commande phpxs pour activer et désactiver ces modules dans votre php.ini.
Exemple #1 Exemple d'installation de PHP sous OpenBSD avec Ports
# pkg_add php4-core-4.3.8.tgz # /usr/local/sbin/phpxs -s # cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini (add in mysql) # pkg_add php4-mysql-4.3.8.tgz # /usr/local/sbin/phpxs -a mysql (add in imap) # pkg_add php4-imap-4.3.8.tgz # /usr/local/sbin/phpxs -a imap (remove mysql as a test) # pkg_delete php4-mysql-4.3.8 # /usr/local/sbin/phpxs -r mysql (install the PEAR libraries) # pkg_add php4-pear-4.3.8.tgz
Lisez la page de manuel Unix » packages(7) pour plus de détails sur les packages binaires d'OpenBSD.
Vous pouvez aussi compiler PHP en utilisant » l'arbre des ports. Cette méthode est recommandée aux utilisateurs expérimentés de OpenBSD. Le port PHP4 est scindé en deux sous-dossiers : core et extensions. Le dossier extensions génère les sous paquets de tous les modules PHP. Si vous souhaitez ne pas créer ces modules, vous pouvez utiliser la commande en ligne no_* FLAVOR. Par exemple, pour ne pas compiler le module imap, utilisez FLAVOR avec la valeur no_imap.
Les anciennes versions de OpenBSD utilisaient le système des FLAVORS pour compiler statiquement PHP. Comme il est trop difficile de générer des packages binaires avec cette méthode, elle est considérée comme obsolète. Vous pouvez toujours utiliser les anciennes versions stables, mais sachez qu'elles ne sont plus supportées par l'équipe d'OpenBSD. Si vous avez des commentaires sur le sujet, le responsable actuel est Anil Madhavapeddy (avsm_arobase_openbsd_point_org).
Cette section contient les notes et conseils d'installation de PHP sur les distributions Solaris.
L'installation Solaris oublie généralement les compilateurs C, et leurs utilitaires. Lisez cette FAQ pour savoir pourquoi est-ce que les versions GNU de certains de ces outils sont nécessaires.
Pour décompresser la distribution PHP, vous avez besoin de
Pour compiler PHP, vous avez besoin de
Pour construire les extensions additionnelles ou modifier le code de PHP, vous pouvez également avoir besoin de
Vous pouvez simplifier l'installation Solaris en utilisant pkgadd pour installer la plupart des composants. Le système de paquets des images (IPS) pour Solaris 11 Express contient également les composants nécessaires pour l'installation utilisant la commande pkg.
Cette section contient des notes et des astuces spécifiques à l'installation de PHP sous » Debian GNU/Linux.
Les compilations non officielles de sources tierces ne sont pas supportées ici. Tout bogue devrait être reporté à l'équipe Debian sauf s'il peut être reproduit en utilisant les dernières compilations de notre » section téléchargements .
Bien que les instructions pour compiler PHP sous Unix s'appliquent aussi à Debian, cette page de manuel contient des informations spécifiques pour les autres manières d'installer PHP, telles que l'utilisation de apt-get ou aptitude. Cette page de manuel utilise indifféremment l'une ou l'autre.
Tout d'abord, veuillez noter que d'autres paquets peuvent être souhaitables, comme libapache2-mod-php5 pour l'intégration avec Apache 2, et php-pear pour PEAR.
Ensuite, avant d'installer un paquet, il est sage de s'assurer que la liste des paquets est à jour. D'habitude, on le fait en utilisant la commande apt-get update.
Exemple #1 Exemple d'installation sous Debian avec Apache 2
# apt-get install php5-common libapache2-mod-php5 php5-cli
APT installera et activera automatiquement le module PHP 5 pour Apache 2, ainsi que toutes ses dépendances. Apache devra être relancé pour que les changements soient effectifs. Par exemple :
Exemple #2 Stopper et démarrer Apache une fois PHP installé
# /etc/init.d/apache2 stop # /etc/init.d/apache2 start
Dans l'exemple précédent, PHP a été installé avec juste les composants principaux. Il y a fort à parier que des modules supplémentaires soient nécessaires, tels que MySQL, cURL, GD, etc. Ils peuvent aussi être installés via la commande apt-get.
Exemple #3 Méthodes pour lister les paquets PHP 5 supplémentaires
# apt-cache search php5 # aptitude search php5 # aptitude search php5 |grep -i mysql
Ces exemples montreront de nombreux paquets, donc beaucoup spécifiques à PHP, comme php5-cgi, php5-cli et php5-dev. Déterminez ceux qui sont nécessaires et installez les comme n'importe quel autre en utilisant apt-get ou aptitude. Et vu que Debian effectue une vérification des dépendances, on vous avertira de ces dernières, comme pour installer MySQL et cURL :
Exemple #4 Installer PHP avec MySQL et cURL
# apt-get install php5-mysql php5-curl
APT ajoutera automatiquement les bonnes lignes aux fichiers connexes à php.ini, comme /etc/php5/apache2/php.ini, /etc/php5/conf.d/pdo.ini, etc. et selon l'extension, il ajoutera des entrées semblables à extension=foo.so. De plus, redémarrer le serveur web (Apache, par exemple) est nécessaire pour que ces changements soient effectifs.
Cette section contient les notes et conseils pour installer PHP sur un système Mac OS X. PHP est inclus avec les Macs, et pour compiler, la procédure est identique à l'installation sous Unix.
Il existe quelques versions pré-packagées et pré-compilées de PHP pour Mac OS X. Cela peut être utile pour mettre en place une configuration standard, mais si vous avez besoin d'accéder à des fonctionnalités spécifiques (comme un serveur sécurisé, ou un pilote de bases de données exotiques), vous aurez à compiler PHP et/ou votre serveur Web vous-même. Si vous n'êtes pas familier avec la compilation et la mise en place d'applications, il est bon de vérifier si personne d'autre n'a pas déjà réalisé un paquet contenant les fonctionnalités que vous désirez.
Les ressources suivantes offrent la possibilité d'installer des paquets et des binaires précompilés pour PHP sous Mac OS :
PHP est fourni en standard avec Macs depuis OS X version 10.0.0. Activer PHP avec le serveur Web par défaut nécessite de décommenter quelques lignes dans le fichier de configuration d'Apache httpd.conf tandis que le mode CGI et/ou CLI sont activés par défaut (accès simple via le terminal).
L'activation de PHP en suivant ces instructions permet de configurer rapidement un environnement local de développement. Il est vivement recommandé de toujours mettre à jour PHP à sa version la plus récente. Comme la plupart des programmes, les nouvelles versions sont créées pour corriger les bogues et ajouter des fonctionnalités et c'est le cas de PHP. Reportez-vous à la documentation de l'installation de MAC OS X pour plus de détails. Les instructions suivantes sont destinées au débutant, en fournissant juste assez de détails pour mettre en place une configuration par défaut pour travailler. Tous les utilisateurs sont vivement encouragés à compiler et installer une version récente du paquet.
Le type d'installation standard utilise mod_php, et active le mod_php embarqué sur Mac OS X pour le serveur Web Apache (le serveur Web par défaut qui est accessible via les préférences systèmes), en quelques étapes :
Note: Une façon de l'ouvrir est d'utiliser un éditeur de texte Unix dans un terminal, par exemple, nano, et sachant que le fichier est la propriété de l'utilisateur root, vous devrez utiliser la commande sudo pour l'ouvrir (en tant que root) ; aussi, vous devrez entrer la commande suivante dans votre Terminal (votre mot de passe vous sera demandé) : sudo nano /private/etc/apache2/httpd.conf Quelques commandes nano : ^w (recherche), ^o (sauvegarde), et ^x (sortie) où ^ représente la touche Ctrl.
Note: Les versions de Mac OS X antérieures à 10.5 fournissent d'anciennes versions de PHP et d'Apache. Aussi, le fichier de configuration d'Apache sur les machines originales peut être /etc/httpd/httpd.conf.
Avec un éditeur de texte, décommentez les lignes (en effaçant le caractère #) qui ressemblent aux lignes suivantes (ces 2 lignes ne se trouvent pas au même endroit) :
# LoadModule php5_module libexec/httpd/libphp5.so # AddModule mod_php5.c
Assurez-vous que les extensions désirées soient analysées par PHP (exemples : .php .html et .inc)
Sachant que ce comportement a déjà été activé dans votre fichier httpd.conf (depuis Mac Panther), une fois PHP activé, les fichiers .php seront automatiquement analysés par PHP.
<IfModule mod_php5.c>
# If php is turned on, we respect .php and .phps files.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# Since most users will want index.php to work we
# also automatically enable index.php
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
</IfModule>
Note:
Avant OS X 10.5 (Leopard), PHP 4 était livré par défaut plutôt que PHP 5. Ainsi, les instructions ci-dessus diffèreront juste en changeant 5 en 4. 5's to 4's.
La fonction phpinfo() affiche les informations sur PHP. Créez un fichier dans le DocumentRoot avec le code PHP suivant :
<?php phpinfo(); ?>
Pour redémarrez, exécutez la commande sudo apachectl graceful dans un terminal ou arrêter/démarrer l'option "Personal Web Server" dans les préférences systèmes OS X. Par défaut, le chargement de fichiers locaux dans le navigateur s'effectue via des URL comme ceci : http://localhost/info.php ou, si vous utilisez le DocumentRoot d'un dossier utilisateur, l'URL ressemblera à : http://localhost/~yourusername/info.php
CLI (ou CGI dans les anciennes versions) est nommé php et réside normalement dans /usr/bin/php. Ouvrez un terminal, lisez la section sur la ligne de commande du manuel PHP, et exécutez la commande php -v pour vérifier la version PHP de ce binaire. Un appel à la fonction phpinfo() pourra également vous révéler cette information.
Référez-vous au guide d'installation sous Unix pour compiler PHP sur Mac OS X.
Cette section est applicable à Windows 98/Me et Windows NT/2000/XP/2003. PHP devrait fonctionner sur les plates-formes 16 bits comme Windows 3.1 et parfois, on décrira les plates-formes supportées sous le nom de Win32.
Note:
Windows 98/Me/NT4 n'est plus supporté depuis PHP 5.3.0.
Note:
Windows 95 n'est plus supporté depuis PHP 4.3.0.
Il y a deux méthodes principales pour installer PHP sous Windows : soit manuellement, soit avec l'installeur.
Si vous avez un environnement de développement comme Microsoft Visual Studio, vous pouvez aussi compiler PHP à partir des sources.
Une fois que PHP est installé sur votre Windows, vous pouvez aussi ajouter diverses extensions.
Il y a beaucoup d'installeurs "tout en un" sur Internet, mais aucun n'est approuvé par Php.net, car nous pensons que l'utilisation d'un des paquets officiels pour Windows depuis » http://www.php.net/downloads.php reste le meilleur choix et vous assurera d'avoir un système sécurisé et optimisé.
L'installeur Windows de PHP disponible depuis les pages de » http://www.php.net/downloads.php, installe la version CGI de PHP, et configure les serveurs web IIS, PWS, et Xitami. L'installeur n'inclut aucune extension externe supplémentaire de PHP (php_*.dll), vous les trouverez uniquement dans le paquet zippé Windows et dans les téléchargements PECL.
Note:
Notez bien que bien que l'installeur soit une méthode simple pour installer PHP, il est limité dans plusieurs aspects : par exemple, la configuration automatique des extensions n'est pas prise en compte. Utiliser l'installateur n'est pas la méthode préférée pour installer PHP.
Tout d'abord, installez votre serveur HTTP favori sur votre système et assurez-vous qu'il fonctionne.
Exécutez l'installeur et suivez les instructions fournies par l'assistant. Deux types d'installation sont fournis : standard, qui utilise toutes les configurations par défaut les plus pratiques, et avancée, qui pose un maximum de questions pour paramétrer le plus finement possible.
L'assistant d'installation rassemble suffisamment d'informations pour configurer php.ini ainsi que certains serveurs web pour utiliser PHP. Un des serveurs web pour lequel l'installeur PHP n'effectue pas de configuration automatique est Apache, vous devez donc le configurer manuellement.
Une fois l'installation terminée, l'installeur vous informera que vous devez redémarrer. Suivez ce conseil, ou commencez à utiliser PHP immédiatement.
Gardez bien à l'esprit que cette installation de PHP n'est pas sécurisée. Si vous voulez avoir une installation sécurisée de PHP, vous devriez commencer par lire la documentation, et choisir toutes vos options avec soin. Cet installeur automatique vous permet de réaliser l'installation en un tour de main, mais n'est pas destiné à l'utilisation sur des serveurs de production.
L'installeur PHP pour Windows pour les versions suivantes de PHP est construit en utilisant la technologie MSI via le kit d'outils Wix (» http://wix.sourceforge.net/). Il installe et configure PHP ainsi que toutes les extensions internes et PECL, mais aussi, configure les serveurs web les plus populaires comme IIS, Apache, et Xitami.
Tout d'abord, installez votre serveur HTTP (web) sur votre système et assurez-vous qu'il fonctionne correctement. Puis, utilisez l'un des types d'installation de PHP suivants.
Exécutez l'installeur MSI et suivez les instructions fournies par l'assistant d'installation. Il vous sera demandé de sélectionner le serveur Web que vous voulez configurer en premier, ainsi que tous les détails de configuration nécessaires.
Ensuite, il vous sera demandé de sélectionner quelles fonctionnalités et extensions vous voulez installer et activer. En sélectionnant "Will be installed on local hard drive" dans le menu pour chaque élément, vous pouvez contrôler l'installation ou non de la fonctionnalité. En sélectionnant "Entire feature will be installed on local hard drive", vous pourrez installer toutes les sous-fonctionnalités de la fonctionnalité principale (par exemple, en sélectionnant la fonctionnalité "PDO", vous installerez également tous les drivers PDO).
Il n'est pas recommandé d'installer toutes les extensions par défaut, sachant que la plupart nécessite des dépendances externes à PHP afin de fonctionner correctement. Préférez l'utilisation du mode de réparation qui est accessible via le panneau de contrôle "Ajout/Suppression de programmes" pour activer ou désactiver les extensions ou fonctionnalités, après l'installation.
L'installeur configurera donc PHP pour l'utiliser sous Windows, le fichier php.ini ainsi que certains serveurs Web. L'installeur configure actuellement IIS, Apache, Xitami et Sambar ; si vous utilisez un serveur web différent de ceux-ci, vous devrez le configurer manuellement.
L'installeur supporte également un mode silencieux, qui est utile pour les administrateurs systèmes pour déployer PHP facilement. Pour utiliser le mode silencieux, entrez la commande suivante :
msiexec.exe /i php-VERSION-win32-install.msi /q
Vous pouvez contrôler le dossier d'installation en le passant comme paramètre à l'installeur. Par exemple, pour installer PHP dans le dossier e:\php :
msiexec.exe /i php-VERSION-win32-install.msi /q INSTALLDIR=e:\php
Vous pouvez également spécifier quelles fonctionnalités devront être installées. Par exemple, pour installer l'extension mysqli et l'exécutable CGI :
msiexec.exe /i php-VERSION-win32-install.msi /q ADDLOCAL=cgi,ext_php_mysqli
Voici la liste courante des fonctionnalités à installer :
MainExecutable - exécutable php.exe ScriptExecutable - exécutable php-win.exe ( N'est plus disponible depuis PHP 5.2.10/5.3.0; il est maintenant inclut par défaut ) ext_php_* - les diverses extensions ( par exemple : ext_php_mysql for MySQL ) apache13 - module Apache 1.3 apache20 - module Apache 2.0 apache22 - module Apache 2.2 apacheCGI - exécutable Apache CGI iis4ISAPI - module IIS ISAPI iis4CGI - exécutable IIS CGI iis4FastCGI - exécutable IIS CGI NSAPI - module serveur Sun/iPlanet/Netscape netserve - exécutable NetServe Web Server CGI Xitami - exécutable Xitami CGI Sambar - module Sambar Server ISAPI CGI - exécutable php-cgi.exe PEAR - installeur PEAR Manual - manuel PHP au format CHM
Pour plus d'informations sur l'installation via les installeurs MSI depuis la ligne de commande, visitez » http://msdn.microsoft.com/en-us/library/aa367988.aspx
Pour effectuer une mise à jour, exécutez l'installeur soit en mode graphique, soit en ligne de commande. L'installeur lira vos options d'installation, effacera votre ancienne installation et réinstallera PHP avec les mêmes options que précédemment. Il est recommandé d'utiliser cette méthode pour mettre à jour votre installation de PHP plutôt que d'aller remplacer manuellement les fichiers dans le dossier d'installation.
Cette section contient les instructions pour installer manuellement et configurer PHP sous Microsoft Windows. Si vous recherchez la façon dont doit être utilisé l'installeur PHP pour installer et configurer PHP et un serveur Web sous Windows, référez-vous à l'installeur Windows (PHP 5.2 et suivants).
Téléchargez l'archive PHP depuis » PHP pour Windows: Binaires et sources. Il y a plusieurs versions de l'archive zip - choisissez la version correspondante au serveur web que vous utilisez :
Si PHP est utilisé avec IIS, alors choisissez PHP 5.3 VC9 Non Thread Safe ou PHP 5.2 VC6 Non Thread Safe;
Si PHP est utilisé avec IIS7 ou supérieure et PHP 5.3+, alors les binaires VC9 de PHP doivent être utilisés.
Si PHP est utilisé avec Apache 1 ou Apache 2, alors choisissez PHP 5.3 VC6 ou PHP 5.2 VC6.
Note:
Les versions VC9 sont compilées avec le compilateur Visual Studio 2008 et sont optimisées en terme de performance et de stabilité. Les versions VC9 nécessitent d'avoir » Microsoft 2008 C++ Runtime (x86) ou » Microsoft 2008 C++ Runtime (x64) d'installé.
Décompressez le contenu de l'archive zip dans le dossier de votre choix, par exemple C:\PHP\. La structure des dossiers et des fichiers extraits depuis l'archive zip ressemble à ceci :
Exemple #1 Structure d'un paquet PHP 5
c:\php | +--dev | | | |-php5ts.lib -- php5.lib en version non thread safe | +--ext -- bibliothèques DLLs pour PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras -- vide | +--pear -- copie initiale de PEAR | | |-go-pear.bat -- script d'installation de PEAR | |-... | |-php-cgi.exe -- exécutable CGI | |-php-win.exe -- exécution de scripts sans avoir un prompt de commande ouvert | |-php.exe -- exécutable de ligne de commande (CLI) | |-... | |-php.ini-development -- configuration par défaut du php.ini | |-php.ini-production -- configuration recommandée du php.ini | |-php5apache2_2.dll -- n'existe pas dans la version non thread safe | |-php5apache2_2_filter.dll -- n'existe pas dans la version non thread safe | |-... | |-php5ts.dll -- bibliothèque DLL coeur de PHP ( php5.dll en version non thread safe) | |-...
Voici la liste des modules et des exécutables inclus dans l'archive zip de PHP :
go-pear.bat - le script de configuration de PEAR. Référez-vous à l'» installation de PEAR pour plus de détails.
php-cgi.exe - exécutable CGI qui peut être utilisé lors de l'exécution de PHP sous IIS via CGI ou FastCGI.
php-win.exe - l'exécutable PHP pour l'exécution de scripts PHP sans fenêtre de ligne de commande (par exemple, des applications PHP qui utilisent un GUI Windows).
php.exe - l'exécutable PHP pour l'exécution de scripts PHP dans une interface de ligne de commande (CLI).
php5apache2_2.dll - module Apache 2.2.X.
php5apache2_2_filter.dll - filtre Apache 2.2.X.
Après l'extraction du contenu du paquet PHP, copiez le fichier php.ini-production dans le fichier php.ini du même dossier. Si nécessaire, il est également possible de placer le fichier php.ini dans le dossier de votre choix mais cela nécessite d'autres étapes de configuration décrites dans la configuration de PHP.
Le fichier php.ini indique à PHP la façon doit il doit se configurer, mais aussi la façon dont il doit travailler avec l'environnement sur lequel il s'exécute. Voici quelques concfigurations du fichier php.ini qui aide PHP à fonctionner d'une meilleure façon sous Windows. Quelques-unes sont optionnelles. Il y a bien d'autres directives utiles pour votre environnement - référez-vous à la liste des directives du php.ini pour plus d'informations.
Directives nécessaires :
extension_dir = <chemin vers le dossier des extensions> - extension_dir doit pointer vers le dossier contenant les fichiers des extensions PHP. Le chemin peut être absolu (e.g. "C:\PHP\ext") ou relatif (e.g. ".\ext"). Les extensions listées ci-dessous dans le fichier php.ini doivent se trouver dans le dossier extension_dir.
extension = xxxxx.dll - Pour chaque extension que vous voulez activer, vous avez besoin d'une directive "extension=" qui indique à PHP quelles extensions du dossier extension_dir doivent être chargées au démarrage.
log_errors = On - PHP a une fonctionnalité permettant d'historiser les erreurs, pouvant être utilisée pour envoyer les erreurs dans un fichier, ou vers un service (i.e. syslog) et fonctionne en conjonction de la directive error_log ci-dessous. Lors de l'exécution sous IIS, log_errors devrait être activée, avec une valeur valide de error_log.
error_log = <chemin vers le fichier d'historisation des erreurs> - error_log doit spécifier le chemin absolu ou relatif vers un fichier où les erreurs PHP doivent être écrites. Le fichier doit être accessible en écriture par le serveur web. L'endroit commun de ce fichier est le dossier TEMP, par exemple, "C:\inetpub\temp\php-errors.log".
cgi.force_redirect = 0 - Cette directive est nécessaire pour le fonctionnement sous IIS. Elle est relative à la sécurité et est nécessaire par bons nombres de serveurs web. Cependant, son activation sous IIS fera échouer le moteur PHP sous Windows.
cgi.fix_pathinfo = 1 - Cette directive permet à PHP d'accéder aux informations concernant le chemin réel suivi par la spécification CGI. Cette directive est nécessaire lors de l'implémentation de FastCGI sous IIS.
fastcgi.impersonate = 1 - FastCGI sous IIS supporte la possibilité de rendre impersonnels les éléments relatifs à la sécurité lors d'un appel client. Ceci permet à IIS de définir le contexte de sécurité sur lequel la demande est effectuée.
fastcgi.logging = 0 - L'historisation FastCGI doit être désactivé sous IIS. S'il est activé, alors tous les messages de toutes les classes seront traités par FastCGI comme des conditions d'erreur, ce qui fera qu'IIS générera des exceptions HTTP 500.
Directives optionnelles
max_execution_time = ## - Cette directive demande à PHP un maximum de temps afin d'exécuter un script donné. Par défaut, c'est 30 secondes. Augmentez la valeur de cette direction si l'application PHP prend plus de temps à s'exécuter.
memory_limit = ###M - La mémoire maximale disponible pour le processus PHP, en méga-octets. Par défaut, c'est 128, ce qui est parfait pour la plupart des applications PHP. Pour des applications plus complexes, il peut être nécessaire d'augmenter cette valeur.
display_errors = Off - Cette directive indique à PHP si les messages d'erreur doivent être inclus dans le flux retourné au serveur web. Si défini à "On", alors PHP les enverra, suivants les classes d'erreur que vous avez définies avec la directive error_reporting, au serveur web comme partie du flux d'erreur. Pour des raisons de sécurité, il est recommandé de définir à "Off" cette directive sur les serveurs de production afin de ne pas révéler les informations concernant la sécurité, qui sont inclues dans les messages d'erreur.
open_basedir = <chemins vers les dossiers, séparés par un point virgule>, e.g. openbasedir="C:\inetpub\wwwroot;C:\inetpub\temp". Cette directive spécifie le chemin vers le dossier où PHP est autorisé à effectuer des opérations sur le système de fichiers. Toute opération en dehors de ces chemins retournera une erreur. Cette directive est spécialement utile pour cantonner l'installation de PHP dans des environnements partagés afin d'éviter que les scripts PHP accèdent à tout fichier se trouvant en dehors du dossier racine du site web.
upload_max_filesize = ###M et post_max_size = ###M - La taille maximale autorisée, respectivement, d'un fichier téléchargé et des données de type POST. Les valeurs de ces directives devraient être augmentées si les applications PHP doivent effectuer de gros téléchargements, comme des images ou des fichiers vidéos.
PHP est maintenant configuré pour votre système. La prochaine étape est de choisir un serveur web et de la configurer pour y faire fonctionner PHP. Choisissez un serveur web depuis la table de contenus.
En plus de faire fonctionner PHP via un serveur web, PHP peut être exécuté depuis la ligne de commande, à la façon des scripts .BAT. Reportez-vous au chapitre sur la ligne de commande PHP sous Microsoft Windows pour plus d'informations.
Cette section contient les instructions spécifiques d'installation de PHP sous Microsoft Internet Information Services (IIS).
Cette section contient les instructions pour une installation manuelle sous IIS (Internet Information Services) 5.1 et IIS 6.0 de PHP sous Microsoft Windows XP et Windows Server 2003. Pour des instructions sur la configuration sous IIS 7.0 et supérieur sous Windows Vista, Windows Server 2008, Windows 7 et Windows Server 2008 R2, reportez-vous à la section Microsoft IIS 7.0 et suivant.
Téléchargez et installez PHP suivant les instructions décrites dans les étapes d'installation manuelle.
Note:
La version PHP non thread-safe est recommandé lors de l'utilisation d'IIS. Ces versions sont disponibles sur la page » PHP pour Windows : Binaires et sources.
Configurez les options CGI- et FastCGI du fichier php.ini comme ceci :
Exemple #1 Options de configuration de CGI et FastCGI du fichier php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Téléchargez et installez l'extension » Microsoft FastCGI pour IIS 5.1 et 6.0. L'extension est disponible pour les plate-formes 32-bit et 64-bit - sélectionnez le bon paquet pour votre plate-forme..
Configurez l'extension FastCGI pour gérer les requêtes spécifiques PHP en exécutant la commande ci-dessous. Remplacez la valeur du paramètre "-path" avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #2 Configuration de l'extension FastCGI pour gérer les requêtes PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -add -section:"PHP" ^ -extension:php -path:"C:\PHP\php-cgi.exe"
Cette commande va créer un mapping des scripts IIS pour les extensions de fichiers *.php, ce qui aura pour effet la gestion de toutes les URLs se terminant par .php par l'extension FastCGI. De plus, la commande configurera l'extension FastCGI lui demandant d'utiliser l'exécutable php-cgi.exe pour traiter les requêtes PHP.
Note:
A ce point, les étapes d'installation et de configuration nécessaires sont terminées. Les instructions qui suivent dans cette section sont optionnelles mais vivement recommandées afin d'atteindre des fonctionnalités et des performances optimales de PHP sous IIS.
Il est recommandé d'activer l'usurpation d'identité pour FastCGI en PHP lors de l'utilisation avec IIS. Ce mode est contrôlé par la directive fastcgi.impersonate du fichier php.ini. Lorsque ce mode est activé, PHP effectuera toutes les opérations du système de fichiers avec le compte utilisateur qui a été choisi pour l'authentification IIS. Ceci assure que, même si le même processus PHP est partagé avec différents sites web IIS, les scripts PHP de ces sites web ne pourront pas accéder aux autres fichiers tant que différents comptes utilisateurs sont utilisées pour l'authentification IIS de chaque site web.
Par exemple, IIS 5.1 et IIS 6.0, dans leurs configurations par défaut, ont d'activé l'authentification anonyme avec le compte interne IUSR_<MACHINE_NAME> utilisé comme identité par défaut. Ceci signifie que, afin de permettre à IIS d'exécuter des scripts PHP, il est nécessaire de donner les droits de lecture au compte IUSR_<MACHINE_NAME> pour ces scripts. Si les applications PHP doivent effectuer des opérations en écriture sur certains fichiers ou écrire des fichiers dans des dossiers, le compte IUSR_<MACHINE_NAME> doit avoir les permissions en écriture sur ces différents éléments.
Pour déterminer quel est le compte utilisateur utilisé par l'authentification anonyme IIS, suivez ces étapes :
Dans le menu de démarrage de Windows, choisissez : "Run:", tapez "inetmgr" et cliquez sur "Ok";
Dépliez la liste des sites Web sous le nœud "Web Sites" de l'arbre, faîtes un clic droit sur un site web utilisé et sélectionnez "Properties";
Cliquez sur l'onglet "Directory Security";
Prenez note du champ "User name:" dans le dialogue "Authentication Methods"
Pour modifier la configuration des permissions sur des fichiers ou des dossiers, utilisez l'explorateur Windows ou la commande icacls.
Exemple #3 Configuration des permissions d'accès
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Les documents par défaut IIS sont utilisés pour les requêtes HTTP qui ne spécifie pas de nom de document. Avec les applications PHP, index.php agit généralement comme document par défaut. Pour ajouter index.php à la liste des documents par défaut IIS, suivez ces étapes :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "inetmgr" et cliquez sur "Ok";
faîtes un clic droit sur le nœud "Web Sites" de l'arbre et sélectionnez "Properties";
Cliquez sur l'onglet "Documents";
Cliquez sur le bouton "Add..." et entrez "index.php" comme "Default content page:".
Configurez l'extension IIS FastCGI pour le recyclage des processus PHP en utilisant la commande ci-dessous. La directive instanceMaxRequests de FastCGI contrôle le nombre de requêtes a traité par un seul processus php-cgi.exe avant l'extinction de l'extension FastCGI. La variable d'environnement PHP PHP_FCGI_MAX_REQUESTS contrôle le nombre de requêtes qu'un seul processus php-cgi.exe peut gérer avant de ce recycler lui-même. Assurez-vous que la valeur spécifiée pour la directive InstanceMaxRequests FastCGI est inférieure ou égale à la valeur spécifiée pour la directive PHP_FCGI_MAX_REQUESTS.
Exemple #4 Configuration du recyclage FastCGI et PHP
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -InstanceMaxRequests:10000 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000
Augmentez le délai d'expiration pour l'extension FastCGI s'il y a des applications dont les scripts PHP mettent beaucoup de temps à s'exécuter. Les 2 configurations qui contrôlent les délais d'expiration sont ActivityTimeout et RequestTimeout. Referez-vous à la » configuration de l'extension FastCGI pour IIS 6.0 pour plus d'informations sur ces configurations.
Exemple #5 Configuration du délai d'expiration FastCGI
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -ActivityTimeout:90 cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -RequestTimeout:90
PHP recherche le fichier php.ini dans différents endroits et il est possible de modifier ces endroits de recherche du fichier php.ini en utilisant la variable d'environnement PHPRC. Pour demander à PHP de charger le fichier de configuration depuis un dossier personnalisé, exécutez la commande ci-dessous. Le chemin absolu du dossier contenant le fichier php.ini doit être spécifié sous la variable d'environnement PHPRC.
Exemple #6 Modification du dossier contenant le fichier php.ini
cscript %windir%\system32\inetsrv\fcgiconfig.js -set -section:"PHP" ^ -EnvironmentVars:PHPRC:"C:\Some\Directory\"
Cette section contient les instructions pour une configuration manuelle d'IIS (Internet Information Services) 7.0 et suivants pour fonctionner avec PHP sous Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 et Windows Server 2008 R2. Pour des instructions de configuration d'IIS 5.1 et IIS 6.0 sous Windows XP et Windows Server 2003, reportez-vous à la documentation sur Microsoft IIS 5.1 et IIS 6.0.
Le module FastCGI est désactivé par défaut sous IIS. Les étapes pour l'activer diffèrent suivant la version de Windows utilisée.
Pour activer le support FastCGI sous Windows Vista SP1 et Windows 7 :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "optionalfeatures.exe" et cliquez sur "Ok";
Dans la fenêtre "Windows Features", dépliez l'arbre "Internet Information Services", "World Wide Web Services", "Application Development Features", puis, activez la boite à cocher "CGI";
Cliquez sur OK et attendez que l'installation se termine.
Pour activer le support FastCGI sous Windows Server 2008 et Windows Server 2008 R2 :
Dans le menu de démarrage Windows, choisissez "Run:", tapez "CompMgmtLauncher" et cliquez sur "Ok";
Si le rôle "Web Server (IIS)" n'est pas présent dans le nœud "Roles" , ajoutez-le en cliquant sur "Add Roles";
Si le rôle "Web Server (IIS)" est présent, cliquez sur "Add Role Services", puis, activez la boite à cocher "CGI" sous le groupe "Application Development";
Cliquez sur "Next", puis "Install", et attendez la fin de l'installation.
Téléchargez et installez PHP suivant les instructions décrites dans les étapes d'installation manuelle.
Note:
La version PHP non thread-safe est recommandée lors de l'utilisation d'IIS. Les versions non thread-safe sont disponibles sur la page » PHP pour Windows : Binaires et sources.
Configurez les options CGI et FastCGI dans le fichier php.ini comme ceci :
Exemple #1 Options CGI et FastCGI dans le fichier php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Configurez le gestionnaire de mapping IIS pour PHP en utilisant soit l'interface de gestion utilisateurs IIS ou l'outil en ligne de commande.
Suivez ces étapes pour créer un gestionnaire de mapping IIS pour PHP dans l'interface de gestion utilisateurs IIS :
Dans le menu démarrer de Windows, choisissez "Run:", tapez "inetmgr" et cliquez sur "Ok";
Dans l'interface de gestion utilisateurs IIS, sélectionnez le nœud correspondant au serveur dans l'arbre "Connections";
Dans la page "Features View", ouvrez la fonctionnalité "Handler Mappings";
Dans le panneau "Actions", cliquez sur "Add Module Mapping...";
Dans la fenêtre "Add Module Mapping", entrez ceci :
Cliquez sur le bouton "Request Restrictions", puis, configurez le mappin pour appeler le gestionnaire uniquement si la requête est mappée à un fichier ou un dossier;
Cliquez sur OK sur tous les dialogues pour sauvegarder la configuration.
Utilisez la commande suivante pour créer une file de processus IIS FastCGI qui utilisera l'exécutable php-cgi.exe pour traiter les requêtes PHP. Remplacez la valeur du paramètre fullPath avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #2 Création d'une file de processus IIS FastCGI
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Configurez IIS pour gérer les requêtes PHP spécifiques en exécutant la commande suivante. Remplacez la valeur du paramètre scriptProcessor avec le chemin absolu vers le fichier php-cgi.exe.
Exemple #3 Création d'un gestionnaire de mapping pour les requêtes PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
Cette commande crée un gestionnaire de mapping IIS pour les fichiers dont l'extension est *.php, ce qui fera que toutes les URLs qui se terminent par .php seront gérées par le module FastCGI.
Note:
À ce moment, les étapes d'installation et de configuration nécessaires sont terminées. Les instructions qui suivent sont optionnelles mais vivement recommandées afin d'avoir un maximum de fonctionnalités mais aussi de bonnes performances pour PHP sous IIS.
Il est recommandé d'activer l'usurpation d'identité FastCGI en PHP lors de l'utilisation avec IIS. Ce mode est contrôlé par la directive fastcgi.impersonate du fichier php.ini. Lorsque l'usurpation d'identité est active, PHP effectuera toutes les opérations sur le systèmes de fichiers en se faisant passer pour le compte utilisateur qui a été déterminé par l'authentification IIS. Ceci assure que même si le même processus PHP est partagé sur plusieurs sites Web IIS, les scripts PHP de ces sites Web ne pourront pas accéder aux autres fichiers sachant qu'un compte utilisateur différent est utilisé pour l'authentification IIS de chacun de ces sites.
Par exemple, IIS 7, dans sa configuration par défaut, a d'activer l'authentification anonyme avec le compte utilisateur interne IUSR, utilisé comme identité par défaut. Ceci signifie que, pour qu'IIS puisse exécuter des scripts PHP, il est nécessaire d'avoir une permission en lecture pour le compte utilisateur IUSR sur ces scripts. Si les applications PHP doivent effectuer des opérations en écriture sur certains fichiers ou écrire des fichiers dans des dossiers, alors le compte IUSR doit avoir les bonnes permissions en écriture.
Pour déterminer le compte utilisateur utilisé comme identité anonyme sous IIS 7, utilisez la commande suivante. Remplacez "Default Web Site" avec le nom du site web IIS que vous utilisez. Dans l'élément de configuration XML, regardez l'attribut userName.
Exemple #4 Déterminer le compte utilisé comme identité anonyme sous IIS
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^
/section:anonymousAuthentication
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="IUSR" />
</authentication>
</security>
</system.webServer>
Note:
Si l'attribut userName n'est pas présent dans l'élément anonymousAuthentication, ou s'il est vide, alors cela signifie que l'identité de l'application est bien l'identité anonyme pour ce site web.
Pour modifier la configuration sur les permissions de ces fichiers ou ces dossiers, utilisez l'interface de l'explorateur Windows ou la ligne commande icacls.
Exemple #5 Configuration des permissions d'accès aux fichiers
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Les documents par défaut IIS sont utilisés pour les requêtes HTTP qui ne spécifient pas un nom de document. Avec les applications PHP, index.php agit généralement comme document par défaut. Pour ajouter index.php à la liste des documents par défaut d'IIS, utilisez la commande suivante :
Exemple #6 Définir index.php comme document par défaut sous IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
Configurez l'extension IIS FastCGI pour le recyclage des processus PHP en utilisant la commande ci-dessous. La directive instanceMaxRequests de FastCGI contrôle le nombre de requêtes a traité par un seul processus php-cgi.exe avant l'extinction d'IIS. La variable d'environnement PHP PHP_FCGI_MAX_REQUESTS contrôle le nombre de requêtes qu'un seul processus php-cgi.exe peut gérer avant de ce recycler lui-même. Assurez-vous que la valeur spécifiée pour la directive InstanceMaxRequests FastCGI est inférieure ou égale à la valeur spécifiée pour la directive PHP_FCGI_MAX_REQUESTS.
Exemple #7 Configuration du recyclage FastCGI et PHP
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^
[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Augmentez le délai d'expiration pour l'extension FastCGI s'il y a des applications dont les scripts PHP mettent beaucoup de temps à s'exécuter. Les 2 configurations qui contrôlent les délais d'expiration sont activityTimeout et requestTimeout. Utilisez les commandes ci-dessous pour modifier la configuration du délai d'expiration. Assurez-vous de remplacer la valeur du paramètre fullPath par le chemin absolu vers le fichier php-cgi.exe.
Exemple #8 Configuration du délai d'expiration FastCGI
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
PHP recherche le fichier php.ini dans différents endroits et il est possible de modifier ces endroits de recherche du fichier php.ini par défaut en utilisant la variable d'environnement PHPRC. Pour demander à PHP de charger le fichier de configuration depuis un dossier personnalisé, exécutez la commande ci-dessous. Le chemin absolu du dossier contenant le fichier php.ini doit être spécifié sous la variable d'environnement PHPRC.
Exemple #9 Modification du dossier contenant le fichier php.ini
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
Cette section contient des notes et conseils spécifiques pour l'installation de PHP avec Apache 1.3.x sur les systèmes Microsoft Windows. Il y a aussi des instructions et des notes spécifiques pour Apache 2 sur une page séparée.
Note:
Lisez les étapes d'installation du manuel d'abord !
Il y a deux méthodes pour faire fonctionner PHP avec Apache 1.3.x sous Windows. La première est d'utiliser l'exécutable CGI (php.exe pour PHP 4 et php-cgi.exe pour PHP 5), l'autre est d'utiliser les modules Apache DLL. Dans les deux cas, vous devez arrêter le serveur Apache, éditer votre fichier httpd.conf pour dire à Apache de prendre PHP en compte et redémarrer Apache.
Maintenant que le module SAPI a été rendu plus stable sous Windows, nous recommandons son usage plutôt que celui de l'exécutable CGI, car il est plus transparent et sécurisé.
Bien qu'il puisse y avoir quelques différences de configuration de PHP sous Apache, le processus reste simple et à la portée du néophyte. Reportez-vous aux documentations Apache pour plus de détails sur ces directives.
Après avoir modifié le fichier de configuration, pensez à redémarrer le serveur web, par exemple avec NET STOP APACHE suivi de NET START APACHE, si vous utilisez Apache comme service Windows, ou bien utilisez vos alias classiques.
Note: Souvenez-vous que lorsque vous ajoutez des valeurs représentants un chemin dans la configuration d'Apache sous Windows, tous les antislash, comme c:\repertoire\fichier.ext, devraient être convertis en slashes, comme c:/repertoire/fichier.ext. Un slash final peut également être nécessaire pour les dossiers.
Vous devez ajouter les lignes suivantes à votre fichier de configuration Apache httpd.conf :
Exemple #1 PHP comme module Apache 1.3.x
Cet exemple suppose que PHP est installé dans le dossier c:\php. Ajustez le chemin si ce n'est pas le cas.
Pour PHP 4 :
# À ajouter à la fin de la section LoadModule # N'oubliez pas de copier ce fichier depuis le dossier sapi ! LoadModule php4_module "C:/php/php4apache.dll" # À ajouter à la fin de la section AddModule AddModule mod_php4.c
Pour PHP 5 :
# À ajouter à la fin de la section LoadModule LoadModule php5_module "C:/php/php5apache.dll" # À ajouter à la fin de la section AddModule AddModule mod_php5.c
Pour les deux :
# Ajoutez cette ligne dans les parenthèses conditionnelles <IfModule mod_mime.c> AddType application/x-httpd-php .php # Pour les fichiers de syntaxe colorisée .phps, ajoutez également AddType application/x-httpd-php-source .phps
Si vous avez dézippé le paquet PHP dans le répertoire c:\php\ comme décrit dans la section sur les étapes d'installation du manuel, vous devez insérer ces lignes à votre fichier de configuration Apache pour activer le binaire CGI :
Exemple #2 PHP et Apache 1.3.x en tant que CGI
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php # Pour PHP 4 Action application/x-httpd-php "/php/php.exe" # Pour PHP 5 Action application/x-httpd-php "/php/php-cgi.exe" # spécifez le répertoire où se trouve php.ini SetEnv PHPRC C:/php
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Si vous voulez présenter la source de vos fichiers PHP avec la coloration syntaxique, il n'existe pas d'option équivalente de celle de la version module de PHP. Si vous choisissez de configurer Apache pour utiliser PHP en mode CGI, vous aurez besoin d'utiliser la fonction highlight_file(). Pour réaliser cela simplement, créez un script PHP dans un fichier et ajoutez ce code : <?php highlight_file('original_php_script.php'); ?>.
Cette section contient les notes et conseils d'installation de PHP avec le serveur Apache 2.x sur les systèmes Microsoft Windows. Nous avons également des notes et des instructions pour Apache 1.3.x sur une page séparée.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Note: Support Apache 2.2
Les utilisateurs d'Apache 2.2 doivent conserver à l'esprit que la bibliothèque DLL d'Apache 2.2 sont nommées php5apache2_2.dll plutôt que php5apache2.dll et n'est disponible que pour PHP 5.2.0 et suivants. Voir aussi » http://snaps.php.net/
Il est vivement recommandé de consulter la » documentation Apache pour avoir une meilleure connaissance du serveur web Apache 2.x. Lisez également les » notes spécifiques à Windows pour Apache 2.x avant de lire cette documentation.
Apache 2.x est prévu pour fonctionner sur les versions de Windows désignées comme serveurs, comme Windows NT 4.0, Windows 2000, Windows XP, ou Windows 7. Bien qu'Apache 2.x fonctionne parfaitement bien sous Windows 9x, le support de ces plateformes est incomplet et quelques fonctionnalités peuvent ne pas fonctionner correctement ; et il n'est pas prévu d'améliorer cela.
Téléchargez la version la plus récente de » Apache 2.x et une version de PHP. Suivez les instructions d'installation manuelle puis revenez ici pour réaliser l'intégration de PHP et Apache.
Il y a trois méthodes pour que PHP fonctionne avec Apache 2.x sous Windows. Vous pouvez exécuter PHP comme gestionnaire, comme CGI ou comme FastCGI.
Note: Souvenez-vous que lorsque vous ajoutez des valeurs représentants un chemin dans la configuration d'Apache sous Windows, tous les antislash, comme c:\repertoire\fichier.ext, devraient être convertis en slashes, comme c:/repertoire/fichier.ext. Un slash final peut également être nécessaire pour les dossiers.
Vous devez insérer les lignes suivantes dans le fichier de configuration httpd.conf d'Apache pour charger le module PHP pour Apache 2.x :
Exemple #1 PHP et Apache 2.x comme gestionnaire
# LoadModule php5_module "c:/php/php5apache2.dll" AddHandler application/x-httpd-php .php # configure the path to php.ini PHPIniDir "C:/php"
Note: Rappelez-vous de placer votre chemin actuel de PHP dans le chemin C:/php/ des exemples ci-dessous. Assurez-vous d'utiliser soit php5apache2.dll, soit php5apache2_2.dll dans la directive LoadModule et de vérifiez que le fichier correspondant est en réalité situé dans le chemin utilisé dans cette directive.
La configuration suivante activera le gestionnaire PHP pour tous les fichiers qui ont l'extension .php, même si d'autres extensions sont utilisées pour ces fichiers. Par exemple, un fichier nommé example.php.txt sera exécuté par le gestionnaire PHP. Pour vous assurez que seuls les fichiers se terminant par .php sont exécutés, utilisez plutôt la configuration suivante :
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Vous devriez consulter la » documentation Apache CGI où vous trouverez toutes les informations nécessaires à l'exécution d'Apache CGI.
Pour exécuter PHP en tant que CGI, vous devez placer tous vos fichiers php-cgi dans un dossier désigné comme dossier CGI en utilisant la directive ScriptAlias.
Vous devez ensuite insérer une ligne #! dans vos fichiers PHP, pointant vers le binaire PHP :
Exemple #2 PHP et Apache 2.x en tant que CGI
#!C:/php/php.exe <?php phpinfo(); ?>
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
L'exécution de PHP en tant que FastCGI a un beaucoup d'avantages contrairement à son exécution en tant que CGI. Sa mise en place de cette manière est assez simple :
Récupérez mod_fcgid depuis » http://httpd.apache.org/mod_fcgid/. Les bibliothèques Win32 sont disponibles au téléchargement depuis ce site. Installez le module suivant les instructions fournies.
Configurez votre serveur web comme ci-dessous, en vous assurant d'ajuster tous les chemins pour refléter votre configuration système particulière :
Exemple #3 Configuration d'Apache pour exécuter PHP en tant que FastCGI
LoadModule fcgid_module modules/mod_fcgid.so # Où se trouve le fichier php.ini ? FcgidInitialEnv PHPRC "c:/php" AddHandler fcgid-script .php FcgidWrapper "c:/php/php-cgi.exe" .php
Cette section contient les notes et détails spécifiques à l'installation de PHP sur des serveurs Sun Java System Web Server, Sun ONE web Server, Netscape et iPlanet, sous Windows.
Depuis PHP 4.3.3, vous pouvez utiliser les scripts PHP avec le module NSAPI pour gérer des listes de dossiers et des pages d'erreurs personnalisées. Des fonctions supplémentaires sont disponibles pour assurer la compatibilité avec Apache. Pour du support sur les serveurs courants, voyez la note sur les sous-requêtes.
Pour installer PHP en CGI, suivez ce qui suit :
Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Plus de détails sur la configuration de PHP comme CGI sont disponibles à » http://benoit.noss.free.fr/php/install-php.html
Pour installer PHP avec l'interface NSAPI, faites ceci :
Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :
assoc .php=PHPScript ftype PHPScript=c:\php\php.exe %1 %*
Éditez le fichier magnus.conf (pour les serveurs >= 6) ou obj.conf (pour les serveurs < 6) et ajoutez ce qui suit : Vous devez placer ces lignes après mime types init.
Init fn="load-modules" funcs="php4_init,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll" Init fn="php4_init" LateInit="yes" errorString="Failed to initialise PHP!" [php_ini="c:/path/to/php.ini"]
Configurez l'objet par défaut dans le fichier obj.conf (pour les classes de serveur virtuel [Sun Web Server 6.0+], dans le fichier vserver.obj.conf) : dans la section <Object name="default">, placez cette ligne nécessairement avant toutes les lignes 'ObjectType' et après toutes les lignes 'ObjectType' :
Service fn="php4_execute" type="magnus-internal/x-httpd-php" [inikey=value inikey=value ...]
Cela n'est nécessaire que si vous voulez configurer un dossier qui ne contiendra que vos scripts PHP (tout comme un dossier cgi-bin) :
<Object name="x-httpd-php"> ObjectType fn="force-type" type="magnus-internal/x-httpd-php" Service fn=php4_execute [inikey=value inikey=value ...] </Object>
Note:
Plus de détails sur la configuration de PHP comme filtre NSAPI peuvent être trouvés ici : » http://benoit.noss.free.fr/php/install-php4.html
Note:
La taille de la pile que PHP utilise dépend de la configuration du serveur web. Si vous rencontrez des crashs avec les grands scripts PHP, il est recommandé d'augmenter la taille de la pile avec la console d'administration : dans la section "MAGNUS EDITOR".
Il est important de garder en tête que iPlanet/SunONE/Netscape est un serveur web multi-threadé. Comme toutes les requêtes se situent dans le même contexte (c'est le contexte sur serveur web), et que ce contexte est unique. SI vous voulez accéder a des variables comme PATH_INFO, HTTP_HOST etc. il n'est pas recommandé d'y accéder à l'ancienne manière de PHP, avec la fonction getenv() ou une autre méthode (register globals, $_ENV). De cette manière, vous n'aurez que des valeurs d'environnement du serveur, et non pas des valeurs correctes pour le CGI.
Note:
Pourquoi est-ce que les variables CGI sont invalides ?
C'est lié au fait que le processus du serveur web est lancé par l'administrateur du serveur, qui utilise le script de lancement au démarrage. En fait, il aurait fallu que vous lanciez vous-même le processus. C'est pour cela que l'environnement du serveur web contient des variables d'environnement CGI. Vous pouvez vérifier cela en lançant le serveur web depuis un autre endroit que l'administrateur du serveur : utilisez la ligne de commande Unix en tant que root : vous verrez alors qu'il n'y a pas de variables d'environnement.
Changez simplement vos scripts pour lire les variables CGI, en utilisant le tableau superglobal $_SERVER. Si vous avez d'autres scripts qui utilisent encore $HTTP_HOST et compagnie, il est recommandé d'activer l'option register_globals dans le php.ini et de changer l'ordre des variables. IMPORTANT : supprimez le "E" dans cette option, car vous n'en avez pas besoin pour cet environnement.
variables_order = "GPCS" register_globals = On
Vous pouvez utiliser PHP pour générer des pages d'erreurs de type "404 Not Found" ou apparentée. Ajoutez la ligne suivante dans le fichier obj.conf pour chaque page d'erreur que vous souhaitez remplacer :
Error fn="php4_execute" code=XXX script="/path/to/script.php" [inikey=value inikey=value...]
Une autre possibilité est de générer une liste de dossiers personnalisée. Créez simplement un script PHP qui affiche le contenu du dossier, et remplacez la ligne Service par défaut par type="magnus-internal/directory" dans obj.conf avec ceci :
Service fn="php4_execute" type="magnus-internal/directory" script="/path/to/script.php" [inikey=value inikey=value...]
Le module NSAPI supporte désormais la fonction nsapi_virtual() (alias : virtual()), pour réaliser des sous requêtes au serveur web, et inclure le résultat dans une page. Le problème est que cette fonction utilise une fonctionnalité non documentée de la bibliothèque NSAPI.
Sous Unix, ce n'est pas un problème, car le module va automatiquement rechercher les fonctions nécessaires, et les utiliser si elles sont disponibles. Sinon, nsapi_virtual() sera désactivée.
Sous Windows, des limitations dans la gestion des DLL impose l'utilisation de la plus récente bibliothèque ns-httpdXX.dll. Cela a été testé pour les serveurs jusqu'à la version 6.0. Si une nouvelle version de SunONE server est utilisée, la détection échoue, et nsapi_virtual() est désactivée.
Dans ce cas, essayez ceci : ajoutez le paramètre suivant à php4_init dans magnus.conf/obj.conf :
Init fn=php4_init ... server_lib="ns-httpdXX.dll"
Vous pouvez vérifier le statut en utilisant la fonction phpinfo().
Note:
Soyez prévenu : le support de nsapi_virtual() est expérimental.
Cette section contient les notes et conseils d'installation de PHP sur les serveurs » Sambar, sur Windows.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Cette liste décrit comment configurer le module ISAPI avec le serveur Sambar sous Windows.
Trouvez le fichier appelé mappings.ini (dans le dossier de configuration), dans le dossier d'installation de Sambar.
Ouvrez mappings.ini et ajoutez la ligne suivante, sous la section [ISAPI] :
Exemple #1 Configuration ISAPI de Sambar
#pour PHP 4 *.php = c:\php\php4isapi.dll #pour PHP 5 *.php = c:\php\php5isapi.dll
Maintenant, redémarrez le serveur Sambar pour que les modifications prennent effet.
Note:
Si vous voulez utiliser PHP pour communiquer avec les ressources se trouvant sur un autre ordinateur de votre réseau, vous devez modifier le compte utilisé par le service Sambar Server. Le compte par défaut utilisé par le service Sambar Server est LocalSystem, qui n'a pas accès aux ressources distantes. Le compte peut être modifié en utilisant les options des services, se trouvant dans le centre de contrôle de Windows.
Cette section contient les conseils d'installation spécifiques à » Xitami sur Microsoft Windows.
Note:
Vous devriez lire les étapes d'installation du manuel d'abord !
Cette liste décrit comment installer PHP comme CGI exécutable avec Xitami sous Windows.
Note: Important pour les utilisateurs de CGI
Lisez la FAQ sur cgi.force_redirect pour d'importants détails. Cette directive doit être configurée à 0. Si vous voulez utiliser $_SERVER['PHP_SELF'], vous devez activer la directive cgi.fix_pathinfo.
En utilisant le mode CGI, votre serveur est ouvert à de possibles attaques sérieuses. Lisez attentivement notre section sur la sécurité en mode CGI pour apprendre comment vous défendre contre ces attaques.
Assurez-vous que le serveur web fonctionne, et allez dans la console d'administration du serveur (généralement http://127.0.0.1/admin), puis cliquez sur "Configuration".
Naviguez dans les Filters, et ajoutez l'extension que vous souhaitez (souvent .php) dans le champ File extensions.
Dans la commande Filter, ajoutez le nom et le chemin de votre exécutable PHP i.e C:\php\php.exe pour PHP 4 ou C:\php\php-cgi.exe pour PHP 5.
Cliquez sur le bouton Save.
Redémarrez le serveur pour prendre en compte les modifications.
Ce chapitre va vous apprendre à compiler PHP depuis les sources sous Windows, en utilisant les utilitaires Microsoft. Pour compiler PHP avec Cygwin, référez-vous à Installation sur les systèmes UNIX.
Reportez-vous à la documentation fournie par le wiki : » http://wiki.php.net/internals/windows/stepbystepbuild.
Après avoir installé PHP et un serveur web sous Windows, vous devriez probablement vouloir installer quelques extensions pour avoir des fonctionnalités supplémentaires. Vous pouvez choisir quelles extensions seront chargées lors du démarrage de PHP en modifiant votre php.ini. Vous pouvez également en charger dynamiquement dans vos scripts à l'aide de la fonction dl().
Les bibliothèques DLLs pour les extensions PHP sont préfixées par php_.
Beaucoup d'extensions sont incluses dans la version pour Windows de PHP. Cela signifie que les bibliothèques DLL additionnelles et la directive extension ne sont pas utilisées pour charger ces extensions. La table des extensions PHP pour Windows liste les extensions qui requièrent des bibliothèques DLL additionnelles PHP. Voici une liste d'extensions internes :
En PHP 4 (mise à jour : PHP 4.3.11) : BCMath, Caledar, COM, Ctype, FTP, MySQL, ODBC, Overload, PCRE, Session, Tokenizer, WDDX, XML et Zlib
En PHP 5 (mise à jour : PHP 5.0.4), les changements suivants existent. En interne : DOM, LibXML, Iconv, SimpleXML, SPL et SQLite. Les suivants ne sont plus intégrés : MySQL and Overload.
Le dossier par défaut dans lequel PHP cherche des extensions est c:\php4\extensions en PHP 4 et c:\php5 en PHP 5. Pour changer ce comportement pour refléter votre installation de PHP, éditez votre fichier php.ini :
Vous devriez pouvoir changer le paramètre extension_dir pour pointer vers le dossier contenant vos extensions ou l'endroit où vous avez placé vos fichiers php_*.dll. Par exemple :
extension_dir = c:\php\extensions
Pour activer ces extensions dans votre php.ini, vous devez décommenter les lignes extension=php_*.dll dans votre php.ini. Cela se fait en effaçant le point virgule (";") du début de la ligne que vous voulez activer.
Exemple #1 Activer l'extension Bzip2 pour PHP-Windows
// changez la ligne suivante : ;extension=php_bz2.dll // En : extension=php_bz2.dll
Quelques extensions ont besoin de bibliothèques DLLs supplémentaires pour fonctionner. La plupart d'entre elles peuvent être trouvées dans le paquet de votre distribution de PHP, dans le dossier c:\php\dlls\ en PHP 4 ou dans le dossier principal en PHP 5 mais quelques autres, comme Oracle (php_oci8.dll), requierent des DLLs qui ne sont pas fournies avec votre distribution de PHP. Si vous installez PHP 4, copiez les bibliothèques DLLs depuis le dossier C:\php\dlls vers le dossier principal C:\php. N'oubliez pas d'inclure le dossier C:\php dans la variable d'environnement PATH (ce processus est expliqué dans une entrée de la FAQ).
Quelques-unes de ces bibliothèques ne sont pas incluses dans la distribution de PHP. Lisez la documentation de chaque extension pour plus de détails. Lisez également la section du manuel nommée Installation d'extensions PECL pour plus de détails sur PECL. Un nombre toujours plus important d'extensions PHP se trouve dans PECL, et ces extensions nécessitent un téléchargement séparé.
Note: Si vous utilisez PHP en tant que module d'un serveur web, pensez à redémarrer votre serveur web pour charger les modifications apportées au fichier php.ini.
La table suivante décrit quelques extensions disponibles requérant des bibliothèques DLLs supplémentaires.
| Extension | Description | Notes |
|---|---|---|
| php_bz2.dll | bzip2 : fonctions de compression | Non |
| php_calendar.dll | Calendar : fonctions de conversion | Intégrées à PHP depuis la version 4.0.3 |
| php_crack.dll | Fonctions Crack | None |
| php_ctype.dll | Famille de fonctions ctype | Intégrées à PHP depuis la version 4.3.0 |
| php_curl.dll | Fonctions de bibliothèque client CURL | Requiert : libeay32.dll, ssleay32.dll (intégré) |
| php_dba.dll | DBA: DataBase (dbm-style) Fonctions d'abstraction | Non |
| php_dbase.dll | Fonctions dBase | Non |
| php_dbx.dll | Fonctions dbx | |
| php_domxml.dll | Fonctions DOM XML | PHP <= 4.2.0 requiert : libxml2.dll (intégré) PHP >= 4.3.0 requiert : iconv.dll (intégré) |
| php_dotnet.dll | Fonctions .NET | PHP <= 4.1.1 |
| php_exif.dll | Fonctions EXIF | php_mbstring.dll. Attention, php_exif.dll doit être chargé après php_mbstring.dll dans le php.ini. |
| php_fbsql.dll | Fonctions FrontBase | PHP <= 4.2.0 |
| php_fdf.dll | FDF : fonctions Forms Data Format. | Requiert : fdftk.dll (intégré) |
| php_filepro.dll | Fonctions filePro | Accès en lecture seule |
| php_ftp.dll | Fonctions FTP | Intégrées à PHP depuis la version 4.0.3 |
| php_gd.dll | GD : bibliothèque de fonctions image | Supprimer en PHP 4.3.2. Notez que les fonctions sur les couleurs vraies ne sont pas disponibles en GD1 ; utilisez plutôt php_gd2.dll. |
| php_gd2.dll | GD : Bibliothèque de fonctions image | GD2 |
| php_gettext.dll | Fonctions Gettext | PHP <= 4.2.0 requiert gnu_gettext.dll (intégré), PHP >= 4.2.3 requiert libintl-1.dll, iconv.dll (intégré). |
| php_hyperwave.dll | Fonctions HyperWave | Non |
| php_iconv.dll | ICONV : conversion de jeux de caractères | Requiert : iconv-1.3.dll (intégré), PHP >=4.2.1 iconv.dll |
| php_ifx.dll | Fonctions Informix | Requiert : bibliothèque Informix |
| php_iisfunc.dll | Fonctions d'administration IIS | Non |
| php_imap.dll | IMAP : fonctions POP3 et NNTP | Non |
| php_ingres.dll | Fonctions Ingres | Requiert : bibliothèque Ingres |
| php_interbase.dll | Fonctions InterBase | Requiert : gds32.dll (intégré) |
| php_java.dll | Fonctions Java | PHP <= 4.0.6 requit : jvm.dll (intégré) |
| php_ldap.dll | Fonctions LDAP | PHP <= 4.2.0 requiert libsasl.dll (intégré), PHP >= 4.3.0 requiert libeay32.dll, ssleay32.dll (intégré) |
| php_mbstring.dll | Fonctions Chaînes multioctets | Non |
| php_mcrypt.dll | Fonctions Mcrypt Encryption | Requiert : libmcrypt.dll |
| php_mhash.dll | Fonctions Mhash | PHP >= 4.3.0 requiert : libmhash.dll (intégré) |
| php_mime_magic.dll | Fonctions Mimetype | Requiert : magic.mime (intégré) |
| php_ming.dll | Fonctions Ming pour Flash | Non |
| php_msql.dll | Fonctions mSQL | Requiert : msql.dll (intégré) |
| php_mssql.dll | Fonctions MSSQL | Requiert : ntwdblib.dll (intégré) |
| php_mysql.dll | Fonctions MySQL | PHP >= 5.0.0, requires libmysql.dll (intégré) |
| php_mysqli.dll | Fonctions MySQLi | PHP >= 5.0.0, requires libmysql.dll (libmysqli.dll en PHP <=5.0.2) (intégré) |
| php_oci8.dll | Fonctions Oracle 8 | Requiert : bibliothèque cliente Oracle 8.1+ |
| php_openssl.dll | Fonctions OpenSSL | Requiert : libeay32.dll (intégré) |
| php_overload.dll | Fonctions Object overloading | Intégrée à PHP depuis la version 4.3.0, supprimé de PHP en version 5.0.0. |
| php_pdf.dll | Fonctions PDF | Non |
| php_pgsql.dll | Fonctions PostgreSQL | Non |
| php_printer.dll | Fonctions Printer | Non |
| php_shmop.dll | Fonctions de partage de mémoire | Non |
| php_snmp.dll | Fonctions SNMP | NT seulement ! |
| php_soap.dll | Fonctions SOAP | PHP >= 5.0.0 |
| php_sockets.dll | Fonctions Socket | Non |
| php_sybase_ct.dll | Fonctions Sybase | Requiert : bibliothèque cliente Sybase |
| php_tidy.dll | Fonctions Tidy | PHP >= 5.0.0 |
| php_tokenizer.dll | Fonctions Tokenizer | Intégrées à PHP depuis la version 4.3.0 |
| php_w32api.dll | Fonctions W32api | Non |
| php_xmlrpc.dll | Fonctions XML-RPC | PHP >= 4.2.1 requiert : iconv.dll (intégré) |
| php_xslt.dll | Fonctions XSLT | PHP <= 4.2.0 requiert sablot.dll, expat.dll (intégré). PHP >= 4.2.1 requiert sablot.dll, expat.dll et iconv.dll (intégré). |
| php_yaz.dll | Fonctions YAZ | Requiert : yaz.dll (intégré) |
| php_zip.dll | Fonctions Zip File | Accès en lecture seule |
| php_zlib.dll | Fonctions de compression ZLib | Intégrées à PHP depuis la version 4.3.0 |
Cette section contient les notes et les astuces spécifiques à l'installation de PHP depuis la ligne de commande sous Windows.
Note:
Vous devriez lire les étapes du manuel d'installation d'abord !
Faire fonctionner PHP depuis la ligne de commande peut être effectué sans aucune modification de Windows.
C:\PHP5\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
Mais il existe quelques étapes à suivre pour rendre ceci plus simple. La plupart de ces étapes ont déjà dû être faite, mais elles sont répétées ici pour fournir une séquence étape par étape complète.
Note:
Les variables PATH et PATHEXT sont des variables systèmes pré-existantes importantes sous Windows, et il est important de ne faire qu'ajouter des éléments, sans les écraser totalement.
Ajouter la localisation de l'exécutable PHP (php.exe, php-win.exe ou php-cli.exe suivant la version de PHP ainsi que les préférences d'affichage) à la variable d'environnement PATH. Vous trouverez plus d'informations concernant l'ajout du dossier PHP à la variable PATH dans l'entrée correspondante de la FAQ.
Ajouter l'extension .PHP à la variable d'environnement PATHEXT. Ceci peut être fait lors de la modification de la variable d'environnement PATH. Suivez les mêmes étapes que celles décrites dans la FAQ mais utilisez la variable PATHEXT au lieu de la variable d'environnement PATH.
Note:
La position à laquelle vous placez le .PHP déterminera le script ou le programme à exécuter lorsqu'un nom de fichier de cette forme sera trouvé. Par exemple, le fait de placer .PHP avant .BAT fera que votre script sera exécuté à la place du fichier batch, s'il y a un fichier batch avec le même nom.
Associer l'extension .PHP avec un type de fichier. Ceci peut être fait en exécutant la commande suivante :
assoc .php=phpfile
Associer le type de fichier phpfile avec l'exécutable PHP approprié. Ceci peut être fait en exécutant la commande suivante :
ftype phpfile="C:\PHP5\php.exe" -f "%1" -- %~2
Ces étapes permettent aux scripts PHP d'être exécutés depuis n'importe quel répertoire, sans pour autant spécifier l'exécutable PHP ou l'extension .PHP, et tous les paramètres seront passés au script pour traitement.
L'exemple ci-dessous montre les modifications pouvant être faites manuellement au registre Windows.
Exemple #1 Modification du registre
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php] @="phpfile" "Content Type"="application/php" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile] @="PHP Script" "EditFlags"=dword:00000000 "BrowserFlags"=dword:00000008 "AlwaysShowExt"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon] @="C:\\PHP5\\php-win.exe,0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell] @="Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open] @="&Open" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command] @="\"C:\\PHP5\\php.exe\" -f \"%1\" -- %~2"
Avec ces modifications, la même commande peut maintenant être écrite comme ceci :
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
script -arg1 -arg2 -arg3
Note:
Il y a un petit problème si vous tentez d'utiliser cette technique et qu'en même temps, vous utilisez votre script PHP comme filtre d'une commande, comme ceci :
oudir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3Vous pourriez trouver que le script s'interrompt et que rien ne s'affiche. Afin de rendre ceci opérationnel, vous devez effectuer une nouvelle modification au registre Windows.dir | script -arg1 -arg2 -arg3Plus d'informations concernant ce problème peuvent être trouvées dans » l'article de la base de connaissance Microsoft : 321788.Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer] "InheritConsoleHandles"=dword:00000001
PHP s'installe sur le cloud. Vers le cloud PHP !
PHP s'installe sur la plateforme » Azure cloud.
Pour en savoir plus, voyez le » SDK Azure pour PHP.
FPM (FastCGI Process Manager) est une implémentation alternative à PHP FastCGI avec quelques fonctionnalités additionnelles particulièrement utiles pour les environnements à haute charge.
Ces fonctionnalités incluent :
Gestion avancée des processus avec stop/start doux (graceful) ;
Possibilité de démarrer des processus avec différents uid/gid/chroot/environment, écoutant sur différents ports et utilisant différents php.ini (remplace le safe_mode) ;
Journalisation stdout et stderr ;
Redémarrage d'urgence en cas de destruction accidentelle du cache opcode ;
Support de l'upload acccéléré ;
"slowlog" - journalisation des scripts (pas juste leurs noms, mais leur backtrace PHP également, utilisant ptrace ou équivalent pour lire le processus distant) qui s'éxecutent de manière anormalement lente ;
fastcgi_finish_request() - fonction spéciale pour terminer la requête et vider toutes les données tout en continuant d'exécuter une tâche consommatrice (conversion vidéo par exemple) ;
Naissance de processus fils dynamic/static ;
Informations sur la SAPI (similaire à mod_status d'Apache) ;
Fichier de configuration basé sur php.ini
Pour activer FPM dans votre construction de PHP vous devez ajouter la ligne --enable-fpm à votre ligne de configuration.
Il existe de multiples options de configuration pour FPM (toutes optionnelles):
--with-fpm-user - l'utilisateur FPM (defaut - nobody).
--with-fpm-group - le groupe FPM (defaut - nobody).
FPM utilise la syntaxe php.ini pour son fichier de configuration - php-fpm.conf.
pid
string
Chemin vers le fichier PID. Par défaut: none.
error_log
string
Chemin vers le fichier de journal. Par défaut: #INSTALL_PREFIX#/log/php-fpm.log.
log_level
string
Niveau de journalisation d'erreur. Valeurs possibles: alert, error, warning, notice, debug. Par défaut: notice.
emergency_restart_threshold
int
Si ce nombre de processus fils terminent avec un SIGSEGV ou SIGBUS dans l'intervalle de temps précisé dans emergency_restart_interval, alors FPM redémarrera. Une valeur de 0 signifie 'Off'. Valeur par défaut: 0 (Off).
emergency_restart_interval
mixed
Intervalle de temps utilisé par emergency_restart_interval pour determiner lorsqu'un redémarrage doux doit être lancé. Ceci peut être utile pour contourner des corruptions accidentelles dans la mémoire partagée d'un accelérateur. Unités disponibles: s(econdes), m(inutes), h(eures), ou d(ays). Unité par défaut: secondes. Valeur par défaut: 0 (Off).
process_control_timeout
mixed
Temps limite qu'attendront les processus fils pour réagir aux signaux du père. Unités disponibles: s(econdes), m(inutes), h(eures), ou d(ays) Unité par défaut: secondes. Valeur par défaut: 0.
daemonize
boolean
Envoie FPM en arrière plan. Mettez 'no' pour garder FPM au premier plan lors du débogage. Valeur par défaut: yes.
Avec FPM vous pouvez executer plusieurs pools de processus avec des paramètres différents. Voici les paramètres qui peuvent être ajustés par pool.
listen
string
L'adresse pour accepter des requêtes FastCGI. Syntaxes valides: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Cette option est obligatoire pour chaque pool.
listen.backlog
int
Affecte listen(2) backlog. Une valeur de '-1' signifie illimité. Valeur par défaut: -1.
listen.allowed_clients
string
Liste d'adresses ipv4 des clients FastCGI autorisés à se connecter. C'est équivalent à la variable d'environnement FCGI_WEB_SERVER_ADDRS dans le système FastCGI original de PHP (5.2.2+). N'a de sens qu'avec un socket tcp en écoute. Chaque adresse doit être séparée par une virgule. Si cette valeur n'est pas précisée, les connexions seront accceptées depuis toute adresse ip. Valeur par défaut: any.
listen.owner
string
Affecte les permissions pour le socket Unix si utilisé. Sous Linux, les permissions read/write doivent être affectées pour autoriser des connexions depuis un serveur web. Beaucoup de systèmes dérivés BSD autorisent les connexions quelles que soient les permissions. Valeurs par défaut: user et group sont ceux de l'utilisateur courant, le mode est 0666.
listen.group
string
Voyez listen.owner.
listen.mode
string
Voyez listen.owner.
user
string
Utilisateur Unix des processus FPM. Cette option est obligatoire.
group
string
Groupe Unix des processus FPM. Si non précisé, le groupe de l'utilisateur est utilisé.
pm
string
Choisi comment le gestionnaire de processus va contrôler le nombre de processus fils. Valeurs possibles : static, ondemand, dynamic. Option obligatoire.
static - nombre de processus fils fixés (pm.max_children).
ondemand - le processus se réactive à la demande (lorsque demandé, c'est l'opposé de dynamique où pm.start_servers sont démarrés lorsque le service démarre).
dynamic - nombre de processus fils dynamiques basé sur le directives suivantes: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children
int
Nombre de processus fils à créer lorsque pm est réglé sur static. Nombre maximum de processus fils à créer lorsque pm est réglé sur dynamic. Options obligatoire.
Cette option affecte la limite du nombre de requêtes simultanées qui seront servies. Equivalent à ApacheMaxClients avec mpm_prefork et à PHP_FCGI_CHILDREN dans l'implémentation originale de FastCGI de PHP.
pm.start_servers
in
Nombre de processus fils à créer au démarrage. Utilisé seulement si pm est réglé sur dynamic. Valeur par défaut: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.
pm.min_spare_servers
int
Nombre minimum de processus au repos (idle) voulus. Utilisé seulement si pm est réglé sur dynamic. Obligatoire dans ce cas.
pm.max_spare_servers
int
Nombre maximum de processus au repos (idle) voulus. Utilisé seulement si pm est réglé sur dynamic. Obligatoire dans ce cas.
pm.max_requests
int
Nombre de requête que chaque processus fils devrait exécuter avant de renaitre. Ceci peut être utile pour contourner des fuites mémoires dans des librairies tierces. Pour un traitement sans fin des requêtes, précisez '0'. Equivalent à PHP_FCGI_MAX_REQUESTS. Par défaut: 0.
pm.status_path
string
L'URI vers la page de statut de FPM. Si cette valeur n'est pas précisée, aucune page de statut ne sera utilisée, ce qui est le cas par défaut.
ping.path
string
L'URI de ping pour appeler la page de monitoring de FPM. Si aucune valeur n'est précisée, aucune page de ping ne sera disponible. Ceci pourrait être utilisé pour tester depuis l'extérieur si FPM est toujours disponible et prêt à répondre. Notez que la valeur doit commencer par un slash (/).
ping.response
string
Cette directive est utile pour personnaliser la réponse à une requête de ping. La réponse est formatée comme text/plain avec un code de réponse de 200. Valeur par défaut: pong.
request_terminate_timeout
mixed
Le timeout pour servir une requête après lequel le processus concerné sera tué. Cette option devrait être utilisée lorsque l'option 'max_execution_time' ne stoppe pas l'exécution du script pour une raison quelconque. Une valeur de '0' signifie 'Off'. Unités disponibles: s(econdes)(défaut), m(inutes), h(eures), ou d(ays). Par défaut: 0.
request_slowlog_timeout
mixed
Le timeout pour servir une requête dans laquelle la backtrace PHP sera vidée dans le fichier 'slowlog'. Une valeur de '0' signifie 'Off'. Unités disponibles: s(econdes)(défaut), m(inutes), h(eures), ou d(ays). Par défaut: 0.
slowlog
string
Le journal pour les requêtes lentes, par défaut: #INSTALL_PREFIX#/log/php-fpm.log.slow.
rlimit_files
int
Affecte la rlimit pour les descripteurs de fichiers ouverts. Valeur par défaut: valeur du système.
rlimit_core
int
Affecte la taille maximale de rlimit. Valeurs possibles: 'unlimited' ou un entier plus grand ou égal à 0. Valeur par défaut: valeur définie par le système.
chroot
string
Chroot vers ce dossier au démarrage. Cette valeur doit être un chemin absolu. Si cette valeur n'est pas définie, chroot n'est pas utilisé.
chdir
string
Chdir vers ce dossier au démarrage. Cette valeur doit être un chemin absolu. Valeur par défaut: dossier courant ou / si chroot.
catch_workers_output
boolean
Redirige stdout et stderr vers le journal d'erreur principal. Si non précisé, stdout et stderr seront redirigés vers /dev/null selon les specifications FastCGI. Valeur par défaut: no.
Il est possible de passer des variables d'environnement additionnelles et mettre à jour les paramètres de PHP d'un pool. Pour ce faire, vous devez ajouter les options suivantes à php-fpm.conf
Exemple #1 Passer des variables d'environnement et des paramètres PHP à un pool
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Les paramètres définis avec php_admin_value et php_admin_flag ne peuvent être surchargés via ini_set().
Depuis 5.3.3, les paramètres de PHP peuvent être définis dans le serveur web.
Exemple #2 Définit les paramètres PHP dans le fichier nginx.conf
set $php_value "pcre.backtrack_limit=424242"; set $php_value "$php_value \n pcre.recursion_limit=99999"; fastcgi_param PHP_VALUE $php_value; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
En raison du fait que ces configurations sont passées à php-fpm comme en-têtes fastcgi, php-fpm ne doit pas être relié directement au web et ainsi y être directement accessible. Sinon, tout le monde pourra altérer les options de configuration de PHP. Voir aussi l'option listen.allowed_clients.
» PECL est un dépôt d'extensions PHP qui sont disponibles via le système de paquet » PEAR. Cette section du manuel vous guide dans l'obtention et l'installation d'extensions PECL.
Ces instructions supposent que /your/phpsrcdir/ est le chemin jusqu'aux sources de la distribution PHP, et extname est le nom de votre extension PECL : adaptez les commandes qui suivent à votre situation. Ces instructions supposent aussi que vous êtes familier avec l'utilisation des » commandes pear. Les informations dans le manuel PEAR pour la commande pear sont également applicables à la commande pecl.
Pour être utilisée, une extension partagée doit être compilée, installée et chargée. Les méthodes décrites ci-dessous vous fournissent diverses instructions sur la façon de compiler et d'installer des extensions mais ne les chargent pas automatiquement. Les extensions peuvent être chargées en ajoutant une directive d'extension au fichier php.ini ou à l'aide de la fonction dl().
Lorsque vous compilez des modules PHP, il est important d'avoir les outils dans leurs versions appropriées, tels que autoconf, automake, libtool, etc. Voyez les » Instructions pour le Git anonyme, afin de connaître les utilitaires nécessaires, et leurs versions.
Il existe plusieurs méthodes pour télécharger des extensions PECL :
La commande pecl install extname télécharge le code des extensions automatiquement, ce qui évite de réaliser un téléchargement particulier.
Sur Windows, vous avez deux moyens de charger une extension PHP : soit vous la compilez dans PHP, soit vous chargez une DLL. Charger une extension précompilée est la méthode la plus pratique et la plus recommandée.
Pour charger une extension, vous devez disposer de son fichier ".dll" sur votre système. Toutes les extensions sont automatiquement et périodiquement compilées par le groupe PHP (voyez la section de téléchargements).
Pour compiler une extension dans PHP, reportez-vous à la documentation sur la compilation des sources.
Pour compiler une extension autonome, (c'est-à-dire un fichier DLL), reportez-vous documentation sur la compilation des sources. Si le fichier DLL est absent de votre distribution PHP et de PECL, il vous faudra la compiler avant de pouvoir l'utiliser.
Les extensions PHP sont généralement appelées "php_*.dll" (où les astérisques représentent le nom de l'extension) et elles sont rangées dans le dossier "PHP\ext" ("PHP\extensions" en PHP 4).
PHP est livré avec les extensions qui sont les plus utiles à la majorité des utilisateurs. Elles sont appelées des extensions coeur, ou "core".
Cependant, si vous avez besoin de fonctionnalités qui ne sont pas fournies par une extension coeur, vous pourriez quand même les trouver dans PECL. Le PHP Extension Community Library (PECL, aussi dit Bibliothèque d'Extensions Communautaires de PHP) est un dépôt de code pour les extensions PHP, qui fournit un annuaire de toutes les extensions connues, et un service d'hébergement pour télécharger et développer ces extensions.
Si vous avez développé une extension pour votre propre usage, vous pourriez avoir envie de l'héberger sur PECL, pour que tous ceux qui ont eu le même problème que vous, puissent avoir accès à la même solution. Cela vous donne de bonnes chances d'avoir des retours de la communauté, et, peut-être, des remerciements, des rapports de bugs, et même des correctifs. Avant que vous n'envoyiez votre extension sur les serveurs PECL, il est recommandé de lire http://pecl.php.net/package-new.php.
Souvent, vous trouverez plusieurs versions de chaque DLL :
Il est recommandé de choisir les extensions pour qu'elles soient adaptées à la machine serveur sur laquelle vous utilisez PHP. Le script suivant va vous afficher toutes vos configurations PHP :
Exemple #1 Appel de la fonction phpinfo()
<?php
phpinfo();
?>
Ou bien, en ligne de commande :
drive:\\path\to\php\executable\php.exe -i
Le moyen le plus courant pour charger une extension PHP est de l'inclure dans votre fichier de configuration php.ini. Notez que de nombreuses extensions sont déjà présentes dans le fichier php.ini et que vous avez simplement à supprimer le point-virgule pour les activer.
;extension=php_extname.dll
extension=php_extname.dll
Cependant, certains serveurs Web sont déroutants, car ils n'utilisent pas le fichier php.ini rangé avec votre exécutable PHP. Pour en savoir plus sur votre véritable php.ini, recherchez son dossier dans le fichier phpinfo():
Configuration File (php.ini) Path C:\WINDOWS
Loaded Configuration File C:\Program Files\PHP\5.2\php.ini
Après activation d'une extension, sauvegardez le fichier php.ini, et relancez le serveur Web, puis vérifiez à nouveau le fichier phpinfo(). La nouvelle extension devrait y avoir sa section.
Si l'extension n'apparaît pas dans le fichier phpinfo(), vous devriez jeter un oeil dans les logs pour savoir d'où vient le problème.
Si vous utilisez PHP en ligne de commande (CLI), l'erreur de chargement de l'extension devrait être lisible directement sur l'écran.
Si vous utilisez PHP sur un serveur Web, la position et le format des logs varient grandement d'un serveur à l'autre. Lisez la documentation de votre serveur Web pour savoir où ils sont : PHP ne peut pas vous aider pour cela.
Les problèmes les plus courants sont la localisation du fichier DLL, la valeur de la directive "extension_dir" dans le php.ini et les incohérences de compilations.
Si le problème est une incohérence de compilation, vous avez probablement téléchargé une mauvaise DLL. Essayez d'en charger une nouvelle, avec les bonnes configurations pour votre serveur. phpinfo() vous sera alors très utile.
PECL facilite la création d'extension PHP partagées. En utilisant la » commande pecl, faites ceci :
Ceci va télécharger le fichier source de l'extension extname, le compiler et installer le fichier extname.so dans votre dossier extension_dir. extname.so doit ensuite être chargé via php.ini.
Par défaut, la commande pecl n'installera pas les paquets marqués comme étant alpha ou beta. Si aucun paquet stable est disponible, vous devrez installer un paquet beta en utilisant la commande suivante :
Vous pouvez également installer une version spécifique en utilisant la commande :
Note:
Après avoir activée cette extension dans le php.ini, relancez le serveur Web afin de la prendre en compte.
Parfois, l'utilisation de l'installeur pecl n'est pas une bonne option. Ceci parce que vous être derrière un pare-feu ou parce que l'extension que vous voulez installer n'est pas disponible en tant que paquet PECL comme une extension uniquement disponible via SVN. Si vous devez compiler une telle extension, vous pouvez utiliser l'utilitaire de compilation afin d'exécuter la compilation manuellement.
La commande phpize est utilisée pour préparer l'environnement de compilation pour une extension PHP. Dans l'exemple suivant, les sources de l'extension sont dans un dossier appelé extname :
$ cd extname $ phpize $ ./configure $ make # make install
Une installation réussie aura créé un fichier extname.so et l'aura placé dans le dossier des extensions de PHP. Vous devez ajouter la ligne extension=extname.so dans votre php.ini avant de pouvoir utiliser l'extension.
Si le système ne possède pas la commande phpize et que vous utilisez des paquets précompilés (comme des RPM), assurez-vous d'installer également la version de développement appropriée des paquets PHP car elle inclut également la commande phpize ainsi que les en-têtes appropriés pour construire PHP et ses extensions.
Exécutez la commande phpize --help pour afficher des informations d'utilisation supplémentaires.
php-config est un petit script shell pour obtenir des informations sur la configuration installée de PHP.
Lors de la compilation des extensions, si vous avez plusieurs versions PHP d'installées, vous devez spécifier l'installation pour laquelle vous souhaitez les compiler en utilisant l'option --with-php-config lors de la configuration, spécifiant ainsi le chemin vers le script php-config.
La liste des options de ligne de commande fournies par le script php-config peut être obtenue en exécutant le script php-config avec l'option -h :
Usage: /usr/local/bin/php-config [OPTION] Options: --prefix [...] --includes [...] --ldflags [...] --libs [...] --extension-dir [...] --include-dir [...] --php-binary [...] --php-sapis [...] --configure-options [...] --version [...] --vernum [...]
| Option | Description |
|---|---|
| --prefix | Préfixe du dossier où PHP est installé, i.e. /usr/local |
| --includes | Liste des options -I avec tous les fichiers inclus |
| --ldflags | Drapeaux LD qui ont été compilés avec PHP |
| --libs | Bibliothèques additionnelles qui ont été compilées avec PHP |
| --extension-dir | Dossiers où les extensions sont recherchées par défaut |
| --include-dir | Préfixe du dossier où les en-têtes de fichiers sont installés par défaut |
| --php-binary | Chemin complet vers le CLI PHP ou le binaire CGI |
| --php-sapis | Affiche tous les modules SAPI disponibles |
| --configure-options | Options de configuration pour recréer la configuration de l'installation courante de PHP |
| --version | Version de PHP |
| --vernum | Version de PHP sous la forme d'un entier |
Il peut arriver que vous ayez à compiler votre extension PECL statiquement dans votre binaire PHP. Pour ce faire, vous devez placer les sources de l'extension dans le dossier php-src/ext/ et exécuter à nouveau le script de configuration de PHP.
$ cd /your/phpsrcdir/ext $ pecl download extname $ gzip -d < extname.tgz | tar -xvf - $ mv extname-x.x.x extname $ rm package.xml
Cela générera le dossier suivant :
À partir de la, forcez PHP à reconstruire le script de configuration, puis, suivez le processus classique de compilation de PHP :
Note: Pour exécuter le script 'buildconf', vous devez posséder autoconf 2.13 et automake 1.4+ (les versions plus récentes de autoconf peuvent fonctionner, mais ne sont pas supportées).
L'utilisation de --enable-extname ou --with-extname dépend de l'extension. Généralement, une extension qui ne dépend pas d'une bibliothèque externe utilise --enable. Pour être certain, utilisez la commande suivante après avoir utilisé buildconf :
Certains problèmes sont récurrents : les plus communs sont listés dans la FAQ PHP, disponible dans ce manuel.
Si vous êtes complètement bloqué, quelqu'un sur la liste de diffusion PHP pourra probablement vous aider. Essayez de consulter les archives, au cas où quelqu'un aurait déjà rencontré votre problème. Les archives sont toujours accessibles à : » http://www.php.net/support.php. Pour souscrire à la liste de diffusion, envoyez un mail vide à » php-install-subscribe@lists.php.net. L'adresse de la liste de diffusion est » php-install@lists.php.net.
Si vous voulez obtenir de l'aide sur la liste de diffusion PHP, essayez d'être concis et clair, et pensez à donner tous les détails sur votre environnement (OS, version de PHP, serveur Web, CGI ou module, safe mode, etc.), et n'hésitez pas à envoyer suffisamment de code pour que nous puissions reproduire et tester l'erreur.
Si vous pensez avoir trouvé un bogue dans PHP, n'oubliez pas de le signaler. L'équipe de développement PHP ne le connaît peut être pas et, si vous ne le signalez pas, vos chances de voir le bogue corrigé sont nulles. Vous pouvez rapporter des bogues grâce au système de suivi, accessible à » http://bugs.php.net/. S'il vous plait, n'envoyez pas de rapports de bogue sur les listes de diffusion ou par courier personnel. Le système de suivi est de plus prévu pour permettre la proposition de nouvelles fonctionnalités.
Lisez le guide » Comment rapporter un bogue (Les bogues : ce qu'il faut faire, et ce qu'il ne faut pas faire) avant d'envoyer n'importe quel rapport !
Le fichier de configuration (php.ini) est lu par PHP au démarrage. Si vous avez compilé PHP en module, le fichier n'est lu qu'une seule fois, au lancement du serveur web. Pour les versions CGI et CLI le fichier est lu à chaque invocation.
Le php.ini est cherché dans ces endroits (et dans cet ordre) :
Si le fichier php-SAPI.ini existe (où SAPI utilise SAPI, donc le nom du fichier est e.g. php-cli.ini ou php-apache.ini), il sera utilisé à la place du php.ini. Le nom SAPI peut être déterminé en utilisant la fonction php_sapi_name().
Note:
Le serveur web Apache change ce dossier en dossier root au démarrage, ce qui fait que PHP essaye de lire php.ini depuis le système de fichiers racine s'il existe.
Note:
Les variables d'environnement peuvent être utilisées dans le php.ini.
Les directives php.ini sont directement documentées, par extensions, sur les pages respectives du manuel de ces extensions. La liste des directives internes est disponible en annexe. Il est probable que toutes les directives PHP ne sont pas documentées dans le manuel. Pour une liste complète des directives disponibles dans votre version de PHP, merci de lire les commentaires de votre propre fichier php.ini. Vous pouvez également trouver la » dernière version du php.ini sur Git.
Exemple #1 Extrait du php.ini
; tout texte sur une ligne, situé après un point-virgule ";" est ignoré [php] ; les marqueurs de section (texte entre crochets) sont aussi ignorés ; Les valeurs booléennes peuvent être spécifiées comme ceci : ; true, on, yes ; ou false, off, no, none register_globals = off track_errors = yes ; vous pouvez placer les chaînes de caractères entre guillemets include_path = ".:/usr/local/lib/php" ; Les antislash sont traités comme n'importe quel caractère include_path = ".;c:\php\lib"
Depuis PHP 5.1.0, il est possible de se référer à des variables .ini depuis des fichiers .ini. Par exemple : open_basedir = ${open_basedir} ":/new/dir".
Depuis PHP 5.3.0, PHP inclut le support des fichiers INI au style .htaccess sur une base par dossier. Ces fichiers sont analysés uniquement par le SAPI CGI/FastCGI. Cette fonctionnalité rend obsolète l'extension PECL htscanner. Si vous utilisez Apache, l'utilisation des fichiers .htaccess produit le même effet.
En plus du fichier php.ini principal, PHP analyse les fichiers INI contenus dans chaque dossier, en commençant par le dossier depuis lequel le fichier PHP courant est appelé, et parcourt les dossiers jusqu'au dossier racine courant (tel que défini par la variable $_SERVER['DOCUMENT_ROOT']). Dans le cas où le fichier PHP est hors de la racine web, seul son dossier est scanné.
Seules les configurations INI avec les modes PHP_INI_PERDIR
et PHP_INI_USER seront reconnues dans les fichiers INI
.user.ini-style.
Deux nouvelles directives INI, user_ini.filename et user_ini.cache_ttl contrôlent l'utilisation des fichiers INI définis par l'utilisateur.
user_ini.filename définit le nom du fichier cherché par PHP dans chaque dossier ; si cette directive est définie à une chaîne vide, PHP n'analysera rien du tout. Par défaut, vaut .user.ini.
user_ini.cache_ttl contrôle la durée entre 2 re-lectures des fichiers INI définis par l'utilisateur. Par défaut, vaut 300 secondes (5 minutes).
Ces modes déterminent quand et où une directive PHP peut ou ne peut pas être modifiée, et chaque directive du manuel est dirigée par un de ces modes. Par exemple, certaines directives peuvent être modifiées dans un script PHP avec la fonction ini_set(), alors que d'autres ont besoin d'être modifiées dans les fichiers php.ini ou httpd.conf.
Par exemple, la directive output_buffering a le mode PHP_INI_PERDIR alors elle ne peut pas être modifiée avec la fonction ini_set(). D'un autre coté, la directive display_errors a le mode PHP_INI_ALL, et peut être modifiée n'importe où, y compris avec la fonction ini_set().
| Mode | Signification |
|---|---|
| PHP_INI_USER | La directive peut être modifiée dans un script utilisateur, avec la fonction ini_set(), ou via la base de registre Windows. Depuis PHP 5.3, l'entrée peut être définie dans .user.ini. |
| PHP_INI_PERDIR | La directive peut être modifiée dans les fichiers php.ini, .htaccess httpd.conf ou .user.ini (depuis PHP 5.3). |
| PHP_INI_SYSTEM | La directive peut être modifiée dans les fichiers php.ini ou httpd.conf |
| PHP_INI_ALL | La directive peut être modifiée n'importe où |
Lorsque vous utilisez le module Apache, vous pouvez aussi changer les paramètres de configuration en utilisant les directives dans les fichiers de configuration d'Apache (httpd.conf) et dans les fichiers .htaccess. Vous aurez besoin des privilèges "AllowOverride Options" ou "AllowOverride All".
Il y a de nombreuses directives
Apache qui vous permettent de modifier la configuration de PHP
à partir des fichiers de configuration Apache. Pour une liste des
directives qui sont PHP_INI_ALL,
PHP_INI_PERDIR ou PHP_INI_SYSTEM
reportez-vous à l'annexe Liste des directives
du php.ini.
php_value
nom
valeur
Modifie la valeur de la directive spécifiée.
Cette instruction n'est utilisable qu'avec les directives PHP de type
PHP_INI_ALL et PHP_INI_PERDIR.
Pour annuler une valeur qui aurait été modifiée au préalable,
utilisez la valeur none.
Note: N'utilisez pas
php_valuepour configurer des valeurs booléennes.php_flag(voir plus bas) doit être utilisée.
php_flag
nom
on|off
Cette instruction est utilisée pour activer ou
désactiver une option.
Cette instruction n'est utilisable qu'avec les directives
PHP de type PHP_INI_ALL et
PHP_INI_PERDIR.
php_admin_value
nom
valeur
Cette instruction affecte une valeur à la variable spécifiée.
Cette instruction NE peut PAS être utilisée dans un fichier
.htaccess. Toute directive de PHP configurée avec le type
php_admin_value ne peut pas être
modifiée en utilisant le fichier .htaccess ou la fonction ini_set().
Pour annuler une valeur qui aurait été modifiée au préalable, utilisez la
valeur none.
php_admin_flag
name
on|off
Cette directive est utilisée pour activer ou désactiver une option.
Cette instruction NE peut PAS être utilisée dans un fichier
.htaccess. Toute directive de PHP configurée avec le type
php_admin_flag ne peut pas être
modifiée en utilisant le fichier .htaccess ou par la fonction ini_set().
Exemple #1 Exemple de configuration Apache
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag engine on </IfModule>
Les constantes PHP n'existent pas en dehors de PHP. Par
exemple, dans le fichier httpd.conf,
vous ne pouvez pas utiliser des constantes PHP telles que
E_ALL ou E_NOTICE pour spécifier
le niveau de rapport d'erreur,
car ces constantes n'ont pas de signification pour Apache,
et seront remplacées par 0.
Utilisez les valeurs numériques à la place.
Les constantes peuvent être utilisées dans le php.ini
Lorsque vous utilisez PHP sur Windows, la configuration peut
être modifiée dossier par dossier en utilisant la base de registres
de Windows. Les valeurs de configuration sont stockées
avec la clé de registre
HKLM\SOFTWARE\PHP\Per Directory Values,
dans les sous-clés correspondantes aux noms de dossier. Par exemple,
la valeur d'une option dans le dossier c:\inetpub\wwwroot
sera stockée dans la clé
HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot.
La valeur de cette option sera utilisée pour tous les
scripts qui fonctionnent dans ce dossier ou ses sous-dossiers.
Les valeurs sous la clé doivent avoir le nom d'une
direction de configuration PHP,
et la valeur correspondante. Les constantes PHP ne sont
pas utilisables : il faut mettre la valeur entière.
Cependant, seules les valeurs des configurations dans
PHP_INI_USER peuvent être fixées de cette manière,
celles dans PHP_INI_PERDIR ne peuvent l'être.
Suivant la façon dont vous exécutez PHP, vous pouvez changer certaines valeurs durant l'exécution de vos scripts en utilisant ini_set(). Voir la documentation de la fonction ini_set() pour plus d'informations.
Si vous êtes intéressé par une liste complète des options configurées sur votre système avec leurs valeurs courantes, vous pouvez exécuter la fonction phpinfo() et consulter la page résultante. Vous pouvez aussi accéder individuellement aux directives de configuration pendant l'exécution de vos scripts en utilisant soit la fonction ini_get(), soit la fonction get_cfg_var().
Tout ce qui se trouve en dehors d'une paire de balises ouvrantes/fermantes est ignoré par l'analyseur PHP, ce qui permet d'avoir des fichiers PHP mixant les contenus. Ceci permet à PHP d'être contenu dans des documents HTML, pour créer par exemple des templates.
<p>Ceci sera ignoré par PHP et affiché au navigateur.</p>
<?php echo 'Alors que ceci sera analysé par PHP.'; ?>
<p>Ceci sera aussi ignoré par PHP et affiché au navigateur.</p>
Utilisation de structures avec des conditions
Exemple #1 Echappement avancé en utilisant des conditions
<?php if ($expression == true): ?>
Ceci sera affiché si l'expression est vrai.
<?php else: ?>
Sinon, ceci sera affiché.
<?php endif; ?>
Pour afficher de gros blocs de texte, il est plus efficace de sortir du mode d'analyse de PHP plutôt que d'envoyer le texte via la fonction echo ou print.
Il y a quatre paires différentes de balises ouvrantes / fermantes qui peuvent être utilisées dans PHP. Deux de ces balises, <?php ?> et <script language="php"> </script>, sont toujours disponibles. Les deux autres sont les balises courtes et les balises du style ASP, et peuvent être activées ou désactivées depuis le fichier de configuration php.ini. Cependant, malgré le fait que des personnes trouvent les balises courtes et les balises du style ASP pratiques, elles sont moins portables et donc, généralement, non recommandées.
Note:
Notez également que si vous intégrez PHP dans des documents XML ou XHTML, vous devez utiliser les balises <?php ?> pour rester conforme aux standards.
Exemple #2 Balises d'ouvertures et de fermetures PHP
1. <?php echo 'Si vous voulez réaliser des documents XHTML ou XML, faites comme ceci'; ?>
2. <script language="php">
echo 'quelques éditeurs (comme FrontPage)
n\'aiment pas ce genre d\'instructions';
</script>
3. <? echo 'ceci est le plus simple, une instruction SGML'; ?>
<?= expression ?> Ceci est la version courte pour "<? echo expression ?>"
4. <% echo 'Vous pouvez optionnellement utiliser les balises ASP-style'; %>
<%= $variable; # Ceci est la version courte pour "<% echo . . ." %>
Bien que les balises vues dans les exemples un et deux sont toutes les deux disponibles, l'exemple un est le plus communément utilisé et le plus recommandé des deux.
Les balises courtes (troisième exemple) ne sont disponibles que s'elles ont été activées via la directive short_open_tag du fichier de configuration php.ini, ou si PHP a été configuré avec l'option --enable-short-tags .
Les balises du style ASP (quatrième exemple) sont uniquement disponibles lorsqu'elles sont activées via la directive asp_tags du fichier de configuration php.ini.
Note:
L'utilisation des balises courtes doit être bannie lors de développements d'applications ou de bibliothèques qui sont destinées à être redistribuées, ou déployées sur des serveurs qui ne sont pas sous votre contrôle, car les balises courtes peuvent ne pas être supportées sur le serveur cible. Pour réaliser du code portable, qui peut être redistribué, n'utilisez jamais les balises courtes.
Note:
En PHP 5.2 et antérieures, l'analyseur n'autorisait pas un tag ouvrant <?php comme seul élément d'une page. Ceci est permis à compter de la version 5.3 de PHP lorsqu'il y a un ou plusieurs espaces après la balise ouvrante.
Note:
Depuis PHP 5.4, le tag echo court <?= est toujours reconnu et valide, suivant la configuration de l'option short_open_tag.
Comme en C ou en Perl, PHP requiert que les instructions soient terminées par un point-virgule à la fin de chaque instruction. La balise fermante d'un bloc de code PHP implique automatiquement un point-virgule ; vous n'avez donc pas besoin d'utiliser un point-virgule pour terminer la dernière ligne d'un bloc PHP. La balise fermante d'un bloc inclura immédiatement un caractère de nouvelle ligne si un est présent.
Exemple #1 Séparation des instructions
<?php
echo 'Ceci est un test';
?>
<?php echo 'Ceci est un test' ?>
<?php echo 'Oubli de la balise fermante';
Note:
La balise fermante d'un bloc PHP à la fin d'un fichier est optionnelle, et parfois, il est utile de l'omettre lors de l'utilisation de la fonction include ou de la fonction require, car les espaces non désirés n'apparaîtront pas à la fin des fichiers, et ainsi, vous pourrez toujours ajouter des en-têtes à la réponse plus tard. C'est utile également si vous voulez utiliser l'affichage du buffer et que vous ne voulez pas voir d'espaces blancs ajoutés à la fin des parties générées par les fichiers inclus.
PHP supporte les commentaires de type C, C++ et Shell Unix (aussi appelé style Perl). Par exemple :
Exemple #1 Exemple de commentaire
<?php
echo 'Ceci est un test'; // Ceci est un commentaire sur une seule ligne, style c++
/* Ceci est un commentaire sur
plusieurs lignes */
echo 'Ceci est un autre test';
echo 'Et un test final'; # Ceci est un commentaire style shell sur une seule ligne
?>
Les commentaires sur une seule ligne ne commentent que jusqu'à la fin de la ligne du bloc PHP courant. Ceci signifie que le code HTML après // ... ?> ou après # ... ?> SERA affiché : ?> terminera le mode PHP et retournera en mode HTML, et // ou # n'influencera pas cela. Si la directive de configuration asp_tags est activée, ce comportement sera identique avec // %> et # %>. Cependant, la balise </script> ne terminera pas le mode PHP dans un commentaire d'une seule ligne.
Exemple #2 Les commentaires vont jusqu'à la fin de la ligne
<h1>Ceci est un exemple <?php # echo 'simple';?></h1>
<p>La ligne ci-dessus affichera 'Ceci est un exemple'.</p>
Les commentaires style 'C' commentent jusqu'à ce que le premier */ soit rencontré. Vous devriez faire attention aux commentaires style 'C' nichés dans de gros blocs lorsque vous les commentez.
Exemple #3 Les commentaires de type C
<?php
/*
echo 'Ceci est un test'; /* Ce commentaire posera un problème */
*/
?>
PHP supporte 9 types basiques.
4 types scalaires :
2 types composés :
Et finalement, 2 types spéciaux :
Ce manuel introduit également quelques pseudo-types pour des raisons de lisibilité :
Et la pseudo-variable $....
Ce manuel peut toutefois contenir des références au type "double". Considérez ce type comme étant un type "float". Les deux noms n'existent que pour des raisons historiques.
Le type d'une variable n'est pas toujours défini par le programmeur ; il peut être défini par PHP au moment de l'exécution, suivant le contexte dans lequel la variable est utilisée.
Note: Pour vérifier le type et la valeur d'une expression, utilisez la fonction var_dump().
Pour afficher une représentation humainement lisible d'un type aux fins de déboguage, utilisez la fonction gettype(). Pour vérifier un certain type, n'utilisez pas la fonction gettype(), mais plutôt les fonctions is_type. Voici quelques exemples :
<?php
$a_bool = TRUE; // un booléen
$a_str = "foo"; // une chaîne de caractères
$a_str2 = 'foo'; // une chaîne de caractères
$an_int = 12; // un entier
echo gettype($a_bool); // affiche : boolean
echo gettype($a_str); // affiche : string
// Si c'est un entier, incrément de 4
if (is_int($an_int)) {
$an_int += 4;
}
// Si $a_bool est une chaîne de caractères, on l'affiche
if (is_string($a_bool)) {
echo "String: $a_bool";
}
?>
Pour forcer la conversion d'une variable en un certain type, vous pouvez transtyper (cast) la variable ou utiliser la fonction settype().
Notez qu'une variable peut être évaluée avec différentes valeurs dans certaines situations, suivant son type à un moment donné. Pour plus d'informations, lisez la section sur le transtypage. La table de comparaison des types peut également être très utile, montrant différents exemples.
C'est le type le plus simple. Un booléen représente une valeur de vérité.
Il peut valoir TRUE ou FALSE.
Pour spécifier un booléen littéral, utilisez le mot-clé TRUE ou
FALSE. Les deux sont insensibles à la casse.
<?php
$foo = True; // assigne la valeur TRUE à $foo
?>
Typiquement, le résultat d'un opérateur qui retourne un booléen, passé ensuite à une structure de contrôle.
<?php
// == est un opérateur qui teste
// l'égalité et retourne un booléen
if ($action == "show_version") {
echo "La version est 1.23";
}
// ceci n'est pas nécessaire...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...à la place, vous pouvez utiliser, avec la même signification :
if ($show_separators) {
echo "<hr>\n";
}
?>
Pour convertir explicitement une valeur en booléen, utilisez (bool) ou (boolean). Cependant, dans la plupart des cas, le transtypage n'est pas nécessaire, sachant qu'une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle demandent un argument de type booléen.
Voir aussi le transtypage.
Lors d'une conversion en booléen, les valeurs suivantes sont
considérées comme FALSE :
FALSE, lui-même
Toutes les autres valeurs sont considérées comme TRUE (y compris toutes les
ressources).
-1 est considéré comme TRUE, comme tous les nombres
différents de zéro (négatifs ou positifs) !
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
Un entier est un nombre appartenant à la classe ℤ = {..., -2, -1, 0, 1, 2, ...}.
Voir aussi :
Les entiers peuvent être spécifiés en notation décimale (base 10), hexadécimale (base 16), octale (base 8), ou binaire (base 2) optionnellement précédée d'un signe (- ou +).
Les entiers littéraux binaires sont disponibles depuis PHP 5.4.0.
Pour utiliser la notation octale, précédez le nombre d'un 0 (zéro). Pour utiliser la notation hexadécimale, précédez le nombre d'un 0x. Pour utiliser la notation binaire, précédez le nombre d'un 0b.
Exemple #1 Les entiers littéraux
<?php
$a = 1234; // un nombre décimal
$a = -123; // un nombre négatif
$a = 0123; // un nombre octal (équivalent à 83 décimales)
$a = 0x1A; // un nombre héxadecimal (équivalent à 26 décimales)
?>
Formellement, la structure d'un entier littéral est :
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
La taille d'un entier est dépendant de la plate-forme, cependant,
une valeur maximale d'environ 2 milliards est habituelle (cela correspond
à 32 bits signés). Les plateformes 64-bit ont habituellement une valeur
maximale d'environ 9E18. PHP ne supporte pas les entiers non-signés. La taille
d'un entier peut être déterminée en utilisant la constante
PHP_INT_SIZE, et la valeur maximale, en utilisant
la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.
Si un nombre invalide est fourni dans un entier octal (i.e. 8 ou 9), le reste du nombre est ignoré.
Exemple #2 Bizarrerie avec les valeurs octales
<?php
var_dump(01090); // 010 octal = 8 décimales
?>
Si PHP rencontre un nombre supérieur au maximal d'un entier, il sera interprété comme un nombre décimal. De la même façon, une opération qui résulte en un nombre supérieur au nombre maximal d'un entier, retournera un nombre décimal.
Exemple #3 Dépassement d'entier sur un système 32-bit
<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
?>
Exemple #4 Dépassement d'entier sur un système 64-bit
<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
?>
Il n'y a pas d'opérateur de division entière en PHP. 1/2 contient en fait, float(0.5). La valeur peut être convertie en un entier en l'arrondissant, en utilisant la fonction round().
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Pour convertir explicitement une valeur en un entier, utilisez soit le mot-clé (int), soit (integer). Cependant, dans la plupart des cas, ce mot-clé n'est pas nécessaire vu qu'une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle demande un entier en guise d'argument. Une valeur peut également être convertie en un entier en utilisant la fonction intval().
Voir aussi : le transtypage.
FALSE correspond à 0 (zéro), et TRUE correspond à
1 (un).
Lorsque l'on convertit un nombre décimal en un entier, le nombre sera arrondi vers zéro.
Si le nombre à virgule flottante est au delà des limites des entiers (habituellement, +/- 2.15e+9 = 2^31 sur les plate-formes 32-bit et +/- 9.22e+18 = 2^63 sur les plate-formes 64-bit), le résultat sera indéfini, sachant que le nombre à virgule flottante n'a pas une précision suffisante pour donner un résultat entier exact. Aucune alerte n'est émise lorsque ce comportement survient !
Ne convertissez jamais une fraction inconnue en un entier, ceci peut engendrer un résultat inattendu.
<?php
echo (int) ( (0.1+0.7) * 10 ); // Affiche 7 !
?>
Voir aussi la section sur les alertes concernant la précision des nombres à virgule flottante.
Voir la section sur la conversion des chaînes en nombres
Le comportement de la conversion en un entier est indéfini depuis les autres types. Ne rapporter aucun comportement observé, sachant qu'ils peuvent changer sans avertissement.
Les nombres décimaux, (aussi connus comme nombres à virgule flottante, "floats", "doubles", ou "real numbers") peuvent être spécifiés en utilisant les syntaxes suivantes :
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Formellement :
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
La taille d'un nombre décimal est dépendant de la plate-forme, cependant, un nombre maximal de ~1.8e308 avec une précision sur 14 chiffres est une valeur commune (format 64 bits IEEE).
Les nombres décimaux ont une précision limitée. Même s'ils dépendent du système, PHP utilise le format de précision des décimaux IEEE 754, qui donnera une erreur maximale relative de l'ordre de 1.11e-16 (dûe aux arrondis). Les opérations arithmétiques non-élémentaires peuvent donner des erreurs plus importantes et bien sûr les erreurs doivent être prises en compte lorsque plusieurs opérations sont liées.
Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule flottante en base 10, comme 0.1 ou 0.7, n'ont pas de représentation exacte comme nombres à virgule flottante en base 2, utilisée en interne, et ce quelle que soit la taille de la mantisse. De ce fait, ils ne peuvent être convertis sans une petite perte de précision. Ceci peut mener à des résultats confus: par exemple, floor((0.1+0.7)*10) retournera normalement 7 au lieu de 8 attendu, car la représentation interne sera quelque chose comme 7.9999999999999991118....
Ainsi, ne faites jamais confiance aux derniers chiffres d'un nombre décimal, mais aussi, ne comparez pas l'égalité de 2 nombres décimaux directement. Si vous avez besoin d'une haute précision, les fonctions mathématiques de précision et les fonctions gmp sont disponibles.
Pour une explication "simple", reportez-vous au » guide relatif aux nombres à virgule flottante.
Pour plus d'informations sur la conversion de chaînes en nombres décimaux, voir la section sur la conversion de chaînes en nombres décimaux. Pour les valeurs d'autres types, la conversion est effectuée en convertissant tout d'abord la valeur en un entier, puis, en nombre décimal. Voir la section sur la conversion en entier pour plus d'informations. Une notice est émise si un objet est converti en nombre décimal.
Comme dit dans la note ci-dessus, le test d'égalité des valeurs de nombres décimaux est problématique, en raison de la façon dont ils sont représentés en interne. Cependant, il existe des façons de réaliser cette comparaison.
Pour tester l'égalité de valeurs de nombres décimaux, une borne supérieure de l'erreur relative à l'arrondi est utilisée. Cette valeur est connue comme étant l'epsilon de la machine, ou le unit roundoff, et est la différence la plus petite acceptable dans les calculs.
$a et $b sont égaux sur 5 nombres après la virgule.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
Quelques opérations numériques peuvent donner comme résultat une valeur
représentée par la constante NAN. Ce résultat représente
une valeur indéfinie ou non représentable lors de calculs avec des nombres
à virgule flottante. Toute comparaison, même stricte de cette valeur avec
une autre valeur, y compris cette constante elle-même, donnera une valeur
de FALSE.
En raison du fait que NAN représente tout nombre de valeur
différente, NAN ne doit pas être comparé à d'autres valeurs,
y compris cette constante elle-même, et à la place, elle doit être vérifiée
en utilisant la fonction is_nan().
Une chaîne de caractères est une série de caractères, où un caractère est la même chose qu'un octet. De ce fait, PHP ne supporte que les jeux de caractères comportant 256 caractères différents, et, donc, n'a pas de support natif pour l'Unicode. Reportez-vous aux détails sur le type chaîne de caractères pour plus d'informations.
Note: Une chaîne de caractères peut être d'une taille allant jusqu'à 2Go.
Une chaîne de caractères littérale peut être spécifiée de 4 façons différentes :
La façon la plus simple de spécifier une chaîne de caractères est de l'entourer de guillemets simples (le caractère ').
Pour spécifier un guillemet simple littéral, vous devrez l'échapper à l'aide d'un antislash (\). Pour spécifier un antislash littéral, doublez-le (\\). Notez que si vous tentez d'échapper n'importe quel autre caractère, l'antislash s'affichera, ce qui signifie que les autres séquences auquelles vous êtes éventuellement habitués (comme \r ou \n) s'afficheront telles quelles, sans avoir une quelconque signification particulière.
Note: Contrairement aux syntaxes avec double guillemets et heredoc, les variables et les séquences d'échappement pour les caractères spéciaux ne seront pas interprétées lorsqu'elles figurent dans une chaîne de caractères entourée de guillemets simples.
<?php
echo 'ceci est une chaîne simple';
echo 'Vous pouvez également ajouter des nouvelles lignes
dans vos chaînes
de cette façon';
// Affiche : Arnold a dit : "I'll be back"
echo 'Arnold a dit : "I\'ll be back"';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\\*.*?';
// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\*.*?';
// Affiche : Ceci n'affichera pas \n de nouvelle ligne
echo 'Ceci n\'affichera pas \n de nouvelle ligne';
// Affiche : Les variables ne seront pas $traitees $ici
echo 'Les variables ne seront pas $traitees $ici';
?>
Si la chaîne de caractères est entourée de guillemets doubles ("), PHP interprétera plus de séquences d'échappement comme des caractères spéciaux :
| Séquence | Signification |
|---|---|
| \n | Fin de ligne (LF ou 0x0A (10) en ASCII) |
| \r | Retour à la ligne (CR ou 0x0D (13) en ASCII) |
| \t | Tabulation horizontale (HT or 0x09 (9) en ASCII) |
| \v | Tabulation verticale (VT ou 0x0B (11) en ASCII) (depuis PHP 5.2.5) |
| \e | échappement (ESC or 0x1B (27) en ASCII) (depuis PHP 5.4.0) |
| \f | Saut de page (FF ou 0x0C (12) en ASCII) (depuis PHP 5.2.5) |
| \\ | Antislash |
| \$ | Signe dollar |
| \" | Guillemet double |
| \[0-7]{1,3} | La séquence de caractères correspondant à cette expression rationnelle est un caractère, en notation octale |
| \x[0-9A-Fa-f]{1,2} | La séquence de caractères correspondant à cette expression rationnelle est un caractère, en notation hexadécimale |
De la même façon que pour les chaînes entourées de guillemets simples, l'échappement de tout autre caractère affichera l'antislash. Avant PHP 5.1.1, l'antislash de \{$var} n'était pas affiché.
La fonctionnalité la plus intéressante des chaînes entourées de guillemets doubles est que les noms de variables seront interprétés. Voir la documentation sur l'analyse des chaînes de caractères pour plus de détails.
Une 3ème façon de délimiter une chaîne de caractères est la syntaxe Heredoc : <<<. Après cet opérateur, un identifiant est fourni, suivi d'une nouvelle ligne. La chaîne en elle-même vient ensuite, suivie du même identifiant pour fermer la notation.
L'identifiant de fin doit commencer à la première colonne de la ligne. De plus, l'identifiant doit suivre les mêmes règles que n'importe quel autre libellé PHP : il ne doit contenir que des caractères alphanumériques et des soulignés, et doit commencer par un caractère non numérique ou un souligné ("underscore").
Il est très important de noter que la ligne contenant l'identifiant de fin ne doit contenir aucun autre caractère, mis à part, éventuellement, un point-virgule (;). Cela signifie en particulier que l'identifiant ne doit pas être indenté, et qu'il ne doit y avoir aucun espace ou tabulation avant ou après le point-virgule. Il est également important de garder à l'esprit que le premier caractère avant l'identifiant de fermeture doit être une nouvelle ligne telle que définie par le système d'exploitation ; sur les systèmes Unix, incluant Mac OSX, il s'agit du caractère \n. Le délimiteur de fermeture (pouvant être suivi d'un point-virgule) doit aussi être suivi d'une nouvelle ligne.
Si cette règle n'est pas respectée et que l'identifiant de fermeture n'est pas "propre", il ne sera pas considéré comme identifiant de fermeture, et PHP continuera à en chercher un. Si un identifiant de fermeture "propre" n'est pas trouvé avant la fin du fichier courant, une erreur d'analyse sera émise à la dernière ligne.
Heredoc ne peut être utilisé pour initialiser les proriétés d'une classe. Depuis PHP 5.3, cette limitation ne s'applique qu'aux Heredoc qui contiennent des variables.
Exemple #1 Exemple invalide
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredoc se comporte exactement comme une chaîne entourée de guillemets doubles, sans les guillemets doubles. Cela signifie que les guillemets dans une syntaxe Heredoc n'ont pas besoin d'être échappés, mais que les codes d'échappement listés plus haut peuvent toujours être utilisés. Les variables seront interprétées, mais les mêmes attentions doivent être prises lorsque vous utilisez des variables complexes dans une syntaxe Heredoc qu'avec les autres types de chaînes.
Exemple #2 Exemple de chaînes Heredoc
<?php
$str = <<<EOD
Exemple de chaîne
sur plusieurs lignes
en utilisant la syntaxe Heredoc.
EOD;
/* Exemple plus complexe, avec des variables. */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
Mon nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Et ceci devrait afficher un 'A' majuscule : \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mon nom est "MyName". J'affiche quelques Foo. Maintenant, j'affiche quelques Bar2. Et ceci devrait afficher un 'A' majuscule : A
Il est aussi possible d'utiliser la syntaxe Heredoc pour passer des données en paramètre à une fonction :
Exemple #3 Exemple d'utilisation de Heredoc pour passer des arguments
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
Depuis PHP 5.3.0, il est possible d'initialiser les variables statiques et les propriétés ou constantes de classes avec la syntaxe Heredoc :
Exemple #4 Utilisation de Heredoc pour initialiser des valeurs statiques
<?php
// Variables statiques
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Constantes et propriétés de classe
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
Depuis PHP 5.3.0, l'identifiant de début de syntaxe Heredoc peut éventuellement être écrit entre guillemets doubles :
Exemple #5 Utilisation des guillemets doubles avec Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
Nowdoc est aux chaînes entourées de guillemets simples ce qu'Heredoc est aux chaînes entourées de guillemets doubles. Un Nowdoc est spécifié de manière similaire à un Heredoc, mais aucune analyse n'est effectuée dans une construction Nowdoc. Cette syntaxe est idéale pour embarquer du code PHP ou d'autres larges blocs de texte, sans avoir besoin d'échapper quoi que ce soit. Elle partage quelques fonctionnalités avec la syntaxe SGML <![CDATA[ ]]>, en ce qu'elle déclare un bloc de texte qui ne doit pas être analysé.
Nowdoc est identifié avec la même séquence <<< utilisée par Heredoc, mais l'identifiant qui suit est entouré de guillemets simples, comme <<<'EOT'. Toutes les règles concernant les identifiants Heredoc s'appliquent également aux identifiants Nowdoc, et, tout particulièrement, celles concernant la forme de l'identifiant de fin.
Exemple #6 Exemples de chaînes Nowdoc
<?php
$str = <<<'EOD'
Exemple de chaîne
sur plusieurs lignes
en utilisant la syntaxe Nowdoc.
EOD;
/* Exemple complexe, avec des variables. */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A' : \x41
EOT;
?>
L'exemple ci-dessus va afficher :
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A' : \x41Note:
Contrairement à Heredoc, Nowdoc peut être utilisé dans n'importe quel contexte de données statiques. L'exemple typique est l'initialisation de proriétés ou de constantes de classe :
Exemple #7 Exemple avec des données statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note:
Le support de la syntaxe Nowdoc a été ajouté en PHP 5.3.0.
Lorsqu'une chaîne de caractères est spécifiée entre guillemets doubles ou en Heredoc, les variables qu'elle contient sont interprétées.
Il existe 2 types de syntaxes : une simple et une complexe. La syntaxe simple est la plus commune et la plus pratique. Elle fournit une façon d'embarquer une variable, une valeur de tableau, ou une propriété d'objet dans une chaîne avec un minimum d'effort.
La syntaxe complexe se reconnaît à l'utilisation d'accolades autour de l'expression.
Si un signe dollar ($) est rencontré, l'analyseur prendra autant de caractères que possible pour former un nom de variable valide. Vous pouvez entourer le nom de la variable avec des accolades, pour spécifier explicitement la fin de celui-ci.
<?php
$juice = "pomme";
echo "Il a bu du jus de $juice.".PHP_EOL;
// Invalide. "s" est un caractère valide dans un nom de variable, mais la variable est $juice.
echo "Il a bu du jus constitué de $juices.";
?>
L'exemple ci-dessus va afficher :
Il a bu du jus de pomme. Il a bu du jus constitué de .
De la même façon, un index d'un tableau ou une propriété d'un objet peut être analysé. Avec les indices de tableaux, le crochet fermant (]) marque la fin de l'index. Les mêmes règles sont appliquées aux propriétés d'objets que pour les simples variables.
Exemple #8 Exemple de la syntaxe simple
<?php
$juices = array("pomme", "poire", "koolaid1" => "raisin");
echo "Il a bu du jus de $juices[0].".PHP_EOL;
echo "Il a bu du jus de $juices[1].".PHP_EOL;
echo "Il a bu du jus à base de $juice[0]s.".PHP_EOL; // Ne fonctionne pas
echo "Il a bu du jus de $juices[koolaid1].".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john a bu du jus de $juices[0].".PHP_EOL;
echo "$people->john a dit bonjour à $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert a dit bonjour aux $people->smiths."; // Ne fonctionne pas
?>
L'exemple ci-dessus va afficher :
Il a bu du jus de pomme. Il a bu du jus de poire. Il a bu du jus à base de s. Il a bu du jus de raisin. John Smith a bu du jus de pomme. John Smith a dit bonjour à Jane Smith. John Smith's wife greeted Robert Paulsen. Robert Paulsen a dit bonjour aux .
Pour tout ce qui est plus complexe, vous devriez utiliser la syntaxe complexe.
Cette syntaxe est appelée complexe, non pas parce qu'elle est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.
Toute variable scalaire, tableau, ou attribut d'objet représentable en tant que chaîne de caractères peut être utilisé avec cette syntaxe. Écrivez simplement l'expression de la même façon qu'elle apparaitrait à l'extérieur de la chaîne et, ensuite, entourez-là des caractères { et }. Sachant que le caractère { ne peut pas être échappé, cette syntaxe ne sera reconnue que lorsque le caractère $ suit immédiatement le caractère {. Utilisez {\$ pour afficher littéralement {$. Voici quelques exemples pour éclaircir ceci :
<?php
// Montre toutes les erreurs
error_reporting(E_ALL);
$great = 'fantastic';
// Ne fonctionne pas, affiche : This is { fantastic}
echo "This is { $great}";
// Fonctionne, affiche : This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// Fonctionne
echo "This square is {$square->width}00 centimeters broad.";
// Fonctionne, les clés entourées de guillemets simples ne fonctionnent qu'avec la syntaxe à accolades
echo "This works: {$arr['key']}";
// Fonctionne
echo "This works: {$arr[4][3]}";
// Ceci est faux pour la même raison pour laquelle $foo[bar] est faux à l'extérieur d'une chaîne.
// En d'autres termes, ceci fonctionnera, mais uniquement parce que PHP cherchera d'abord
// une constante nommée foo ; une erreur de niveau E_NOTICE (constante indéfinie) sera émise.
echo "This is wrong: {$arr[foo][3]}";
// Fonctionne. Lors de l'utilisation de tableaux multidimensionnels, utilisez toujours
// les accolades autour du tableau lorsqu'il se trouve dans la chaîne
echo "This works: {$arr['foo'][3]}";
// Fonctionne.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): {${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
// Ne fonctionne pas, affiche : This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
Il est également possible d'accéder aux propriétés de classes en utilisant des variables contenues dans des chaînes, en utilisant cette syntaxe.
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->$baz[1]}\n";
?>
L'exemple ci-dessus va afficher :
I am bar. I am bar.
Note:
Les appels aux fonctions, méthodes, variables statiques de classes, ainsi qu'aux constantes de classes à l'intérieur de {$} fonctionnent depuis PHP 5. Cependant, la valeur accédée sera interprétée comme le nom d'une variable dans le contexte où la chaîne est définie. L'utilisation de simples accolades ({}) ne fonctionnera pas pour accéder à la valeur retournée par des fonctions, méthodes, ou les valeurs de constantes et de variables statiques de classes.
<?php
// Affichage de toutes les erreurs.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// Ceci fonctionne ; Affiche : I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// Ceci fonctionne également ; Affiche : I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
On peut accéder à, et modifier un, caractère d'une chaîne de caractères en spécifiant sa position (à partir de 0) en utilisant la même syntaxe que pour les tableaux, comme pour la variable $str[42]. Il convient dans ce cas de voir une chaîne de caractères comme un tableau. Les fonctions substr() et substr_replace() peuvent être utilisées lorsque vous voulez extraire ou remplacer plus d'un caractère.
Note: On peut également accéder à une chaîne en utilisant des accolades, comme ceci : $str{42}.
Écrire à une position hors de l'intervalle existant fait que
la chaîne est complétée par des espaces jusqu'à cette position.
Les positions sont toujours converties en valeur entière.
Les types de positions invalides produisent une alerte E_NOTICE.
Les positions négatives produisent une alerte E_NOTICE en écriture,
mais retournent une chaîne vide en lecture.
Seul le premier caractère d'une chaîne assignée est utilisé.
Assigner une chaîne vide assigne le caractère NULL.
En interne, les chaînes PHP sont des tableaux d'octets. Aussi, l'accès ou la modification d'une chaîne en utilisant les crochets d'un tableau n'est pas multi-octets, et ne doit être utilisé qu'avec les chaînes dont l'encodage est sur un seul octet, comme ISO-8859-1.
Exemple #9 Quelques exemples de chaînes
<?php
// Récupération du premier caractère d'une chaîne
$str = 'This is a test.';
$first = $str[0];
// Récupération du troisième caractère d'une chaîne
$third = $str[2];
// Récupération du dernier caractère d'une chaîne
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Modification du dernier caractère d'une chaîne
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
Depuis PHP 5.4, la position dans une chaîne doit être un entier, ou des chaînes pouvant être converties en entier, sinon, une alerte sera émise. Auparavant, une position comme "foo" était transformée silencieusement en 0.
Exemple #10 Différences entre PHP 5.3 et PHP 5.4
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
Résultat de l'exemple ci-dessus en PHP 5.3 :
string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)
Résultat de l'exemple ci-dessus en PHP 5.4 :
string(1) "b" bool(true) Warning: Illegal string offset '1.0' in /tmp/t.php on line 7 string(1) "b" bool(false) Warning: Illegal string offset 'x' in /tmp/t.php on line 9 string(1) "a" bool(false) string(1) "b" bool(false)
Note:
Accèder à des variables d'autres types (pas des tableaux ni des objets implémentant les interfaces appropriées) en utilisant [] ou {} retournera silencieusement
NULL.
Note:
PHP 5.5 ajout le support pour l'accès aux caractères dans une chaîne de caractères littérales en utilisant la syntaxe [] ou {}.
Les chaîne de caractères peuvent être concaténées en utilisant l'opérateur '.' (point). Notez que l'opérateur '+' (addition) ne fonctionnera pas. Reportez-vous aux opérateurs de chaînes pour plus d'informations.
Il existe de nombreuses fonctions utiles pour la manipulation de chaîne de caractères.
Reportez-vous à la section sur les fonctions de chaînes de caractères pour plus de précisions, et à la section sur les expressions rationnelles ou sur les expressions rationnelles compatibles Perl pour des fonctionnalités de recherches et remplacements avancés.
Il existe également des fonctions pour les URL, et des fonctions pour chiffrer/déchiffrer des chaînes de caractères (mcrypt et mhash).
Et pour finir, vous pouvez également consulter fonctions "type de caractères".
Une valeur peut être convertie en une chaîne de caractères en utilisant le mot-clé (string) ou la fonction strval(). La conversion en chaîne de caractères est automatiquement effectuée dans le contexte d'une expression où une chaîne de caractères est nécessaire. Ceci survient notamment lors de l'utilisation des fonctions echo ou print, ou lorsqu'une variable est comparée à une chaîne. Les sections sur les types et sur le transtypage expliquent ce qui suit de manière plus détaillée. Reportez-vous également à la fonction settype().
Une valeur booléenne TRUE est convertie en la chaîne
"1". Une valeur booléenne FALSE est convertie en
"" (une chaîne vide). Ceci permet les conversions vers et
depuis une chaîne et un booléen.
Un entier ou un nombre décimal est converti en une chaîne de caractères représentant le nombre de façon textuelle (y compris l'exposant pour les nombres à virgule flottante). Les nombres à virgule flottante peuvent être convertis en utilisant la notation exponentielle (4.1E+6).
Note:
Le point décimal est défini dans la locale du script (catégorie LC_NUMERIC). Reportez-vous à la fonction setlocale().
Les tableaux sont toujours convertis en la chaîne "Array" ; à cause de cela, echo et print ne peuvent pas afficher par eux-même le contenu d'un tableau. Pour afficher un seul élément, utilisez une syntaxe comme echo $arr['foo']. Voir ci-dessous pour des astuces permettant d'afficher le contenu complet.
Les objets en PHP <5.2 sont convertis en la chaîne "Object id#1", où 1 est un chiffre pouvant varier. Pour afficher les valeurs des propriétés de l'objet (à des fins de déboguage, par exemple), lisez le paragraphe ci-dessous. Pour récupérer le nom de la classe de l'objet, utilisez la fonction get_class(). Notez qu'à partir de PHP 5, la méthode __toString est utilisée lorsqu'elle peut s'appliquer.
Les ressources sont toujours converties en chaînes de la forme "Resource id #1", où 1 est le nombre unique assigné à la ressource par PHP lors de l'exécution. Ne vous fiez pas à cette structure, il est possible qu'elle change. Pour récupérer le type d'une ressource, utilisez la fonction get_resource_type().
NULL est toujours converti en une chaîne vide.
Au vu de tout cela, la conversion d'un tableau, d'un objet, ou d'une ressource, en une chaîne de caractères ne fournit aucune information utile sur une valeur, mis à part son type. Reportez-vous aux fonctions print_r() et var_dump() pour inspecter plus efficacement les contenus de ces types.
La plupart des valeurs en PHP peuvent également être converties en chaîne de caractères afin de les stocker. Cette méthode est appelée "linéarisation", et est effectuée par la fonction serialize(). Si le moteur PHP a été compilé avec le support WDDX, les valeurs PHP peuvent également être linéarisées en XML.
Lorsqu'une chaîne de caractères est évaluée dans un contexte numérique, la valeur et le type résultants sont déterminés comme suit.
Si la chaîne de caractères ne contient aucun '.', 'e', ou 'E', et que la valeur
numérique est dans l'intervalle de représentation des entiers (notamment,
qu'elle est plus petite que PHP_INT_MAX), alors la
chaîne de caractères sera transformée en entier. Dans les autres cas, elle sera
interprétée comme un nombre décimal.
La valeur est fournie par la portion initiale de la chaîne de caractères. Si la chaîne de caractères commence par une donnée numérique valide, ce sera la valeur utilisée. Sinon, la valeur sera de 0 (zéro). Une donnée numérique valide est un signe optionnel, suivi par un ou plusieurs chiffres (contenant, optionnellement, un point décimal), suivi par, éventuellement, un exposant. L'exposant est un 'e' ou 'E' suivi par un ou plusieurs chiffres.
<?php
$foo = 1 + "10.5"; // $foo est un nombre à virgule flottante (11.5)
$foo = 1 + "-1.3e3"; // $foo est un nombre à virgule flottante (-1299)
$foo = 1 + "bob-1.3e3"; // $foo est un entier (1)
$foo = 1 + "bob3"; // $foo est un entier (1)
$foo = 1 + "10 Small Pigs"; // $foo est un entier (11)
$foo = 4 + "10.2 Little Piggies"; // $foo est un nombre à virgule flottante (14.2)
$foo = "10.0 pigs " + 1; // $foo est un nombre à virgule flottante (11)
$foo = "10.0 pigs " + 1.0; // $foo est un nombre à virgule flottante (11)
?>
Pour plus d'informations à propos de cette conversion, reportez-vous au manuel Unix de la fonction strtod(3).
Pour tester un des exemples de cette section, copiez/collez l'exemple et insérez la ligne suivante pour voir ce qu'il se passe :
<?php
echo "Le type de \$foo==$foo; est " . gettype ($foo) . "<br />\n";
?>
Ne vous attendez pas à récupérer le code d'un caractère en le convertissant en entier, comme cela est fait en C. Utilisez les fonctions ord() et chr() pour convertir entre caractères et codes ASCII.
Le type string en PHP est implémenté sous la forme d'un tableau d'octets accompagné d'un entier indiquant la longueur du buffer. Il n'a aucune information sur la traduction octet/caractère, laissant cette tâche au programmeur. Il n'y a aucune limitation sur les valeurs pouvant être présentes dans une chaîne ; en particulier, les octets dont la valeur est 0 (“NUL bytes”) sont autorisés à n'importe quel endroit de la chaîne (cependant, quelques fonctions, indiquées dans ce manuel comme n'étant pas “sécurisées au niveau binaire”, peuvent ignorer tous les octets après un octet nul.)
La nature même du type "chaîne de caractères" explique qu'il n'existe pas de type “byte” en PHP - les chaînes de caractères jouent ce rôle. Les fonctions qui ne retournent pas de données textuelles - par exemple, des données arbitraires lues depuis un socket réseau - continueront de retourner des chaînes de caractères.
PHP ne dictant aucun encodage spécifique pour les chaînes de caractères, on pourrait se demander comment les chaînes littérales sont codés. Par exemple, est-ce que la chaîne "á" équivaut à la chaîne "\xE1" (ISO-8859-1), "\xC3\xA1" (UTF-8, C form), "\x61\xCC\x81" (UTF-8, D form) ou à une autre des représentations possibles ? La réponse est que la chaîne sera encodée suivant l'encodage courant du script. Aussi, si le script est écrit en ISO-8859-1, alors, la chaîne sera encodée en ISO-8859-1 ; et ainsi de suite. Toutefois, ceci n'est pas vrai si Zend Multibyte est activé ; dans ce cas, le script peut être écrit dans n'importe quel encodage (qui sera explicitement déclaré, ou bien détecté), puis sera converti en un encodage interne, qui sera utilisé pour les chaînes littérales. Notez qu'il existe des contraintes sur l'encodage du script (ou sur l'encodage interne, si Zend Multibyte est activé) - cela signifie quasiment toujours que l'encodage utilisé doit être un sur-ensemble compatible d'ASCII, comme UTF-8 ou ISO-8859-1. Notez cependant que les encodages dépendant de l'état, où les mêmes valeurs de l'octet peuvent être utilisées dans des états de décalage initial et non-initial, peuvent être problématiques.
Bien évidemment, pour être utiles, les fonctions qui opèrent sur du texte peuvent devoir faire des hypothèses sur la façon dont est encodé la chaîne de caractères. Malheureusement, ces hypothèses ne sont pas les mêmes suivant les fonctions de PHP :
Pour conclure, le fait d'écrire un programme correct en utilisant Unicode dépend de l'utilisation ou non de fonctions qui ne fonctionnent pas en Unicode, et qui corrompront très certainement les données ; il conviendra donc d'utiliser des fonctions qui fonctionnent correctement, générallement depuis les extensions intl et mbstring. Cependant, l'utilisation de fonctions qui peuvent gérer des encodages Unicode n'est que le commencement. Quelques soient les fonctions fournies par le langage, il est essentiel de connaître les spécifications de l'Unicode. Par exemple, un programme qui assume qu'il n'y a que des caractères en majuscule et en minuscule fait une mauvaise hypothèse.
Un tableau en PHP est en fait une carte ordonnée. Une carte est un type qui associe des valeurs en clés. Ce type est optimisé pour différentes utilisations ; il peut être considéré comme un tableau, une liste, une table de hashage, un dictionnaire, une collection, une pile, une file d'attente et probablement plus. On peut avoir, comme valeur d'un tableau, d'autres tableaux, multidimensionnels ou non.
La structure de ces données dépasse l'objet de ce manuel, mais vous trouverez au moins un exemple pour chacun des cas évoqués. Pour plus d'informations, reportez-vous aux différentes explications sur le sujet que l'on trouve sur le web.
Un tableau peut être créé en utilisant la structure de langage array(). Il prend un nombre illimité de paramètres, chacun séparé par une virgule, sous la forme d'une paire key => value.
array(
key => value,
key2 => value2,
key3 => value3,
...
)
La virgule après le dernier élément d'un tableau est optionnelle et peut ne pas être ajoutée. C'est généralement ce qui est fait pour les tableaux sur une seule ligne, i.e. array(1, 2) est préféré à array(1, 2, ). Pour les tableaux sur plusieurs lignes, la virgule finale est généralement utilisée, car elle permet d'ajouter plus facilement de nouveaux éléments à la fin.
Depuis PHP 5.4, vous pouvez également utiliser la syntaxe courte, qui remplace array() par [].
Exemple #1 Un tableau simple
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
// depuis PHP 5.4
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
La clé key peut être soit un integer, soit une chaîne de caractères. La valeur value peut être de n'importe quel type.
De plus, les modifications de type pour la clé key peuvent survenir :
Si plusieurs éléments dans la déclaration d'un tableau utilise la même clé, seule la dernière sera utilisée, écrasant ainsi toutes les précédentes.
Exemple #2 Exemple sur la modification de type et l'écrasement
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(1) {
[1]=>
string(1) "d"
}
Vu que toutes les clés de l'exemple ci-dessus sont modifiées en l'entier 1, la valeur sera écrasée sur chaque nouvel élément, et seul le dernier dont la valeur assignée est "d" sera conservé.
Les tableaux PHP peuvent contenir des clés de type integer et string en même temps, vu que PHP ne distingue pas les tableaux indexés et les tableaux associatifs.
Exemple #3 Exemple avec des clés de type integer et string
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100,
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
["foo"]=>
string(3) "bar"
["bar"]=>
string(3) "foo"
[100]=>
int(-100)
[-100]=>
int(100)
}
La clé key est optionnelle. Si elle n'est pas spécifiée, PHP utilisera un incrément de la dernière clé entière utilisée.
Exemple #4 Tableaux indexés sans clé
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}
Il est possible de spécifier la clé seulement pour quelques éléments et ne pas la fournir pour d'autres :
Exemple #5 Exemple avec des clés seulement pour quelques éléments
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
L'exemple ci-dessus va afficher :
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[6]=>
string(1) "c"
[7]=>
string(1) "d"
}
Comme vous pouvez le voir, la dernière valeur "d" a été assignée à la clé 7. Ceci est du au fait que le dernier entier le plus grand utilisé auparavant était 6.
Les éléments d'un tableau peuvent être accédés en utilisant la syntaxe array[key].
Exemple #6 Accès aux éléments d'un tableau
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
L'exemple ci-dessus va afficher :
string(3) "bar" int(24) string(3) "foo"
Note:
Les parenthèses et les crochets peuvent être utilisés pour accéder aux éléments d'un tableau (i.e. $array[42] et $array{42} feront exactement la même chose dans l'exemple ci-dessus).
Depuis PHP 5.4, il est possible de faire référence à un tableau résultant d'une fonction ou d'une méthode directement. Avant, cela n'était possible qu'en utilisant une variable temporaire.
Depuis PHP 5.5, il est possible de déférencer un tableau littéral.
Exemple #7 Faire référence à un tableau à la sortie d'une fonction ou d'une méthode
<?php
function getArray() {
return array(1, 2, 3);
}
// Depuis PHP 5.4
$secondElement = getArray()[1];
// Avant PHP 5.4
$tmp = getArray();
$secondElement = $tmp[1];
// ou
list(, $secondElement) = getArray();
?>
Note:
Une tentative d'accès à une clé d'un tableau qui n'a pas été définie revient à tenter d'accès à une variable non définie : une alerte de niveau
E_NOTICEsera émise, et le résultat vaudraNULL.
Un tableau existant peut être modifié en y assignant explicitement des valeurs.
L'assignation d'une valeur dans un tableau est effectué en spécifiant la clé, entre crochets. La clé peut également ne pas être renseignée, sous la forme : [].
$arr[clé] = valeur; $arr[] = valeur; // clé peut être un entier ou une chaîne de caractères // valeur peut être n'importe quel type
Si $arr n'existe pas lors de l'assignation, il sera créé ; c'est ainsi une façon détournée de créer un tableau. Cette pratique est cependant découragée car si $arr contient déjà quelques valeurs (i.e. string depuis la variable demandée) alors cette valeur restera en place et [] peut attendre un opérateur d'accès sur une chaîne. C'est toujours un meilleur choix que d'initialiser une variable par assignement direct.
Pour modifier une valeur en particulier, il convient d'assigner une valeur en spécifiant sa clé. Pour effacer une paire clé/valeur, il convient d'appeler la fonction unset() sur la clé désirée.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // Identique à $arr[13] = 56;
// à cet endroit du script
$arr["x"] = 42; // Ceci ajoute un nouvel élément au
// tableau avec la clé "x"
unset($arr[5]); // Ceci efface l'élément du tableau
unset($arr); // Ceci efface complètement le tableau
?>
Note:
Comme dit plus haut, si aucune clé n'est spécifiée, l'indice maximal existant est repris, et la nouvelle clé sera ce nombre, plus 1 (mais au moins 0). Si aucun indice entier n'existe, la clé sera 0 (zéro).
Notez que la clé entière maximale pour cette opération n'a pas besoin d'exister dans le tableau au moment de la manipulation. Elle doit seulement avoir existé dans le tableau à un moment ou un autre depuis la dernière fois où le tableau a été ré-indexé. Voici un exemple qui illustre ce principe :
<?php
// Création d'un tableau simple.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Maintennant, on efface tous les éléments, mais on conserve le tableau :
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Ajout d'un élément (notez que la nouvelle clé est 5, et non 0).
$array[] = 6;
print_r($array);
// Ré-indexation :
$array = array_values($array);
$array[] = 7;
print_r($array);
?>L'exemple ci-dessus va afficher :
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
Il y a beaucoup de fonctions utiles pour travailler avec les tableaux. Nous vous invitons à lire la section de ce manuel sur les fonctions en rapport avec les tableaux.
Note:
La fonction unset() permet d'effacer les clés d'un tableau. Soyez attentif sur le fait que le tableau ne sera pas ré-indexé. Si vous voulez réaliser un effacement complet et une ré-indexation de votre tableau, vous devez utiliser la fonction array_values().
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* produira un tableau comme ceci
$a = array(1 => 'one', 3 => 'three');
et NON un tableau comme ceci
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Maintenant, $b vaut array(0 => 'one', 1 =>'three')
?>
La structure de contrôle foreach existe tout spécialement pour les tableaux. Elle fournit une manière pratique de parcourir un tableau.
Utiliser toujours des guillemets autour d'un index littéral. Par exemple, $foo['bar'] est correct, alors que $foo[bar] ne l'est pas. Mais pourquoi ? il est courant de rencontrer ce genre de syntaxe dans d'ancien script :
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
C'est incorrect, mais ça fonctionne. La raison est que ce code a une constante
indéfinie (bar) plutôt qu'une chaîne ('bar' - noter les guillemets). PHP
peut définir plus loin une constante portant le même nom.
Cela fonctionne car PHP convertit automatiquement une chaîne nue
(une chaîne sans guillemets qui ne correspond à aucun symbole connu) en une chaîne
qui la contient. Actuellement, s'il n'y a aucune constante nommée bar,
alors PHP substituera 'bar' dans la chaîne et l'utilisera.
Note: Ceci ne signifie pas qu'il faut toujours mettre la clé entre guillemets. N'utilisez pas de guillemets avec les clés qui sont des constantes ou des variables, car cela empêcherait PHP de les interpréter.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Tableau simple :
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nVérification de $i : \n";
echo "Mauvais : " . $array['$i'] . "\n";
echo "Bon : " . $array[$i] . "\n";
echo "Mauvais : {$array['$i']}\n";
echo "Bon : {$array[$i]}\n";
}
?>L'exemple ci-dessus va afficher :
Vérification de 0 : Notice: Undefined index: $i in /path/to/script.html on line 9 Mauvais : Bon : 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Mauvais : Bon : 1 Vérification de 1 : Notice: Undefined index: $i in /path/to/script.html on line 9 Mauvais : Bon : 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Mauvais : Bon : 2
Plus d'exemples pour expliquer ce comportement :
<?php
// Affichons toutes les erreurs
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Correct
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrect. Ceci fonctionne mais PHP émettera une erreur de type E_NOTICE car
// on utilise la constante nommée fruit qui est indéfinie
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// Ceci définit une constante pour expliquer ce qu'il ne va pas. La valeur 'veggie'
// est assignée à la constante nommée fruit.
define('fruit', 'veggie');
// Noter la différence maintenant
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// Ce qui squit est correct, car c'est dans une chaîne. Les constantes ne sont pas recherchées
// dans les chaînes, et donc, aucune alerte E_NOTICE ne sera émise
print "Hello $arr[fruit]"; // Hello apple
// Avec une exception : les parenthèses autour d'un tableau dans une chaîne permettent
// aux constantes d'être interprétées
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// Ceci ne fonctionnera pas, et en résultera une erreur d'analyse, comme ceci :
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Ceci arrive lors de l'utilisation d'une supergloables dans les chaînes
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// La concaténation est une autre solution
print "Hello " . $arr['fruit']; // Hello apple
?>
Lorsque error_reporting est défini afin
de montrer les erreurs de type E_NOTICE (en le définissant à
E_ALL, par exemple), une telle pratique devient immédiatement
visible. Par défaut,
error_reporting n'est pas défini pour
afficher toutes les alertes.
Comme vu dans la section "syntaxe", ce qui se trouve entre crochets ('[' et ']') doit être une expression. Ceci signifie que le code ci-dessous fonctionne :
<?php
echo $arr[somefunc($bar)];
?>
C'est un exemple d'utilisation d'une fonction retournant une valeur qui sera la clé du tableau. PHP comprend également les constantes :
<?php
$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
Noter que E_ERROR est également un identifiant valide,
tout comme bar dans le premier exemple. Mais le dernier
exemple est finalement le même que celui-ci :
<?php
$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
car E_ERROR vaut 1, etc.
Dans le futur, les développeurs PHP peuvent vouloir ajouter une autre constante ou un autre mot clé, ou bien une constante dans une autre partie du code qui peut interférer. Par exemple, il est toujours incorrect d'utiliser le mot empty et default, sachant que ce sont des mots réservés.
Note: Pour être plus clair, dans une chaîne entourée de guillemets doubles, il est valide de ne pas entourer les indexes d'un tableau avec des guillemets, et donc, "$foo[bar]" est valide. Voir les exemples ci-dessous pour plus détails mais aussi la section sur l'analyse des variables dans les chaînes.
Pour tous les types : entier, nombre décimal, chaîne de caractères, booléen et ressource, le fait de convertir une valeur en un tableau résulte en un tableau contenant un seul élément dont l'indexe vaut zéro et la valeur, une valeur scalaire convertie. En d'autres termes, (array)$scalarValue est exactement la même chose que array($scalarValue).
Si un objet est converti en un tableau, le résultat sera un tableau dont les éléments sont les propriétés de l'objet. Les clés sont les noms des membres, avec une légère exception : les variables ayant un nom sous forme d'entier sont inaccessible; les variables privées auront le nom de la classe ajouté au nom de la variable ; les variables protégées auront un '*' ajouté au nom de la variable. Ce comportement peut amener à des résultats inattendus :
<?php
class A {
private $A; // Ceci devient '\0A\0A'
}
class B extends A {
private $A; // Ceci devient '\0B\0A'
public $AA; // Ceci devient 'AA'
}
var_dump((array) new B());
?>
Ici, on pourrait penser qu'il y a 2 clés nommées 'AA', alors qu'une est actuellement nommée '\0A\0A'.
La conversion de NULL en un tableau résultat en un tableau vide.
Il est possible de comparer plusieurs tableaux avec la fonction array_diff() ainsi qu'avec les opérateurs de tableaux.
Le type tableau en PHP est vraiment versatile. Voici quelques exemples :
<?php
// This
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // la clé sera 0
);
// est strictement équivalent à
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // la clé sera 0
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// Après exécution du code ci-dessus, $a sera le tableau
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), et $b sera le tableau
// array(0 => 'a', 1 => 'b', 2 => 'c'), ou simplement array('a', 'b', 'c').
?>
Exemple #8 Utilisation de array()
<?php
// Tableau comme carte de propriétés
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// clés numériques strictes
$array = array( 7,
8,
0,
156,
-10
);
// est identique à array(0 => 7, 1 => 8, ...)
$switching = array( 10, // clé = 0
5 => 6,
3 => 7,
'a' => 4,
11, // clé = 6 (l'indice entier maximal est 5)
'8' => 2, // clé = 8 (intier !)
'02' => 77, // clé = '02'
0 => 12 // la valeur 10 sera écrasée par la valeur 12
);
// empty array
$empty = array();
?>
Exemple #9 Collection
<?php
$colors = array('rouge', 'bleu', 'verte', 'jaune');
foreach ($colors as $color) {
echo "Aimez-vous la couleur $color ?\n";
}
?>
L'exemple ci-dessus va afficher :
Aimez-vous la couleur rouge ? Aimez-vous la couleur bleu ? Aimez-vous la couleur verte ? Aimez-vous la couleur jaune ?
La modification directe de valeurs d'un tableau est possible depuis PHP 5 en le passant par référence. Avant cette version, nous devions utiliser l'astuce suivante :
Exemple #10 Modification d'un élément dans la boucle
<?php
// PHP 5
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* On s'assure que les écritures suivantes
sur $color ne modifie pas le dernier élément du tableau */
// Astuce pour les anciennes versions
foreach ($colors as $key => $color) {
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => ROUGE
[1] => BLEU
[2] => VERTE
[3] => JAUNE
)
Cet exemple crée un tableau, dont l'indexation commence à 1.
Exemple #11 Indexation commençant à 1
<?php
$firstquarter = array(1 => 'Janvier', 'Février', 'Mars');
print_r($firstquarter);
?>
L'exemple ci-dessus va afficher :
Array
(
[1] => 'Janvier'
[2] => 'Février'
[3] => 'Mars'
)
Exemple #12 Remplissage d'un tableau
<?php
// Remplit un tableau avec tous les éléments d'un dossier
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
Les tableaux sont ordonnés. L'ordre peut être modifié en utilisant plusieurs fonctions. Voir la section sur les fonctions sur les tableaux pour plus d'informations. La fonction count() peut être utilisée pour compter le nombre d'éléments d'un tableau.
Exemple #13 Tri d'un tableau
<?php
sort($files);
print_r($files);
?>
Sachant que la valeur d'une tableau peut être n'importe quoi, elle peut aussi être un autre tableau. Ceci permet la création de tableaux récursifs et de tableaux multidimensionnels.
Exemple #14 Tableaux récursifs et multidimensionnels
<?php
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
// Quelques exemples pour retrouver les valeurs dans le tableau ci-dessus
echo $fruits["holes"][5]; // affiche "second"
echo $fruits["fruits"]["a"]; // affiche "orange"
unset($fruits["holes"][0]); // efface "first"
// Création d'un tableau multidimensionnel
$juices["apple"]["green"] = "good";
?>
L'assignation d'un tableau induit toujours la copie des valeurs. Utilisez l'opérateur de référence pour copier un tableau par référence.
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 est modifié,
// $arr1 vaut toujours array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // maintenant, $arr1 et $arr3 sont identiques
?>
Pour créer un nouvel objet, utilisez le mot clé new afin d'instancier une classe :
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
Pour une discussion complète, voir le chapitre sur les classes et les objets.
Si un objet est converti en un objet, il ne sera pas modifié.
Si une valeur de n'importe quel type est convertie en un objet,
une nouvelle instance de la classe interne stdClass
sera créée. Si la valeur est NULL, la nouvelle instance sera vide.
La conversion d'un tableau en objet fera que les clés deviendront les
proriétés, et les valeurs des clés, deviennent les valeurs des proriétés.
Pour n'importe quel autre type, un membre appelé scalar
contiendra la valeur.
<?php
$obj = (object) 'ciao';
echo $obj->scalar; // Affiche : 'ciao'
?>
Une ressource est une variable spéciale, contenant une référence vers une ressource externe. Les ressources sont créées et utilisées par des fonctions spéciales. Voir l'appendice pour une liste de toutes ces fonctions ainsi que les types de ressource correspondants.
Voir aussi la fonction get_resource_type().
Sachant qu'une ressource représente un fichier ouvert, une connexion à une base de données, une image, etc..., la conversion en une ressource n'a pas de sens.
Sachant qu'une ressource qui n'a plus aucune référence est détectée automatiquement et est libérée par le collecteur, il est rarement nécessaire de libérer la mémoire manuellement.
Note: Les connexions persistantes aux bases de données sont des exceptions à cette règle. Elles ne sont pas détruites par le collecteur. Voir la section sur les connexions persistantes pour plus d'informations.
La valeur spéciale NULL représente une variable sans valeur. NULL est
la seule valeur possible du type NULL.
Une variable est considérée comme null si :
elle s'est vue assigner la constante NULL.
elle n'a pas encore reçu de valeur.
elle a été effacée avec la fonction unset().
Il y a une seule valeur de type null, et c'est la constante
insensible à la casse NULL.
<?php
$var = NULL;
?>
Transtyper une variable vers null en utilisant
la syntaxe (unset) $var n'effacera pas
la variable, ni écrasera sa valeur. Ca ne fera que retourner
la valeur NULL.
Les fonctions de rappel peuvent être identifiées via le type callable depuis PHP 5.4. Cette documentation utilise le type callback qui revient exactement au même.
Certaines fonctions, comme call_user_func() ou usort(), acceptent comme paramètre des fonctions de rappel définies par l'utilisateur. Les fonctions de rappel peuvent être de simples fonctions, mais aussi des méthodes d'objets, y compris des méthodes statiques de classe.
Une fonction PHP est passée par son nom, sous la forme d'une chaîne de caractères. Toute fonction interne ou définie par l'utilisateur peut être utilisée, sauf les constructions de langage comme : array(), echo, empty(), eval(), exit(), isset(), list(), print, ou unset().
Une méthode d'un objet instancié est passée comme un tableau contenant un objet à l'index 0, et le nom de la méthode à l'index 1.
Les méthodes statiques de classe peuvent aussi être passées sans instancier d'objet de cette classe, en passant le nom de la classe au lieu d'un objet à l'index 0. Depuis PHP 5.2.3, il est également possible de passer 'NomDeLaClasse::NomDeLaMethode'.
En dehors des fonctions définies normalement par l'utilisateur, la fonction create_function() peut également être utilisée pour créer une fonction de rappel anonyme. Depuis PHP 5.3.0, il est également possible de passer une closure comme paramètre de type callback.
Exemple #1 Exemples de fonctions de rappel
<?php
// Un exemple de fonction de rappel
function my_callback_function() {
echo 'hello world!';
}
// Un exemple de méthode de rappel
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1 : Fonction de rappel simple
call_user_func('my_callback_function');
// Type 2 : Appel d'une méthode statique de classe
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3 : Appel d'une méthode objet
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4 : Appel d'une méthode statique de classe (depuis PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Type 5 : Appel à une méthode statique de classe relative (depuis PHP 5.3.0)
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A
?>
Exemple #2 Exemple d'une fonction de rappel utilisant une closure
<?php
// Notre closure
$double = function($a) {
return $a * 2;
};
// Ceci est notre intervalle de nombres
$numbers = range(1, 5);
// Utilisation de la closure comme fonction de rappel.
// Ici, pour doubler la taille de chaque élément de notre intervalle
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
L'exemple ci-dessus va afficher :
2 4 6 8 10
Note: En PHP 4, il était nécessaire d'utiliser une référence pour créer une fonction de rappel qui pointe vers un objet, et non une copie de celui-ci. Pour plus de détails, reportez-vous à l'explication sur les références.
Note:
Notez que les fonctions de rappel enregistrées avec des fonctions comme call_user_func() et call_user_func_array() ne seront pas appelées si une exception n'est pas interceptée alors qu'elle a été lancée dans une précédente fonction de rappel.
mixed indique qu'un paramètre peut accepter plusieurs (mais pas nécessairement tous) types.
gettype() par exemple, accepte tous les types PHP, alors que str_replace() accepte les chaînes et les tableaux.
number indique qu'un paramètre peut être soit un nombre entier, soit un nombre décimal (nombre décimal).
Les pseudo-types callback étaient utilisés dans cette documentation avant que le type callable ne soit introduit en PHP 5.4. Leur signification est exactement la même.
void comme type retourné signifie que la valeur retournée est inutile. void dans une liste de paramètre signifie que la fonction n'accepte aucun paramètre.
$... dans le prototype d'une fonction signifie
"et bien plus...". Ce nom de variable est utilisé
lorsqu'une fonction peut prendre un nombre indéfini d'arguments.
PHP n'impose pas (et ne permet pas) de définir explicitement le type d'une variable lors de sa déclaration ; le type d'une variable est déterminé par son contexte d'utilisation. Par exemple, si une valeur de type string est assignée à la variable $var, alors $var devient de type string. Si une valeur de type integer est ensuite assignée à cette variable $var, alors son type devient integer.
Un exemple de conversion de type automatique avec PHP est l'opérateur d'addition '+'. Si une des opérandes est de type float, alors les deux opérandes seront évaluées comme de type float, et le résultat sera de type float. Sinon, les opérandes seront interprétées comme des integers, et le résultat sera également de type integer. Notez que cela ne modifie pas le type des opérandes en elle-mêmes ; la seule modification est la façon dont les opérandes sont évaluées, et le type de l'expression elle-même.
<?php
$foo = "0"; // $foo est une chaîne de caractères (ASCII 48)
$foo += 2; // $foo est maintenant un entier (2)
$foo = $foo + 1.3; // $foo est maintenant un nombre à virgule flottante (3.3)
$foo = 5 + "10 Little Piggies"; // $foo est un entier (15)
$foo = 5 + "10 Small Pigs"; // $foo est un entier (15)
?>
Si les 2 derniers exemples vous semblent bizarres, reportez-vous à la section sur les conversions de chaînes en nombres.
Pour forcer une variable à être évaluée en un certain type, reportez-vous à la section sur le transtypage. Pour changer le type d'une variable, reportez-vous à la fonction settype().
Pour tester les exemples de cette section, utilisez la fonction var_dump().
Note:
Le comportement d'une conversion automatique en tableau est actuellement non-défini.
De plus, puisque PHP supporte l'indexation des chaînes de caractères via des positions en utilisant la même syntaxe que pour les tableaux, l'exemple suivant est vrai pour toutes les versions de PHP :
<?php
$a = 'car'; // $a est une chaîne de caractères
$a[0] = 'b'; // $a est toujours une chaîne de caractères
echo $a; // bar
?>Reportez-vous à la section sur l'accès aux chaînes par caractères pour plus d'informations.
La modification de types en PHP fonctionne globalement de la même façon qu'en C : le nom du type désiré est écrit entre parenthèses avant la variable à traiter.
<?php
$foo = 10; // $foo est un entier
$bar = (boolean) $foo; // $bar est un booléen
?>
Les préfixes autorisés sont :
La modification en binaire avec (binary) et le préfixe b ont été ajoutés en PHP 5.2.1
Notez que les tabulations et les espaces sont autorisés dans les parenthèses. Les exemples suivants sont donc fonctionnellement équivalents :
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Modification d'une chaîne littérale et d'une variable en chaînes binaires :
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
Note:
Au lieu de modifier une variable en chaîne, il est également possible d'entourer la variable de guillemets doubles.
<?php
$foo = 10; // $foo est un entier
$str = "$foo"; // $str est une chaîne
$fst = (string) $foo; // $fst est également une chaîne
// Ceci affichera "ils sont identiques"
if ($fst === $str) {
echo "ils sont identiques";
}
?>
Le comportement d'une modification de type n'est pas toujours évident suivant les types. Pour plus d'informations, reportez-vous à ces sections :
En PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la variable. Le nom est sensible à la casse.
Les noms de variables suivent les mêmes règles de nommage que les autres entités PHP. Un nom de variable valide doit commencer par une lettre ou un souligné (_), suivi de lettres, chiffres ou soulignés. Exprimé sous la forme d'une expression régulière, cela donne : '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Note: Dans nos propos, une lettre peut être a-z, A-Z, et les octets de 127 à 255 (0x7f-0xff).
Note: $this est une variable spéciale, qui ne peut pas être assignée.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Pour obtenir des informations sur une variable, voyez les fonctions dédiées aux variables.
Exemple #1 Validité des noms de variables
<?php
$var = 'Jean';
$Var = 'Paul';
echo "$var, $Var"; // affiche "Jean, Paul"
$4site = 'pas encore'; // invalide : commence par un nombre
$_4site = 'pas encore'; // valide : commence par un souligné
$täyte = 'mansikka'; // valide : 'ä' est ASCII (étendu) 228.
?>
Les variables sont toujours assignées par valeur. C'est-à-dire, lorsque vous assignez une expression à une variable, la valeur de l'expression est recopiée dans la variable. Cela signifie, par exemple, qu'après avoir assigné la valeur d'une variable à une autre, modifier l'une des variables n'aura pas d'effet sur l'autre. Pour plus de détails sur ce genre d'assignation, reportez-vous aux expressions.
PHP permet aussi d'assigner les valeurs aux variables par référence. Cela signifie que la nouvelle variable ne fait que référencer (en d'autres termes, "devient un alias de", ou encore "pointe sur") la variable originale. Les modifications de la nouvelle variable affecteront l'ancienne et vice versa.
Pour assigner par référence, ajoutez simplement un & (ET commercial) au début de la variable qui est assignée (la variable source). Dans l'exemple suivant, Mon nom est Pierre s'affichera deux fois :
Exemple #2 Assignation de référence
<?php
$foo = 'Pierre'; // Assigne la valeur 'Pierre' à $foo
$bar = &$foo; // Référence $foo avec $bar.
$bar = "Mon nom est $bar"; // Modifie $bar...
echo $foo; // $foo est aussi modifiée
echo $bar;
?>
Une chose importante à noter est que seules les variables nommées peuvent être assignées par référence.
Exemple #3 Assignation de référence et variables anonymes
<?php
$foo = 25;
$bar = &$foo; // assignation valide
$bar = &(24 * 7); // assignation invalide : référence une expression sans nom
function test() {
return 25;
}
$bar = &test(); // assignation invalide.
?>
Il n'est pas nécessaire d'initialiser les variables en PHP, cependant, cela reste
une excellente pratique. Les variables non initialisées ont une valeur par défaut
selon leur type - FALSE pour les booléens, zéro pour les entiers et les réels, chaîne vide
pour les chaînes de caractères (comme utilisée avec
echo) ou un tableau vide
pour les tableaux.
Exemple #4 Valeurs par défaut des variables non initialisées
<?php
// Une variable non initialisée et non référencée (pas de contexte d'utilisation); retourne NULL
var_dump($unset_var);
// L'utilisation d'un booléen; retourne 'false' (Voir l'opérateur ternaire pour comprendre cette syntaxe)
echo($unset_bool ? "true\n" : "false\n");
// Utilisation d'une chaîne de caractères; retourne 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);
// Utilisation d'un entier; retourne 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);
// Utilisation d'un entier/double; retourne 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);
// Utilisation d'un tableau : retourne array(1) { [3]=> string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);
// Utilisation d'un objet; crée un nouvel objet stdClass (voir http://www.php.net/manual/fr/reserved.classes.php)
// Retourne : object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>
Utiliser la valeur par défaut d'une variable non initialisée est problématique lorsque vous incluez un fichier dans un autre qui utilise le même nom de variable. C'est également un risque niveau sécurité lorsque register_globals est activé. Une erreur de niveau E_NOTICE sera émise lorsque vous travaillerez avec des variables non initialisées, cependant, aucune erreur ne sera lancée lorsque vous tenterez d'insérer un élément dans un tableau non initialisé. La structure de langage isset() peut être utilisée pour détecter si une variable a déjà été initialisée.
PHP fournit un grand nombre de variables pré-définies. Cependant, beaucoup de ces variables ne peuvent pas être présentées ici, car elles dépendent du serveur sur lequel elles tournent, de la version et de la configuration du serveur ou encore d'autres facteurs. Certaines de ces variables ne seront pas accessibles lorsque PHP fonctionne en ligne de commande. Pour une liste de ces variables, lisez la section sur les variables réservées prédéfinies.
Depuis la version PHP 4.2.0, la valeur par défaut de la directive PHP register_globals est off. Ceci est une évolution majeure de PHP. Avoir la directive register_globals à off affecte les variables pré-définies du contexte global. Par exemple, pour lire DOCUMENT_ROOT vous devez utiliser $_SERVER['DOCUMENT_ROOT'] au lieu de $DOCUMENT_ROOT ou bien, il faut lire $_GET['id'] dans l'URL http://www.example.com/test.php?id=3 au lieu de $id ou encore $_ENV['HOME'] au lieu de $HOME.
Pour des informations liées à cette évolution, lisez la documentation de la directive register_globals , le chapitre sur la sécurité, à propos de l'utilisation des variables superglobales, ainsi que les annonces de PHP » 4.1.0 et » 4.2.0.
L'utilisation des variables pré-définies de PHP, comme les tableaux superglobaux, est recommandée.
Depuis la version 4.1.0, PHP fournit un jeu de tableaux pré-définis, contenant les variables du serveur (si possible), les variables d'environnement et celles d'entrées. Ces nouveaux tableaux sont un peu particuliers, car ils sont automatiquement globaux : ils sont automatiquement disponibles dans tous les environnements d'exécution. Pour cette raison, ils sont dits 'superglobaux' (il n'y a pas de mécanisme PHP pour créer de telles variables. Les superglobales sont listées ci-dessous. Cependant, pour connaître le détail de leur contenu et une présentation approfondie sur les variables pré-définies PHP et leur nature, reportez-vous à la section variables pré-définies. De plus, vous noterez que les anciennes variables pré-définies ($HTTP_*_VARS) existent toujours. Depuis PHP 5.0.0, les tableaux prédéfinis PHP peuvent être désactivés avec l'option de configuration register_long_arrays.
Note: Variables variables
Les superglobales ne peuvent pas être utilisées comme variables dynamiques dans les fonctions ou les méthodes des classes.
Note:
Même si les superglobales et HTTP_*_VARS peuvent exister en même temps, elles ne sont pas identiques, donc, le changement d'une ne changera pas l'autre.
Si certaines variables de variables_order ne sont pas définies, leur tableau pré-défini PHP correspondant est laissé vide.
La portée d'une variable dépend du contexte dans lequel la variable est définie. Pour la majorité des variables, la portée concerne la totalité d'un script PHP. Mais, lorsque vous définissez une fonction, la portée d'une variable définie dans cette fonction est locale à la fonction. Par exemple :
Exemple #1 Les variables sont locales à la fonction
<?php
$a = 1;
include 'b.inc';
?>
Ici, la variable $a sera accessible dans le script inclus b.inc. Cependant, dans les fonctions définies par l'utilisateur, une nouvelle définition de cette variable sera donnée, limitée à la fonction. Toute variable utilisée dans une fonction est, par définition, locale. Par exemple :
<?php
$a = 1; /* portée globale */
function test()
{
echo $a; /* portée locale */
}
test();
?>
Le script n'affichera rien à l'écran car l'instruction echo utilise la variable locale $a, et celle-ci n'a pas été assignée préalablement dans la fonction. Vous pouvez noter que ce concept diffère un petit peu du langage C dans lequel une variable globale est automatiquement accessible dans les fonctions, à moins d'être redéfinie localement dans la fonction. Cela peut poser des problèmes si vous redéfinissez des variables globales localement. En PHP, une variable globale doit être déclarée à l'intérieur de chaque fonction afin de pouvoir être utilisée dans cette fonction.
Commençons par un exemple avec global :
Exemple #2 Exemple avec global
<?php
$a = 1;
$b = 2;
function somme() {
global $a, $b;
$b = $a + $b;
}
somme();
echo $b;
Le script ci-dessus va afficher la valeur 3. En déclarant globales les variables $a et $b locales de la fonction somme(), toutes les références à ces variables concerneront les variables globales. Il n'y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction.
Une deuxième méthode pour accéder aux variables globales est d'utiliser le tableau associatif pré-défini $GLOBALS. Le précédent exemple peut être réécrit de la manière suivante :
Exemple #3 Les variables globales et $GLOBALS
<?php
$a = 1;
$b = 2;
function somme() {
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
somme();
echo $b;
?>
Le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clé et les valeurs des éléments du tableau comme valeur des variables. Notez que $GLOBALS existe dans tous les contextes, car $GLOBALS est un superglobal. Voici un exemple des super globaux :
Exemple #4 Les variables super globales
<?php
function test_global() {
// La plupart des variables pré-définies ne sont pas des "superglobales" et
// requièrent le mot-clé 'global' pour être disponibles dans une fonction.
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
// Les superglobales sont accessibles dans tous les contextes
// et ne requièrent pas 'global'. Les superglobales sont disponibles
// depuis PHP 4.1.0 et HTTP_POST_VARS est de plus en plus
// obsolète.
echo $_POST['name'];
}
?>
Note:
L'utilisation du mot clé global à l'extérieur d'une fonction n'est pas une erreur. Il peut être utilisé si le fichier est inclus depuis l'intérieur d'une fonction.
Une autre caractéristique importante de la portée des variables est la notion de variable static. Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. Prenons l'exemple suivant :
Exemple #5 Les variables statiques
<?php
function test()
{
$a = 0;
echo $a;
$a++;
}
?>
Cette fonction est un peu inutile car à chaque fois qu'elle est appelée, elle initialise $a à 0 et affiche "0". L'incrémentation de la variable ($a++) ne sert pas à grand chose, car dès que la fonction est terminée, la variable $a disparaît. Pour faire une fonction de comptage utile, c'est-à-dire qui ne perdra pas la trace du compteur, la variable $a est déclarée comme une variable statique :
Exemple #6 Les variables statiques (2)
<?php
function test()
{
static $a = 0;
echo $a;
$a++;
}
?>
Maintenant, la variable $a est initialisée uniquement lors du première appel à la fonction et, à chaque fois que la fonction test() est appelée, elle affichera une valeur de $a incrémentée de 1.
Les variables statiques sont essentielles lorsque vous faites des appels récursifs à une fonction. Une fonction récursive est une fonction qui s'appelle elle-même. Il faut faire attention lorsque vous écrivez une fonction récursive car il est facile de faire une boucle infinie. Vous devez vérifier que vous avez bien une condition qui permet de terminer votre récursivité. La fonction suivante compte récursivement jusqu'à 10, en utilisant la variable $count pour savoir quand il faut s'arrêter :
Exemple #7 Les variables statiques et la récursivité
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
?>
Note:
Les variables statiques doivent être déclarées comme dans l'exemple ci-dessus. Tenter d'assigner des valeurs à ces variables qui sont le résultat d'expressions causera une erreur d'analyse.
Exemple #8 Déclaration de variables statiques
<?php
function foo(){
static $int = 0; // correct
static $int = 1+2; // faux (car c'est une expression)
static $int = sqrt(121); // faux (car c'est aussi une expression)
$int++;
echo $int;
}
?>
Note:
Les déclarations statiques sont résolues au moment de la compilation.
Note:
L'utilisation du mot clé global à l'extérieur d'une fonction n'est pas une erreur. Il peut être utilisé si le fichier est inclus depuis l'intérieur d'une fonction.
Le Zend Engine 1, sur qui repose PHP 4, implémente les options static et global pour les variables, en terme de référence. Par exemple, une vraie variable globale est importée dans un contexte de fonction avec global. Cette commande crée en fait une référence sur la variable globale. Cela peut vous mener à des comportements inattendus, par exemple :
<?php
function test_global_ref() {
global $obj;
$obj = &new stdclass;
}
function test_global_noref() {
global $obj;
$obj = new stdclass;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
L'exemple ci-dessus va afficher :
Un comportement similaire s'applique à la commande static. Les références ne sont pas stockées dynamiquement :
<?php
function &get_instance_ref() {
static $obj;
echo 'Objet statique : ';
var_dump($obj);
if (!isset($obj)) {
// Assigne une référence à une variable statique
$obj = &new stdclass;
}
$obj->property++;
return $obj;
}
function &get_instance_noref() {
static $obj;
echo 'Objet statique : ';
var_dump($obj);
if (!isset($obj)) {
// Assigne une objet à une variable statique
$obj = new stdclass;
}
$obj->property++;
return $obj;
}
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
L'exemple ci-dessus va afficher :
Ces exemples illustrent les problèmes rencontrés lors de l'assignation de référence à des variables statiques, qui sont oubliées lorsque vous appelez &get_instance_ref() une seconde fois.
Il est pratique d'avoir parfois des noms de variables qui sont variables. C'est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. Une variable classique est affectée avec l'instruction suivante :
<?php
$a = 'bonjour';
?>
Une variable dynamique prend la valeur d'une variable et l'utilise comme nom d'une autre variable. Dans l'exemple ci-dessous, bonjour peut être utilisé comme le nom d'une variable en utilisant le "$$" précédent la variable. C'est-à-dire :
<?php
$$a = 'monde';
?>
À ce niveau, deux variables ont été définies et stockées dans l'arbre des symboles PHP : $a avec comme valeur "bonjour" et $bonjour avec comme valeur "monde". Alors, l'instruction :
<?php
echo "$a ${$a}";
?>
produira le même affichage que :
<?php
echo "$a $bonjour";
?>
c'est-à-dire : bonjour monde.
Afin de pouvoir utiliser les variables dynamiques avec les tableaux, vous avez à résoudre un problème ambigu. Si vous écrivez $$a[1], l'analyseur a besoin de savoir si vous parler de la variable qui a pour nom $a[1] ou bien si vous voulez l'index [1] de la variable $$a. La syntaxe pour résoudre cette ambiguïté est la suivante : ${$a[1]} pour le premier cas et ${$a}[1] pour le deuxième.
On peut également accéder aux propriétés d'une classe en utilisant les noms des variables. Le nom de la variable sera résolu en utilisant le scope depuis lequel l'appel s'effectue. Par exemple, si vous avez une expression de la forme $foo->$bar, alors le scope local sera examiné pour $bar et sa valeur sera utilisée comme nom pour la propriété de $foo. Ce comportement reste valide si $bar est un tableau.
Les accolades peuvent aussi être utilisées, pour clairement délimiter le nom de la propriété. Ceci est utile lors de l'accès à des valeurs d'une propriété qui contient un tableau, lorsque le nom de la propriété est composé de plusieurs parties, ou lorsque le nom de la propriété contient des caractères non valides (i.e. depuis la fonction json_decode() ou SimpleXML).
Exemple #1 Exemple de propriété variable
<?php
class foo {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1] . "\n";
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n";
$arr = 'arr';
echo $foo->$arr[1] . "\n";
echo $foo->{$arr}[1] . "\n";
?>
L'exemple ci-dessus va afficher :
Notez que les variables dynamiques ne peuvent pas être utilisées avec les tableaux Superglobaux dans une fonction ou une classe. La variable $this est aussi une variable spéciale qui ne peut être référencée dynamiquement.
Lorsqu'un formulaire est envoyé à un script PHP, toutes les variables du formulaire seront automatiquement disponibles dans le script. Par exemple, considérons le formulaire suivant :
Exemple #1 Exemple avec un formulaire simple
<form action="foo.php" method="post">
Nom : <input type="text" name="username" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="Envoie!" />
</form>
Suivant votre configuration particulière et vos préférences, vous avez plusieurs méthodes pour accéder aux variables du formulaires. Voici quelques exemples :
Exemple #2 Accéder simplement à des variables de formulaires POST
<?php
// Disponibles depuis PHP 4.1.0
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// Depuis PHP 5.0.0, ce type de variable peut être désactivé
// avec la directive de configuration register_long_arrays.
echo $HTTP_POST_VARS['username'];
// Disponibles si la directive register_globals = on. Depuis
// PHP 4.2.0 la valeur par défaut de cette directive est register_globals = off.
// Utiliser ou présumer cette méthode est découragé.
echo $username;
?>
Utiliser un formulaire de type GET est similaire, hormis le fait que vous deviez utiliser les variables pré-définies de GET à la place. GET s'applique aussi à la QUERY_STRING (les informations disponibles après le '?' dans une URL). De ce fait, par exemple, http://www.example.com/test.php?id=3 contient les données de GET, qui sont accessibles via $_GET['id']. Voyez aussi $_REQUEST et import_request_variables().
Note:
Les tableaux superglobaux, comme $_POST et $_GET sont disponibles depuis PHP 4.1.0.
Note:
Les points et les espaces dans les noms de variables sont convertis en underscores. Par exemple, <input name="a.b" /> deviendra $_REQUEST["a_b"].
Comme nous l'avons déjà dis, avant PHP 4.2.0, la valeur par défaut de register_globals était on. La communauté PHP n'encourage personne à utiliser cette directive et privilégie la valeur off et un code accordé.
Note:
La directive de configuration magic_quotes_gpc affecte les valeurs de GET, POST et cookies. Si elle est activée, une valeur comme celle de (C'est "PHP!") sera magiquement transformée en (C\'est \"PHP!\"). Il a été jugé que cette mesure était nécessaire pour échapper les caractères lors de l'insertion en base de données depuis dix ans mais cette fonction patrimoniale doit maintenant être désactivée. Voyez aussi les fonctions addslashes(), stripslashes() et magic_quotes_sybase.
PHP comprend aussi les tableaux dans le contexte des formulaires. (voir aussi la FAQ). Vous pouvez, par exemple, grouper des variables ensemble ou bien utiliser cette fonctionnalité pour lire des valeurs multiples d'un menu déroulant. Par exemple, voici un formulaire qui se poste lui-même des données, et les affiche :
Exemple #3 Variables de formulaires complexes
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Name: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Beer: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbräu</option>
</select><br />
<input type="submit" value="Validez moi !" />
</form>
Lors de la soumission d'un formulaire, il est possible d'utiliser une image au lieu d'un bouton standard, comme ceci :
<input type="image" src="image.gif" name="sub" />
Lorsque l'utilisateur clique sur cette image, le formulaire associé est envoyé au serveur, avec deux données supplémentaires, sub_x et sub_y. Elles contiennent les coordonnées du clic de l'utilisateur dans l'image. Vous noterez que ces variables sont envoyées par le navigateur avec un point dans leur nom, mais PHP convertit ces points en soulignés.
PHP supporte les cookies HTTP de manière totalement transparente, comme défini dans la » RFC 6265. Les cookies sont un mécanisme permettant de stocker des données sur la machine cliente à des fins d'identification de l'utilisateur. Vous pouvez établir un cookie grâce à la fonction setcookie(). Les cookies font partie intégrante des en-têtes HTTP et donc la fonction setcookie() doit être appelée avant que le moindre affichage ne soit envoyé au navigateur. C'est la même restriction que pour la fonction header(). Les données contenus dans les cookies sont alors disponibles dans les tableaux de cookies appropriés, comme $_COOKIE, $HTTP_COOKIE_VARS mais aussi $_REQUEST. Lisez la page de la documentation sur la fonction setcookie() pour plus de détails ainsi que des exemples.
Si vous souhaitez assigner plusieurs valeurs à un seul cookie, il devait l'assigner sous forme de tableau. Par exemple :
<?php
setcookie("MyCookie[foo]", 'Test 1', time()+3600);
setcookie("MyCookie[bar]", 'Test 2', time()+3600);
?>
Cela va créer deux cookies distincts bien que MyCookie est maintenant un simple tableau dans votre script. Si vous voulez définir seulement un cookie avec plusieurs valeurs, utilisez la fonction serialize() ou explode() sur la première valeur.
Il est à noter qu'un cookie remplace le cookie précédent par un cookie de même nom tant que le chemin ou le domaine sont identiques. Donc, pour une application de panier, vous devez implémenter un compteur et l'incrémenter au fur et à mesure. C'est-à-dire :
Exemple #4 Exemple avec setcookie()
<?php
if (isset($_COOKIE['compte'])) {
$compte = $_COOKIE['compte'] + 1;
} else {
$compte = 1;
}
setcookie('Panier', $compte, time()+3600);
setcookie("Panier[$compte]", $item, time()+3600);
?>
Typiquement, PHP ne modifie pas les noms des variables lorsqu'elles sont passées à un script. Cependant, il faut noter que les points (.) ne sont pas autorisés dans les noms de variables PHP. Pour cette raison, jetez un oeil sur :
<?php
$varname.ext; /* nom de variable invalide */
?>
Pour cette raison, il est important de noter que PHP remplacera automatiquement les points des noms de variables entrantes par des soulignés.
Parce que PHP détermine le type des variables et les convertit (généralement) comme il faut, ce n'est pas toujours le type de variable que vous souhaitez. PHP inclut des fonctions permettant de déterminer le type d'une variable : gettype(), is_array(), is_float(), is_int(), is_object() et is_string(). Lisez également le chapitre sur les types.
Une constante est un identifiant (un nom) qui représente une valeur simple. Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script (sauf les constantes magiques). Par défaut, le nom d'une constante est sensible à la casse. Par convention, les constantes sont toujours en majuscules.
Les noms de constantes suivent les mêmes règles que n'importe quel nom en PHP. Un nom de constante valide commence par une lettre ou un souligné, suivi d'un nombre quelconque de lettres, chiffres ou soulignés. Sous forme d'expression régulière, cela peut s'exprimer comme ceci : [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Exemple #1 Noms valides et invalides pour les constantes
<?php
// Noms valides
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");
// Noms invalides
define("2FOO", "something");
// Ce nom est valide, mais évitez-le:
// PHP peut un jour fournir une constante magique nommée
// ainsi, ce qui va corrompre vos scripts.
define("__FOO__", "something");
?>
Note: Dans cette documentation, une lettre peut être un des caractères suivants : de a à z, de A à Z et tous les caractères ASCII de 127 à 255 (0x7f-0xff).
Tout comme les superglobals, les constantes sont accessibles de manière globale. Vous pouvez les définir n'importe où, et y accéder depuis n'importe quelle fonction. Pour plus d'informations sur le contexte, lisez la section du manuel sur la portée des variables.
Vous pouvez définir une constante en utilisant la fonction define() ou en utilisant le mot-clé const en dehors d'une définition de classe à partir de PHP 5.3.0. Une fois qu'une constante est définie, elle ne peut jamais être modifiée, ou détruite.
Seuls les types de données scalaires peuvent être placés dans une constante : c'est à dire les types booléen, entier, double et chaîne de caractères (soit bool, entier, double et string.) Il est possible de définir des constantes en tant que resource, mais cet usage est déconseillé, car il peut mener à des résultats inattendus.
Vous pouvez accéder à la valeur d'une constante en spécifiant simplement son nom. Contrairement aux variables, vous ne devez PAS préfixer le nom de la constante avec $. Vous pouvez aussi utiliser la fonction constant(), pour lire dynamiquement la valeur d'une constante, dont vous obtenez le nom dynamiquement (retour de fonction, par exemple). Utilisez la fonction get_defined_constants() pour connaître la liste de toutes les constantes définies.
Note: Les constantes et les variables globales utilisent deux espaces de noms différents. Ce qui implique que
TRUEet $TRUE sont généralement différents (en tous cas, ils peuvent avoir des valeurs différentes).
Si vous utilisez une constante non définie, PHP considère que vous souhaitez uniquement le nom de la constante elle-même, comme si vous l'appeliez comme étant une chaîne de caractères (CONSTANT vs "CONSTANT"). Une alerte de type E_NOTICE sera émise lorsque ce cas se produit. Lisez également l'entrée du manuel qui explique pourquoi $foo[bar] est faux (tant que vous ne définissez pas bar comme étant une constante). Si vous voulez simplement vérifier qu'une constante est définie, utilisez la fonction defined().
Il y a des différences entre les constantes et les variables :
Exemple #1 Définir une constante
<?php
define("CONSTANTE", "Bonjour le monde.");
echo CONSTANTE; // affiche "Bonjour le monde."
echo Constante; // affiche "Constante" et une notice.
?>
Exemple #2 Définir des constantes en utilisant le mot-clé const
<?php
// Fonctionne depuis PHP 5.3.0.
const CONSTANT = 'Hello World';
echo CONSTANT;
?>
Note:
Contrairement aux constantes définies en utilisant l'instruction define(), les constantes définies en utilisant le mot-clé const doivent être déclarées au plus haut niveau du contexte, car elles seront définies au moment de la compilation. Cela signifie qu'elles ne peuvent être déclarées à l'intérieur de fonctions, boucles ou instructions if.
Voir aussi les constantes de classe.
PHP fournit un grand nombre de constantes magiques. Certaines constantes sont définies par différentes extensions, et ne seront présentes que si ces extensions sont compilées avec PHP, ou bien si l'extension a été chargée dynamiquement.
Il y a huit constantes magiques qui changent suivant l'emplacement où
elles sont utilisées.
Par exemple, la valeur de __LINE__ dépend
de la ligne où vous l'utilisez dans votre script.
Ces constantes spéciales sont insensibles à la casse.
| Nom | Description |
|---|---|
__LINE__ |
La ligne courante dans le fichier. |
__FILE__ |
Le chemin complet et le nom du fichier courant. Si utilisé pour une
inclusion, le nom du fichier inclus est retourné.
__FILE__ contient toujours le chemin absolu
pour les liens symboliques.
|
__DIR__ |
Le dossier du fichier. Si utilisé dans une inclusion, le dossier du fichier inclus sera retourné. C'est l'équivalent de dirname(__FILE__). Ce nom de dossier ne contiendra pas de slash final, sauf si c'est le dossier racine. (Ajouté en PHP 5.3.0.) |
__FUNCTION__ |
Le nom de la fonction. Cette constante retourne le nom de la fonction comme il a été déclaré (sensible à la casse). |
__CLASS__ |
Le nom de la classe courante. Cette constante retourne le nom de la classe comme il a été déclaré (sensible à la casse). Le nom de la classe contient l'espace de nom dans lequel cette classe a été déclarée (i.e. Foo\Bar). Notez que depuis PHP 5.4, __CLASS__ fonctionne aussi en Traits. Lorsqu'une méthode Trait est utilisée, __CLASS__ est le nom de la classe que Trait utilise en interne. |
__TRAIT__ |
Le nom Trait (Ajouté en PHP 5.4.0). Depuis PHP 5.4, cette constante retourne le Trait comme il a été déclaré (sensible à la casse). Le nom Trait inclut l'espace de nom dans lequel il a été déclaré (e.g. Foo\Bar). |
__METHOD__ |
Le nom de la méthode courante. Le nom de la méthode est retourné comme il a été déclaré (sensible à la casse). |
__NAMESPACE__ |
Le nom de l'espace de noms courant (sensible à la casse). Cette constante est définie au moment de la compilation (Ajouté en PHP 5.3.0). |
Voir aussi get_class(), get_object_vars(), file_exists() et function_exists().
Les expressions sont la partie la plus importante de PHP. En PHP, presque tout ce que vous écrivez est une expression. La manière la plus simple de définir une expression est : "tout ce qui a une valeur".
Les formes les plus simples d'expressions sont les constantes et les variables. Lorsque vous écrivez "$a = 5", vous assignez la valeur '5' à la variable $a. Bien évidemment, '5' vaut 5 ou, en d'autres termes, '5' est une expression avec pour valeur 5 (dans ce cas, '5' est un entier constant).
Après cette assignation, vous pouvez considérer que $a a pour valeur 5 et donc, écrire $b = $a, revient à écrire $b = 5. En d'autres termes, $a est une expression avec une valeur de 5. Si tout fonctionne correctement, c'est exactement ce qui arrive.
Un exemple plus complexe concerne les fonctions. Par exemple, considérons la fonction suivante :
<?php
function foo ()
{
return 5;
}
?>
En supposant que vous êtes familiers avec le concept de fonction, (si ce n'est pas le cas, jetez un oeil au chapitre concernant les fonctions), vous serez d'accord que $c = foo() est équivalent à $c = 5, et vous aurez tout à fait raison. Les fonctions sont des expressions qui ont la valeur de leur "valeur de retour". Si foo() renvoie 5, la valeur de l'expression 'foo()' est 5. Habituellement, les fonctions ne font pas que renvoyer une valeur constante mais réalisent des traitements.
Bien sûr, les valeurs en PHP n'ont pas à être des valeurs numériques, comme c'est souvent le cas. PHP supporte quatre types de variables scalaires : les valeurs entières (entier), les nombres à virgule flottante (float), les chaînes de caractères (chaîne de caractères) et les booléens (boolean). (une variable scalaire est une variable que vous ne pouvez pas scinder en morceaux, au contraire des tableaux par exemple). PHP supporte aussi deux types composés : les tableaux et les objets. Chacun de ces types de variables peut être affecté ou renvoyé par une fonction.
PHP va plus loin dans la gestion des expressions, comme le font d'autres langages. PHP est un langage orienté expression, dans le sens où presque tout est une expression. Considérons l'exemple dont nous avons déjà parlé, '$a = 5'. Il est facile de voir qu'il y a deux valeurs qui entrent en jeu ici, la valeur numérique constante '5' et la valeur de la variable $a qui est mise à jour à la valeur 5. Mais, la vérité est qu'il y a une autre valeur qui entre en jeu ici et c'est la valeur de l'assignation elle-même. L'assignation elle-même est assignée à une valeur, dans ce cas-là 5. En pratique, cela signifie que '$a = 5' est une expression qui a pour valeur 5. Donc, écrire '$b = ($a = 5)' revient à écrire '$a = 5; $b = 5;' (un point virgule marque la fin d'une instruction). Comme les assignations sont analysées de droite à gauche, vous pouvez aussi bien écrire '$b = $a = 5'.
Un autre bon exemple du langage orienté expression est la pre-incrémentation et la post-incrémentation, (ainsi que la décrémentation). Les utilisateurs de PHP et ceux de nombreux autres langages sont habitués à la notation "variable++" et "variable--". Ce sont les opérateurs d'incrémentation et de décrémentation. PHP ajoute les possibilités d'incrémentation et de décrémentation comme c'est le cas dans le langage C. En PHP, comme en C, il y a deux types d'opérateurs d'incrémentation (pre-incrémentation et post-incrémentation). Les deux types d'opérateur d'incrémentation jouent le même rôle (c'est-à-dire qu'ils incrémentent la variable). La différence vient de la valeur de l'opérateur d'incrémentation. L'opérateur de pre-incrémentation, qui s'écrit '++$variable', évalue la valeur incrémentée (PHP incrémente la variable avant de lire la valeur de cette variable, d'où le nom de pre-incrémentation). L'opérateur de post-incrémentation, qui s'écrit '$variable++', évalue la valeur de la variable avant de l'incrémenter (PHP incrémente la variable après avoir lu sa valeur, d'où le nom de post-incrémentation).
Un type d'expression très commun est l'expression de comparaison. Ces
expressions sont évaluées à 0 ou 1, autrement dit FALSE ou TRUE,
respectivement. PHP supporte les opérateurs de comparaison > (plus
grand que), => (plus grand ou égal), == (égal à), < (plus petit que),
<= (plus petit ou égal). Ces expressions sont
utilisées de manière courante dans les instructions conditionnelles, comme
l'instruction if.
Pour le dernier exemple d'expression, nous allons parler des combinaisons d'opérateurs/assignation. Vous savez que si vous voulez incrémenter la variable $a d'une unité, vous devez simplement écrire '$a++' ou '++$a'. Mais si vous voulez ajouter la valeur '3' à votre variable ? Vous pouvez écrire plusieurs fois '$a++', mais ce n'est pas la meilleure des méthodes. Un pratique plus courante est d'écrire '$a = $a + 3'. L'expression '$a + 3' correspond à la valeur $a plus 3, et est de nouveau assignée à la variable $a. Donc, le résultat est l'incrémentation de 3 unités de la variable $a. En PHP, comme dans de nombreux autres langages comme le C, vous pouvez écrire cela de manière plus concise, manière qui avec le temps se révélera plus claire et plus rapide à comprendre. Ajouter 3 à la valeur de la variable $a peut s'écrire '$a += 3'. Cela signifie précisément : "on prend la valeur de la variable $a, on ajoute la valeur 3 et on assigne cette valeur à la variable $a". Et pour être plus concis et plus clair, cette expression est plus rapide. La valeur de l'expression '$a += 3', comme l'assignation d'une valeur quelconque, est la valeur assignée. Il est à noter que ce n'est pas 3 mais la combinaison de la valeur de la variable $a plus la valeur 3. (c'est la valeur qui est assignée à la variable $a). N'importe quel opérateur binaire peut utiliser ce type d'assignation, par exemple '$a -= 5' (soustraction de 5 de la valeur de la variable $a), '$b *= 7' (multiplication de la valeur de la variable $b par 7).
Il y a une autre expression qui peut paraître complexe si vous ne l'avez pas vue dans d'autres langages, l'opérateur conditionnel ternaire :
<?php
$first ? $second : $third
?>
Si la valeur de la première sous-expression est vraie (TRUE)
(différente de 0), alors la deuxième sous-expression est
évaluée et constitue le résultat de l'expression
conditionnelle. Sinon, c'est la troisième sous-expression qui est
évaluée et qui constitue le résultat de l'expression.
Les exemples suivants devraient vous permettre de mieux comprendre la pre-incrémentation, la post-incrémentation et le concept des expressions en général :
<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* Assigne la valeur 5 aux variables $a et $b */
$c = $a++; /* Post-incrémentation de la variable $a et assignation de
la valeur à la variable $c */
$e = $d = ++$b; /* Pre-incrémentation, et assignation de la valeur aux
variables $d et $e */
/* à ce niveau, les variables $d et $e sont égales à 6 */
$f = double($d++); /* assignation du double de la valeur de $d à la variable $f ($f vaut 12),
puis incrémentation de la valeur de $d */
$g = double(++$e); /* assigne deux fois la valeur de $e après
incrémentation, 2*7 = 14 to $g */
$h = $g += 10; /* Tout d'abord, $g est incrémentée de 10, et donc $g vaut 24.
Ensuite, la valeur de $g, (24) est assignée à la variable $h,
qui vaut donc elle aussi 24. */
?>
Au début de ce chapitre, nous avons dit que nous allions décrire les différents types d'instructions, et donc, comme promis, nous allons voir que les expressions peuvent être des instructions. Mais attention, toutes les expressions ne sont pas des instructions. Dans ce cas-là, une instruction est de la forme 'expr ;', c'est-à-dire, une expression suivie par un point-virgule. L'expression '$b = $a = 5;', '$a = 5' est valide, mais ce n'est pas une instruction en elle-même. '$b = $a = 5;' est une instruction valide.
La dernière chose qui mérite d'être mentionnée est
la véritable valeur des expressions. Lorsque vous faites des tests
sur une variable, dans une boucle conditionnelle par exemple, cela ne vous
intéresse pas de savoir quelle est la valeur exacte de l'expression.
Mais vous voulez seulement savoir si le résultat signifie TRUE ou FALSE
Les constantes TRUE et FALSE (insensible à la casse) sont les deux
valeurs possibles pour un booléen. Lorsque nécessaire, une expression
est automatiquement convertie en booléen. Lisez la
section sur le transtypage
pour plus de détails.
PHP propose une implémentation complète et détaillée des expressions. PHP documente toutes ses expressions dans le manuel que vous êtes en train de lire. Les exemples qui vont suivre devraient vous donner une bonne idée de ce qu'est une expression et comment construire vos propres expressions. Dans tout ce qui va suivre, nous écrirons expr pour indiquer toute expression PHP valide.
Un opérateur est quelque chose qui prend une ou plusieurs valeurs (ou expressions, dans le jargon de la programmation) et qui retourne une autre valeur (donc la construction elle-même devient une expression).
Les opérateurs peuvent être regroupés en fonction du nombre de valeurs qu'ils acceptent. L'opérateur unaire n'opère que sur une seule valeur, par exemple ! (l'opérateur de négation) ou ++ (l'opérateur d'incrémentation). Le second type, les opérateurs binaires (comme le très célèbre opérateur mathématique + ou -) contient la plupart des opérateurs supportés par PHP. Enfin, l'opérateur ternaire, ? :, qui accepte trois valeurs (on peut aussi l'appeler l'opérateur conditionnel).
Une liste complète des opérateurs se trouve dans la section précédence des opérateurs. Cette section explique aussi la précédence des opérateurs et l'associativité, c'est à dire les priorités d'exécution des opérateurs.
La priorité des opérateurs spécifie l'ordre dans lequel les valeurs doivent être analysées. Par exemple, dans l'expression 1 + 5 * 3, le résultat est 16 et non 18, car la multiplication ("*") a une priorité supérieure par rapport à l'addition ("+"). Des parenthèses peuvent être utilisées pour forcer la priorité, si nécessaire. Par exemple : (1 + 5) * 3 donnera 18.
Lorsque les opérateurs ont une précédence équivalente, c'est leur associativité qui détermine s'ils sont évalués de droite à gauche ou inversement. Voyez les exemples ci-après.
Le tableau qui suit liste les opérateurs par ordre de précédence, avec la précédence la plus élevée en haut. Les opérateurs sur la même ligne ont une précédence équivalente (donc l'associativité décide de l'ordre de leur évaluation).
| Associativité | Opérateurs | Information additionnelle |
|---|---|---|
| non-associative | clone new | clone et new |
| gauche | [ | array() |
| droite | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | types et incrément/décrément |
| non-associatif | instanceof | types |
| droite | ! | logique |
| gauche | * / % | arithmétique |
| gauche | + - . | arithmétique et chaîne de caractères |
| gauche | << >> | bitwise |
| non-associatif | < <= > >= <> | comparaison |
| non-associatif | == != === !== | comparaison |
| gauche | & | bitwise et références |
| gauche | ^ | bitwise |
| gauche | | | bitwise |
| gauche | && | logique |
| gauche | || | logique |
| gauche | ? : | ternaire |
| droite | = += -= *= /= .= %= &= |= ^= <<= >>= => | affectation |
| gauche | and | logique |
| gauche | xor | logique |
| gauche | or | logique |
| gauche | , | plusieurs utilisations |
Pour les opérateurs à précédence égale, l'associativité de gauche signifie que
l'expression est évaluée de gauche à droite, l'associativité de droite, l'inverse.
Pour les opérateurs dont la précédence est égale mais qui ne sont pas associatifs,
ils ne peuvent pas être associés avec eux-mêmes. Aussi, par exemple,
la structure 1 < 2 > 1, est illégale en PHP.
Alors que la structure 1 <= 1 == 1 est légale, car l'opérateur
T_IS_EQUAL a une précédence inférieure à l'opérateur
T_IS_SMALLER_OR_EQUAL.
Exemple #1 Associativité
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
// Le fait de mélanger ++ et + produit un comportement indéfini
$a = 1;
echo ++$a + $a++; // peut afficher 4 ou 5
?>
Note:
Bien que = soit prioritaire sur la plupart des opérateurs, PHP va tout de même exécuter des expressions comme : if (!$a = foo()). Dans cette situation, le résultat de foo() sera placé dans la variable $a.
Vous rappelez-vous des opérations élémentaires apprises à l'école ? Les opérateurs arithmétiques fonctionnent comme elles.
| Exemple | Nom | Résultat |
|---|---|---|
| -$a | Négation | Opposé de $a. |
| $a + $b | Addition | Somme de $a et $b. |
| $a - $b | Soustraction | Différence de $a et $b. |
| $a * $b | Multiplication | Produit de $a et $b. |
| $a / $b | Division | Quotient de $a et $b. |
| $a % $b | Modulo | Reste de $a divisé par $b. |
L'opérateur de division ("/") retourne une valeur à virgule flottante sauf si les 2 opérandes sont des entiers (ou une chaîne de caractères qui a été convertie en entiers) et cette valeur est toujours divisible, auquel cas une valeur entière sera retournée.
Les opérandes du modulo sont converties en entiers (en supprimant la partie décimale) avant exécution.
Le résultat de l'opération modulo % a le même signe que le premier opérande, ansi le résultat de $a % $b aura le signe de $a. Par exemple:
<?php
echo (5 % 3)."\n"; // affiche 2
echo (5 % -3)."\n"; // affiche 2
echo (-5 % 3)."\n"; // affiche -2
echo (-5 % -3)."\n"; // affiche -2
?>
Voir aussi le manuel sur les fonctions mathématiques.
L'opérateur d'affectation le plus simple est le signe "=". Le premier réflexe est de penser que ce signe veut dire "égal à". Ce n'est pas le cas. Il signifie que l'opérande de gauche se voit affecter la valeur de l'expression qui est à droite du signe égal.
La valeur d'une expression d'affectation est la valeur affectée. Par exemple, la valeur de l'expression '$a = 3' est la valeur 3. Cela permet d'utiliser des astuces telles que :
<?php
$a = ($b = 4) + 5;
// $a est maintenant égal à 9, et $b vaut 4.
?>
Pour les arrays, affecter une valeur à une clé donnée est effectué au moyen de l'opérateur "=>". La précédence de cet opérateur est la même que celle des opérateurs d'affectation.
En plus du simple opérateur d'affectation, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques, l'union de tableaux et pour les opérateurs sur les chaînes de caractères. Cela permet d'utiliser la valeur d'une variable dans une expression et d'affecter le résultat de cette expression à cette variable. Par exemple :
<?php
$a = 3;
$a += 5; // affecte la valeur 8 à la variable $a correspond à l'instruction '$a = $a + 5';
$b = "Bonjour ";
$b .= " tout le monde!"; // affecte la valeur "Bonjour tout le monde!" à
// la variable $b
// identique à $b = $b." tout le monde!";
?>
On peut noter que l'affectation copie le contenu de la variable originale dans la nouvelle variable (affectation par valeur), ce qui fait que les changements de valeur d'une variable ne modifieront pas la valeur de l'autre. Cela peut se révéler important lors de la copie d'un grand tableau durant une boucle.
Une exception au comportement d'affectation par valeur en PHP est le type object, ceux-ci sont affectés par référence dans PHP 5. La copie d'objet doit être explicitement demandée grâce au mot-clé clone.
L'affectation par référence est aussi supportée, au moyen de la syntaxe "$var = &$othervar;". L'affectation par référence signifie que les deux variables pointent vers le même conteneur de donnée, rien n'est copié nulle part.
Exemple #1 Affectation par référence
<?php
$a = 3;
$b = &$a; // $b est une référence à $a
print "$a\n"; // affiche 3
print "$b\n"; // affiche 3
$a = 4; // change $a
print "$a\n"; // affiche 4
print "$b\n"; // affiche 4 aussi, car $b est une référence à $a, qui a été
// changée
?>
Depuis PHP 5, l'opérateur new
retourne une référence automatiquement, donc affecter le résultat de
new par référence retournera une
erreur E_DEPRECATED depuis PHP 5.3, et une erreur de niveau
E_STRICT avant PHP 5.3.
Par exemple, ce code génère un message d'erreur:
<?php
class C {}
/* La ligne suivante génère une erreur dont le message est:
* Deprecated: Assigning the return value of new by reference is deprecated in...
*/
$o = &new C;
?>
Plus d'informations sur le références et leurs utilisations possibles peuvent être trouvées dans la section du manuel Les références expliquées.
Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier.
| Exemple | Nom | Résultat |
|---|---|---|
$a & $b |
And (Et) | Les bits positionnés à 1 dans $a ET dans $b sont positionnés à 1. |
$a | $b |
Or (Ou) | Les bits positionnés à 1 dans $a OU $b sont positionnés à 1. |
$a ^ $b |
Xor (ou exclusif) | Les bits positionnés à 1 dans $a OU dans $b mais pas dans les deux sont positionnés à 1. |
~ $a |
Not (Non) | Les bits qui sont positionnés à 1 dans $a sont positionnés à 0, et vice-versa. |
$a << $b |
Décalage à gauche | Décale les bits de $a, $b fois sur la gauche (chaque décalage équivaut à une multiplication par 2). |
$a >> $b |
Décalage à droite | Décalage les bits de $a, $b fois par la droite (chaque décalage équivaut à une division par 2). |
Le décalage de bits en PHP est arithmétique. Les bits qui sont décalés hors de l'entier sont perdus. Les décalages à gauche font apparaître des zéros à droite, tandis que le bit de signe est décalé à gauche, ce qui signifie que le signe de l'entier n'est pas préservé. Les décalages à droite décalent aussi le bit de signe sur la droite, ce qui signifie que le signe est préservé.
Utilisez des parenthèses pour vous assurer que la précédence voulue est bien appliquée. Par exemple, $a & $b == true applique d'abord l'égalité, et ensuite le ET logique, alors que ($a & $b) == true applique d'abord le ET logique, puis l'égalité.
Prenez garde aux transtypages. Si les deux paramètres, de chaque coté de l'opérateur, sont des chaînes, l'opérateur de bit va opérer sur les valeurs ASCII des chaînes.
Le rapport d'erreur de PHP utilise des champs de bits,
qui sont une illustration de l'extinction des bits.
Pour afficher les erreurs, sauf les notices, les
instructions du php.ini sont :
E_ALL & ~E_NOTICE
Cela se comprend en comparant avec E_ALL :
00000000000000000111011111111111
Puis en éteignant la valeur de E_NOTICE...
00000000000000000000000000001000
... et en l'inversant via ~:
11111111111111111111111111110111
Finalement, on utilise le ET logique (&) pour lire les bits activés
dans les deux valeurs :
00000000000000000111011111110111
Un autre moyen d'arriver à ce résultat est d'utiliser
le OU exclusif (^), qui cherche
les bits qui ne sont activés que dans l'une ou l'autre des
valeurs, exclusivement :
E_ALL ^ E_NOTICE
error_reporting peut aussi être utilisé pour
illustrer l'activation de bits. Pour afficher
uniquement les erreurs et les erreurs recouvrables,
on utilise :
E_ERROR | E_RECOVERABLE_ERROR
Cette approche combine E_ERROR
00000000000000000000000000000001
et E_RECOVERABLE_ERROR
00000000000000000001000000000000
Avec l'opérateur OR (|) pour s'assurer que
les bits sont activés dans l'une ou l'autre valeur :
00000000000000000001000000000001
Exemple #1 Opérations sur les bits et les entiers
<?php
/*
* Ignorez cette partie,
* c'est juste du formatage pour clarifier les résultats
*/
$format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)'
. ' %3$s (%4$2d = %4$04b)' . "\n";
echo <<<EOH
--------- --------- -- ---------
resultat valeur test
--------- --------- -- ---------
EOH;
/*
* Voici les exemples
*/
$values = array(0, 1, 2, 4, 8);
$test = 1 + 4;
echo "\n Bitwise AND \n";
foreach ($values as $value) {
$result = $value & $test;
printf($format, $result, $value, '&', $test);
}
echo "\n Bitwise Inclusive OR \n";
foreach ($values as $value) {
$result = $value | $test;
printf($format, $result, $value, '|', $test);
}
echo "\n Bitwise Exclusive OR (XOR) \n";
foreach ($values as $value) {
$result = $value ^ $test;
printf($format, $result, $value, '^', $test);
}
?>
L'exemple ci-dessus va afficher :
--------- --------- -- --------- resultat valeur test --------- --------- -- --------- Bitwise AND ( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101) ( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101) ( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101) ( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101) ( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101) Bitwise Inclusive OR ( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101) ( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101) ( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101) (13 = 1101) = ( 8 = 1000) | ( 5 = 0101) Bitwise Exclusive OR (XOR) ( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101) ( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101) ( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101) ( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101) (13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
Exemple #2 Opération sur les bits et les chaînes
<?php
echo 12 ^ 9; // Affiche '5'
echo "12" ^ "9"; // Affiche le caractère d'effacement (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Affiche les valeurs ASCII #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
echo 2 ^ "3"; // Affiche 1
// 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Affiche 1
// ((int)"2") ^ 3 == 1
?>
Exemple #3 Décalage de bits sur les entiers
<?php
/*
* Voici quelques exemples
*/
echo "\n--- Décalages à droite sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = 4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places);
$val = 4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = 4;
$places = 4;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de 0');
echo "\n--- Décalages à droite sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val >> $places;
p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche');
$val = -4;
$places = 2;
$res = $val >> $places;
p($res, $val, '>>', $places, 'des bits sont sortis par la droite');
$val = -4;
$places = 3;
$res = $val >> $places;
p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de -1');
echo "\n--- Décalages à gauche sur des entiers positifs ---\n";
$val = 4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 4;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = 4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places, 'le bit de signe est sorti');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche');
echo "\n--- Décalages à gauche sur des entiers négatifs ---\n";
$val = -4;
$places = 1;
$res = $val << $places;
p($res, $val, '<<', $places, 'complément de zéros à droite');
$val = -4;
$places = (PHP_INT_SIZE * 8) - 3;
$res = $val << $places;
p($res, $val, '<<', $places);
$val = -4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'des bits sont sortis à gauche, y compris le bit de signe');
/*
* Ignorez cette section
* Elle contient du code pour le formatage de cet exemple
*/
function p($res, $val, $op, $places, $note = '') {
$format = '%0' . (PHP_INT_SIZE * 8) . "b\n";
printf("Expression : %d = %d %s %d\n", $res, $val, $op, $places);
echo " Décimal :\n";
printf(" val=%d\n", $val);
printf(" res=%d\n", $res);
echo " Binaire :\n";
printf(' val=' . $format, $val);
printf(' res=' . $format, $res);
if ($note) {
echo " Note : $note\n";
}
echo "\n";
}
?>
Résultat de l'exemple ci-dessus sur une machine 32 bits :
--- Décalages à droite sur des entiers positifs --- Expression : 2 = 4 >> 1 Décimal : val=4 res=2 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111110 Note : copie du bit de signe à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalages à gauche sur des entiers positifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000001000 Note : complément de zéros à droite Expression : 1073741824 = 4 << 28 Décimal : val=4 res=1073741824 Binaire : val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression : -2147483648 = 4 << 29 Décimal : val=4 res=-2147483648 Binaire : val=00000000000000000000000000000100 res=10000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 30 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalages à gauche sur des entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111000 Note : complément de zéros à droite Expression : -2147483648 = -4 << 29 Décimal : val=-4 res=-2147483648 Binaire : val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression : 0 = -4 << 30 Décimal : val=-4 res=0 Binaire : val=11111111111111111111111111111100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe
Résultat de l'exemple ci-dessus sur une machine 64 bits :
--- Décalages à droite sur des entiers positifs --- Expression : 2 = 4 >> 1 Décimal : val=4 res=2 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 Note : copie du bit de signe maintenant à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalage à gauche sur les entiers négatifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 Note : complément de zéros à droite Expression : 4611686018427387904 = 4 << 60 Décimal : val=4 res=4611686018427387904 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression : -9223372036854775808 = 4 << 61 Décimal : val=4 res=-9223372036854775808 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 62 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalage à gauche sur les entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 Note : complément de zéros à droite Expression : -9223372036854775808 = -4 << 61 Décimal : val=-4 res=-9223372036854775808 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression : 0 = -4 << 62 Décimal : val=-4 res=0 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe
N'effectuez pas de décalage à droite de plus de 32 bits sur les systèmes 32 bits. N'effectuez pas de décalage à gauche dans le cas où le résultat est un nombre plus long que 32 bits. Utilisez les fonctions de l'extension gmp pour les manipulations sur les bits, lorsque les entiers dépassent PHP_INT_MAX.
Voyez aussi pack(), unpack(), gmp_and(), gmp_or(), gmp_xor(), gmp_testbit(), gmp_clrbit()
Les opérateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs. Vous devriez également être intéressés par les tables de comparaisons de types, car ils montrent des exemples de beaucoup de types de comparaisons.
| Exemple | Nom | Résultat |
|---|---|---|
| $a == $b | Egal | TRUE si $a est égal à
$b après le transtypage. |
| $a === $b | Identique |
TRUE si $a est égal à $b et
qu'ils sont de même type.
|
| $a != $b | Différent | TRUE si $a est différent de
$b après le transtypage. |
| $a <> $b | Différent | TRUE si $a est différent de
$b après le transtypage. |
| $a !== $b | Différent |
TRUE si $a est différent de $b
ou bien s'ils ne sont pas du même type.
|
| $a < $b | Plus petit que | TRUE si $a est strictement plus petit que
$b. |
| $a > $b | Plus grand | TRUE si $a est strictement plus grand que
$b. |
| $a <= $b | Inférieur ou égal | TRUE si $a est plus petit ou égal à
$b. |
| $a >= $b | Supérieur ou égal | TRUE si $a est plus grand ou égal à
$b. |
Si vous comparez un nombre avec une chaîne ou bien que la comparaison implique des chaînes numériques, alors chaque chaîne sera convertie en un nombre et la comparaison sera effectuée numériquement. Ces règles s'appliquent également à l'instruction switch. La comparaison de type n'a pas de place lorsque la comparaison est === ou !== vu que ceci engendre aussi bien une comparaison de type que de valeur.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // jamais évalué parce que "a" est déjà trouvé avec 0
echo "a";
break;
}
?>
Pour les différents types, la comparaison est faite en suivant la table suivante (dans l'ordre).
| Type de l'opérande 1 | Type de l'opérande 2 | Résultat |
|---|---|---|
| null ou chaîne de caractères | string | Convertit NULL en "", comparaison numérique ou lexicale |
| booléen ou null | N'importe quoi | Convertit en booléen, FALSE < TRUE |
| objet | objet | Les classes internes peuvent définir leur propre méthode de comparaison; différentes classes ne sont pas comparables; entre objets de même classe, PHP a son propre comportement |
| chaîne de caractères, ressource ou nombre | chaîne de caractères, ressource ou nombre | Transforme les chaînes de caractères et les ressources en nombres |
| tableaux | tableaux | Le tableau avec le moins de membres est plus petit, si la clé de l'opérande 1 n'est pas trouvée dans l'opérande 2, alors les tableaux ne sont pas comparables, sinon la comparaison se fait valeur par valeur (voir l'exemple suivant) |
| object | N'importe quoi | L'objet est toujours plus grand |
| array | N'importe quoi | Le tableau est toujours plus grand |
Exemple #1 Transcription des comparaisons standards des tableaux
<?php
// Les tableaux sont comparés comme ceci avec les opérateurs standards de comparaison
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // incomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Voir aussi strcasecmp(), strcmp() les opérateurs de tableaux, et le chapitre sur les types.
A cause de la façon dont les nombres à virgule flottante sont représentés en interne, vous ne devriez pas tester l'égalité entre deux nombres de type float.
Voyez la documentation de float pour plus d'informations.
Un autre opérateur conditionnel est l'opérateur ternaire (":?").
Exemple #2 Affectation d'une valeur par défaut
<?php
// Exemple d'utilisation pour l'opérateur ternaire
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// La ligne ci-dessus est identique à la condition suivante :
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
TRUE, et
expr3 si
expr1 est évaluée à FALSE.
Depuis PHP 5.3, il est possible d'omettre la partie centrale de l'opérateur
ternaire. L'expression expr1 ?: expr3 retourne
expr1 si expr1
vaut TRUE, et expr3 sinon.
Note: Notez que l'opérateur ternaire est une instruction, et il n'est pas évalué en tant que variable, mais en tant que résultat de l'instruction. Il est important de savoir si vous voulez retourner une variable par référence. L'instruction return $var == 42 ? $a : $b; dans une fonction retournée par référence ne fonctionnera donc pas et une alerte est émise.
Note:
Il est recommandé de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident :
Exemple #3 Comportement de PHP
<?php
// A première vue, ce qui suit devrait retourner 'true'
echo (true?'true':false?'t':'f');
// cependant, l'expression ci-dessus retournera 't'
// car l'expression ternaire est évaluée de gauche à droite
// l'expression suivante est une version plus évidente du même code
echo ((true ? 'true' : false) ? 't' : 'f');
// ici, vous pouvez voir que la première expression est évaluée à 'true',
// ce qui fait qu'elle est évaluée à (bool)true, ce qui retourne la branche
// 'vraie' de la seconde expression ternaire.
?>
PHP supporte un opérateur de contrôle d'erreur : c'est @. Lorsque cet opérateur est ajouté en préfixe d'une expression PHP, les messages d'erreur qui peuvent être générés par cette expression seront ignorés.
Si vous avez défini un gestionnaire d'erreurs personnalisé avec la fonction set_error_handler(), alors il sera toujours appelé, mais ce gestionnaire d'erreurs peut (et doit) appeler la fonction error_reporting() qui devra retourner 0 lorsque l'appel qui a émis l'erreur était précédé d'un @.
Si l'option track_errors est activée, les messages d'erreurs générés par une expression seront sauvés dans la variable globale $php_errormsg. Cette variable sera écrasée à chaque erreur. Il faut alors la surveiller souvent pour pouvoir l'utiliser.
<?php
/* Erreur intentionnelle (le fichier n'existe pas): */
$mon_fichier = @file ('non_persistent_file') or
die ("Impossible d'ouvrir le fichier : L'erreur est : '$php_errormsg'");
// Cela fonctionne avec n'importe quelle expression, pas seulement les fonctions
$value = @$cache[$key];
// la ligne ci-dessus n'affichera pas d'alerte si la clé $key du tableau n'existe pas
?>
Note: L'opérateur @ ne fonctionne qu'avec les expressions. La règle générale de fonctionnement est la suivante : si vous pouvez prendre la valeur de quelque chose, vous pouvez le préfixer avec @. Par exemple, vous pouvez ajouter @ aux variables, fonctions, à include, aux constantes, etc. Vous ne pourrez pas le faire avec des éléments de langage tels que les classes, if et foreach, etc.
Voir aussi error_reporting() et la section sur la gestion d'erreurs.
En fait, l'opérateur "@" va aussi désactiver les rapports d'erreurs critiques, qui stoppent l'exécution du script. Entre autres, si vous utilisez "@" pour supprimer les erreurs de certaines fonctions, et que cette fonction n'existe pas, ou qu'elle a été mal orthographiée, vous n'aurez aucune indication.
PHP supporte un opérateur d'exécution : guillemets obliques ("``"). Notez bien qu'il ne s'agit pas de guillemets simples. PHP essaie d'exécuter le contenu de ces guillemets obliques comme une commande shell. Le résultat sera retourné (i.e. : il ne sera pas simplement envoyé à la sortie standard, il peut être affecté à une variable). Utilisez les guillemets obliques revient à utiliser la fonction shell_exec().
Exemple #1 Opérateur d'exécution
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
Note:
Cet opérateur est désactivé lorsque le safe mode est activé ou bien que la fonction shell_exec() est désactivée.
Note:
Contrairement à d'autres langages, les guillemets obliques ne peuvent pas être utilisés dans une chaîne entourée de guillemets doubles.
Voir aussi le manuel à la section sur les fonctions d'exécution système, popen(), proc_open() et l'utilisation de PHP en ligne de commande.
PHP supporte les opérateurs de pre- et post-incrémentation et décrémentation, comme en langage C.
Note: Les opérateurs d'incrémentation/décrémentation n'affectent pas les valeurs booléennes. La décrémentation des valeurs
NULLn'a également aucun effet, mais leur incrémentation donnera comme résultat 1.
| Exemple | Nom | Résultat |
|---|---|---|
| ++$a | Pre-incrémente | Incrémente $a de 1, puis retourne $a. |
| $a++ | Post-incrémente | Retourne $a, puis incrémente $a de 1. |
| --$a | Pré-décrémente | Décrémente $a de 1, puis retourne $a. |
| $a-- | Post-décrémente | Retourne $a, puis décrémente $a de 1. |
Voici un exemple simple :
<?php
echo '<h3>Post-incrémentation</h3>';
$a = 5;
echo "Devrait valoir 5: " . $a++ . "<br />\n";
echo "Devrait valoir 6: " . $a . "<br />\n";
echo '<h3>Pre-incrémentation</h3>';
$a = 5;
echo "Devrait valoir 6: " . ++$a . "<br />\n";
echo "Devrait valoir 6: " . $a . "<br />\n";
echo '<h3>Post-décrémentation</h3>';
$a = 5;
echo "Devrait valoir 5: " . $a-- . "<br />\n";
echo "Devrait valoir 4: " . $a . "<br />\n";
echo '<h3>Pre-décrémentation</h3>';
$a = 5;
echo "Devrait valoir 4: " . --$a . "<br />\n";
echo "Devrait valoir 4: " . $a . "<br />\n";
?>
PHP suit les conventions de Perl pour la gestion des opérateurs arithmétiques sur les variables de caractères et non pas celle du C. Par exemple, en PHP et en Perl, $a = 'Z'; $a++; transforme $a en 'AA', alors qu'en C, a = 'Z'; a++; transforme a en '[' (la valeur ASCII de 'Z' est 90, la valeur ASCII de '[' est 91). Notez que les variables de caractères peuvent être incrémentées mais pas décrémentées, mais aussi que seuls les caractères ASCII pleins (a-z et A-Z) sont supportés. L'incrémentation/décrémentation d'autres variables de caractères n'a aucun effet, la chaîne originale n'est pas modifiée.
Exemple #1 Opérations arithmétiques sur un caractère
<?php
$i = 'W';
for($n=0; $n<6; $n++) {
echo ++$i . "\n";
}
?>
L'exemple ci-dessus va afficher :
X Y Z AA AB AC
L'incrémentation ou la décrémentation d'un booléen n'a aucun effet.
| Exemple | Nom | Résultat |
|---|---|---|
| $a and $b | And (Et) | TRUE si $a ET $b valent TRUE. |
| $a or $b | Or (Ou) | TRUE si $a OU $b valent TRUE. |
| $a xor $b | XOR |
TRUE si $a OU $b est TRUE,
mais pas les deux en même temps.
|
| ! $a | Not (Non) | TRUE si $a n'est pas TRUE. |
| $a && $b | And (Et) | TRUE si $a ET $b sont TRUE. |
| $a || $b | Or (Ou) | TRUE si $a OU $b est TRUE. |
La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes. Voir le paragraphe précédence d'opérateurs.
Exemple #1 Illustration des opérateurs logiques
<?php
// --------------------
// foo() ne sera jamais appelée car ces opérateurs s'annulent
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
// --------------------
// "||" a un précédence supérieure à "or"
// Le résultat de l'expression (false || true) est affecté à $e
// Agit comme : ($e = (false || true))
$e = false || true;
// La constante false est affectée à $f, puis, true est ignoré
// Agit comme : (($f = false) or true)
$f = false or true;
var_dump($e, $f);
// --------------------
// "&&" a un précédence supérieure à "and"
// Le résultat de l'expression (true && false) est affecté à $g
// Agit comme : ($g = (true && false))
$g = true && false;
// La constante true est affectée à $h, puis, false est ignoré
// Agit comme : (($h = true) and false)
$h = true and false;
var_dump($g, $h);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
bool(true) bool(false) bool(false) bool(true)
Il y a deux opérateurs de chaînes de caractères string. Le premier est l'opérateur de concaténation ('.'), qui retourne la concaténation de ses deux arguments. Le second est l'opérateur d'affectation concaténant (.=). Reportez-vous à opérateurs d'affectation pour plus de détails.
Exemple #1 Opérateur de concaténation
<?php
$a = "Bonjour ";
$b = $a . "Monde !"; // $b contient "Bonjour Monde !"
$a = "Bonjour ";
$a = $a . "Monde !"; // $a contient "Bonjour Monde !"
?>
Voir aussi les sections du manuel sur les types de chaînes de caractères et les chaînes de caractères.
| Exemple | Nom | Résultat |
|---|---|---|
| $a + $b | Union | Union de $a et $b. |
| $a == $b | Egalité | TRUE si $a et $b contiennent les mêmes paires clés/valeurs. |
| $a === $b | Identique | TRUE si $a et $b contiennent les mêmes paires clés/valeurs dans le même ordre et du même type. |
| $a != $b | Inégalité | TRUE si $a n'est pas égal à $b. |
| $a <> $b | Inégalité | TRUE si $a n'est pas égal à $b. |
| $a !== $b | Non-identique | TRUE si $a n'est pas identique à $b. |
L'opérateur + retourne le tableau de gauche auquel sont ajoutés les éléments du tableau de droite. Pour les clés présentes dans les 2 tableaux, les éléments du tableau de gauche seront utilisés alors que les éléments correspondants dans le tableau de droite seront ignorés.
<?php
$a = array("a" => "pomme", "b" => "banane");
$b = array("a" =>"poire", "b" => "fraise", "c" => "cerise");
$c = $a + $b; // Union de $a et $b
echo "Union de \$a et \$b : \n";
var_dump($c);
$c = $b + $a; // Union de $b et $a
echo "Union de \$b et \$a : \n";
var_dump($c);
?>
Union de $a et $b :
array(3) {
["a"]=>
string(5) "pomme"
["b"]=>
string(6) "banane"
["c"]=>
string(6) "cerise"
}
Union de $b et $a :
array(3) {
["a"]=>
string(5) "poire"
["b"]=>
string(6) "fraise"
["c"]=>
string(6) "cerise"
}
Les éléments d'un tableau sont égaux en terme de comparaison s'ils ont la même clé et la même valeur.
Exemple #1 Comparer des tableaux
<?php
$a = array("pomme", "banane");
$b = array(1 => "banane", "0" => "pomme");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>
Voyez aussi le manuel aux sections Tableaux et fonctions de tableaux.
instanceof est utilisé pour déterminer si une variable PHP est un objet instancié d'une certaine classe :
Exemple #1 Utilisation de instanceof avec des classes
<?php
class MaClasse
{
}
class PasMaClasse
{
}
$a = new MaClasse;
var_dump($a instanceof MaClasse);
var_dump($a instanceof PasMaClasse);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
instanceof peut également être utilisé pour déterminer si une variable est un objet instancié d'une classe qui hérite d'une classe parente :
Exemple #2 Utilisation de instanceof avec des classes héritées
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true)
Pour vérifier si un objet n'est pas une instance d'une classe, l'opérateur logique not peut être utilisé.
Exemple #3 Utilisation de instanceof pour vérifier que l'objet n'est pas une instance de la classe
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
L'exemple ci-dessus va afficher :
bool(true)
Et finalement, instanceof peut être utilisé pour déterminer si une variable est un objet instancié d'une classe qui implémente une interface :
Exemple #4 Utilisation de instanceof pour une interface
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true)
Bien que instanceof soit habituellement utilisé avec un nom de classe littéral, il peut également être utilisé avec un autre objet ou une chaîne représentant une variable :
Exemple #5 Utilisation de instanceof avec d'autres variables
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b est un objet de la classe MyClass
var_dump($a instanceof $c); // $c est une chaîne 'MyClass'
var_dump($a instanceof $d); // $d est une chaîne 'NotMyClass'
?>
L'exemple ci-dessus va afficher :
bool(true) bool(true) bool(false)
instanceof ne lance aucune erreur si la variable testée n'est pas
un objet, il retournera simplement FALSE. Cependant, les constantes
ne sont pas autorisées.
Exemple #6 Utilisation de instanceof pour tester d'autres variables
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a est un entier
var_dump($b instanceof stdClass); // $b vaut NULL
var_dump($c instanceof stdClass); // $c est une ressource
var_dump(FALSE instanceof stdClass);
?>
L'exemple ci-dessus va afficher :
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Il y a quelques pièges à éviter. Avant PHP version 5.1.0, instanceof appellera __autoload() si le nom de la classe n'existe pas. De plus, si la classe n'a pas été chargée, une erreur fatale sera émise. Ceci peut fonctionner en utilisant une référence de classe dynamique, ou une chaîne représentant une variable contenant le nom de la classe :
Exemple #7 Pas de recherche sur le nom de la classe et une erreur fatale avec instanceof en PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // no fatal error here
?>
L'exemple ci-dessus va afficher :
bool(false)
L'opérateur instanceof a été introduit en PHP 5. Avant cette version, is_a() était utilisée mais is_a() est depuis devenue obsolète, en faveur de instanceof. Notez que depuis PHP 5.3.0, is_a() n'est de nouveau plus obsolète.
Voir aussi get_class() et is_a().
Tous les scripts PHP sont une suite d'instructions. Une instruction peut être une assignation, un appel de fonction, une instruction conditionnelle ou bien une instruction qui ne fait rien (une instruction vide). Une instruction se termine habituellement par un point virgule (";"). De plus, plusieurs instructions peuvent être regroupées en bloc, délimité par des accolades ("{}"). Un bloc est considéré comme une instruction. Les différents types d'instructions sont décrits dans ce chapitre.
(PHP 4, PHP 5)
L'instruction if est une des plus importantes instructions de tous les langages, PHP inclus. Elle permet l'exécution conditionnelle d'une partie de code. Les fonctionnalités de l'instruction if sont les mêmes en PHP qu'en C :
if (expression) commandes
Comme nous l'avons vu dans le paragraphe consacré aux
expressions,
expression est convertie en sa valeur
booléenne. Si l'expression vaut
TRUE, PHP exécutera l'instruction et
si elle vaut FALSE, l'instruction sera ignorée. Plus de détails sur les valeurs
qui valent FALSE sont disponibles dans la section
Conversion en booléen.
L'exemple suivant affiche la phrase a est plus grand que b si $a est plus grand que $b :
<?php
if ($a > $b)
echo "a est plus grand que b";
?>
Souvent, vous voulez que plusieurs instructions soient exécutées après un branchement conditionnel. Bien évidemment, il n'est pas obligatoire de répéter l'instruction conditionnelle if autant de fois que vous avez d'instructions à exécuter. À la place, vous pouvez rassembler toutes les instructions dans un bloc. L'exemple suivant affiche a est plus grand que b, si $a est plus grand que $b, puis assigne la valeur de $a à la variable $b :
<?php
if ($a > $b) {
echo "a est plus grand que b";
$b = $a;
}
?>
Vous pouvez imbriquer indéfiniment des instructions if dans d'autres instructions if, ce qui permet une grande flexibilité dans l'exécution d'une partie de code suivant un grand nombre de conditions.
(PHP 4, PHP 5)
Souvent, vous voulez exécuter une instruction si une
condition est remplie, et une autre instruction si cette condition
n'est pas remplie. C'est à cela que sert else.
else fonctionne après un
if et exécute les instructions
correspondantes au cas où l'expression du if
est FALSE. Dans l'exemple suivant, ce bout de code
affiche a est plus grand que b si la
variable $a est plus grande que la variable
$b, et a est plus petit que b
sinon :
<?php
if ($a > $b) {
echo "a est plus grand que b";
} else {
echo "a est plus petit que b";
}
?>
FALSE, et si elle n'est pas suivie par l'expression
elseif - uniquement si elles sont évaluées à FALSE (voir elseif).
(PHP 4, PHP 5)
elseif, comme son nom l'indique, est une combinaison
de if et de else. Comme l'expression
else, il permet d'exécuter une instruction
après un if dans le cas où le "premier"
if est évalué comme FALSE. Mais,
à la différence de l'expression else,
il n'exécutera l'instruction que si l'expression conditionnelle
elseif est évaluée comme
TRUE. L'exemple suivant affichera
a est plus grand que b,
a est égal à b ou
a est plus petit que b :
<?php
if ($a > $b) {
echo "a est plus grand que b";
} elseif ($a == $b) {
echo "a est égal à b";
} else {
echo "a est plus petit que b";
}
?>
Vous pouvez avoir plusieurs elseif qui se suivent
les uns après les autres, après un if initial.
Le premier elseif qui sera évalué
à TRUE sera exécuté. En PHP, vous
pouvez aussi écrire "else if" en deux mots et
son comportement sera identique à la version en un seul mot.
La sémantique des deux expressions est légèrement
différente, mais au bout du compte, le résultat sera
exactement le même.
L'expression elseif est exécutée
seulement si le if précédent et tout
autre elseif précédent sont
évalués comme FALSE, et que
votre elseif est évalué à
TRUE.
Note: A noter que elseif et else if sont traités de la même façon seulement quand des accolades sont utilisées, comme dans l'exemple ci-dessus. Quand vous utilisez ":" pour définir votre condition if/elseif, vous ne devez pas séparer else if en deux mots, sans quoi PHP soulèvera une erreur d'interprétation.
<?php
/* Mauvaise méthode : */
if($a > $b):
echo $a." est plus grand que ".$b;
else if($a == $b): // ne compilera pas
echo "La ligne ci-dessus provoque une erreur d'interprétation";
endif;
/* Bonne méthode : */
if($a > $b):
echo $a." est plus grand que ".$b;
elseif($a == $b): // Les deux mots sont collés
echo $a." égal ".$b;
else:
echo $a." est plus grand ou égal à ".$b;
endif;
?>
(PHP 4, PHP 5)
PHP propose une autre manière de rassembler des instructions à l'intérieur d'un bloc, pour les fonctions de contrôle if, while, for, foreach et switch. Dans chaque cas, le principe est de remplacer l'accolade d'ouverture par deux points (:) et l'accolade de fermeture par, respectivement, endif;, endwhile;, endfor;, endforeach;, ou endswitch;.
<?php if ($a == 5): ?>
A égal 5
<?php endif; ?>
Dans l'exemple ci-dessus, le bloc HTML "A égal 5" est inclus à l'intérieur d'un if en utilisant cette nouvelle syntaxe. Ce code HTML ne sera affiché que si la variable $a est égale à 5.
Cette autre syntaxe fonctionne aussi avec le else et elseif. L'exemple suivant montre une structure avec un if, un elseif et un else utilisant cette autre syntaxe :
<?php
if ($a == 5):
echo "a égale 5";
echo "...";
elseif ($a == 6):
echo "a égale 6";
echo "!!!";
else:
echo "a ne vaut ni 5 ni 6";
endif;
?>
Note:
Vous ne pouvez pas utiliser différentes syntaxes dans le même bloc de contrôle.
(PHP 4, PHP 5)
La boucle while est le moyen le plus simple d'implémenter une boucle en PHP. Cette boucle se comporte de la même manière qu'en C. L'exemple le plus simple d'une boucle while est le suivant :
while (expression)
commandes
La signification d'une boucle while est
très simple. PHP exécute l'instruction tant
que l'expression de la boucle while est
évaluée comme TRUE. La valeur
de l'expression est vérifiée à chaque
début de boucle, et, si la valeur change durant
l'exécution de l'instruction, l'exécution ne
s'arrêtera qu'à la fin de l'itération
(chaque fois que PHP exécute l'instruction, on appelle
cela une itération). De temps en temps, si l'expression du
while est FALSE avant la
première itération, l'instruction ne sera jamais
exécutée.
Comme avec le if, vous pouvez regrouper plusieurs instructions dans la même boucle while en les regroupant à l'intérieur d'accolades ou en utilisant la syntaxe suivante :
while (expression):
commandes
...
endwhile;
Les exemples suivants sont identiques et affichent tous les nombres de 1 jusqu'à 10 :
<?php
/* exemple 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* La valeur affichée est $i avant l'incrémentation
(post-incrémentation) */
}
/* exemple 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
(PHP 4, PHP 5)
Les boucles do-while ressemblent beaucoup
aux boucles while, mais l'expression est
testée à la fin de chaque itération plutôt
qu'au début. La principale différence par rapport
à la boucle while est que la
première itération de la boucle
do-while est toujours exécutée
(l'expression n'est testée qu'à la fin de
l'itération), ce qui n'est pas le cas lorsque vous
utilisez une boucle while (la condition
est vérifiée dès le début de chaque itération, et si elle
s'avère FALSE dès le début, la boucle sera immédiatement arrêtée).
Il n'y a qu'une syntaxe possible pour les boucles do-while :
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
La boucle ci-dessus ne va être exécutée
qu'une seule fois, car lorsque l'expression est
évaluée, elle vaut FALSE (car
la variable $i n'est pas plus grande que 0) et l'exécution
de la boucle s'arrête.
Les utilisateurs familiers du C sont habitués à une utilisation différente des boucles do-while , qui permet de stopper l'exécution de la boucle au milieu des instructions, en encapsulant dans un do-while(0) la fonction break. Le code suivant montre une utilisation possible :
<?php
do {
if ($i < 5) {
echo "i n'est pas suffisamment grand";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i est bon";
/* ...traitement de i... */
} while (0);
?>
Ne vous inquiétez pas si vous ne comprenez pas tout correctement. Vous pouvez écrire des scripts très très puissants sans utiliser cette fonctionnalité. Depuis PHP 5.3.0, il est possible d'utiliser l'opérateur goto à l'intérieur de cette fonctionnalité.
(PHP 4, PHP 5)
Les boucles for sont les boucles les plus complexes en PHP. Elles fonctionnent comme les boucles for du langage C. La syntaxe des boucles for est la suivante :
for (expr1; expr2; expr3)
commandes
La première expression (expr1) est évaluée (exécutée), quoi qu'il arrive au début de la boucle.
Au début de chaque itération, l'expression
expr2 est évaluée.
Si l'évaluation vaut TRUE, la boucle
continue et l'instruction est exécutée. Si
l'évaluation vaut FALSE,
l'exécution de la boucle s'arrête.
À la fin de chaque itération, l'expression expr3 est évaluée (exécutée).
Les expressions peuvent éventuellement être
laissées vides ou peuvent contenir plusieurs expressions séparées par des virgules.
Dans expr2, toutes les expressions séparées par une virgule
sont évaluées mais le résultat est obtenu depuis la dernière partie.
Si l'expression expr2
est laissée vide, cela signifie que c'est une boucle infinie
(PHP considère implicitement qu'elle vaut TRUE,
comme en C). Cela n'est pas vraiment très utile, à moins que vous
souhaitiez terminer votre boucle par l'instruction conditionnelle
break.
Considérons les exemples suivants. Tous affichent les chiffres de 1 jusqu'à 10 :
<?php
/* exemple 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* exemple 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* exemple 3 */
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* exemple 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
Bien évidemment, le premier exemple est le plus simple de tous (ou peut être le quatrième), mais vous pouvez aussi penser qu'utiliser une expression vide dans une boucle for peut être utile parfois.
PHP supporte aussi la syntaxe alternative suivante pour les boucles for :
for (expr1; expr2; expr3):
commandes
...
endfor;
Beaucoup de personnes ont l'habitude d'itérer grâce à des tableaux, comme dans l'exemple ci dessous.
<?php
/*
* Ceci est un tableau avec des données que nous voulons modifier
* au long de la boucle
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
Ce code peut être lent parce qu'il doit calculer la taille du tableau à chaque itération. Etant donné que la taille ne change jamais, il peut facilement être optimisé en utilisant une variable intermédiaire pour stocker la taille au lieu d'appeler de façon répétitive la fonction count() :
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = mt_rand(000000, 999999);
}
?>
(PHP 4, PHP 5)
La structure de langage foreach fournit une façon simple de parcourir des tableaux. foreach ne fonctionne que pour les tableaux et les objets, et émettra une erreur si vous tentez de l'utiliser sur une variable de type différent ou une variable non initialisée. Il existe deux syntaxes :
foreach (array_expression as $value)
commandes
foreach (array_expression as $key => $value)
commandes
La première forme passe en revue le tableau array_expression. À chaque itération, la valeur de l'élément courant est assignée à $value et le pointeur interne de tableau est avancé d'un élément (ce qui fait qu'à la prochaine itération, on accédera à l'élément suivant).
La seconde forme assignera en plus la clé de l'élément courant à la variable $key à chaque itération.
Il est possible de personnaliser l'itération sur des objets.
Note:
Lorsque foreach démarre, le pointeur interne du tableau est automatiquement ramené au premier élément du tableau. Cela signifie que vous n'aurez pas à faire appel à reset() avant foreach.
Vu que foreach utilise le pointeur interne du tableau à chaque itération, il conviendra d'en tenir compte lors d'une utilisation future du tableau dans votre code.
Vous pouvez modifier facilement les éléments d'un tableau en précédent $value d'un &. Ceci assignera une référence au lieu de copier la valeur.
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr vaut maintenant array(2, 4, 6, 8)
unset($value); // Détruit la référence sur le dernier élément
?>
Le référencement de $value est seulement possible si le tableau parcouru peut être référencé (i.e. si c'est une variable). Le code suivant ne fonctionnera pas :
<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>
La référence de $value et le dernier élément du tableau sont conservés après l'exécution de la boucle foreach. Il est recommandé de les détruire en utilisant la fonction unset().
Note:
foreach n'accepte pas l'opérateur de suppression des erreurs @.
Vous pouvez remarquer que les exemples suivants fonctionnent de manière identique :
<?php
$arr = array("un", "deux", "trois");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Valeur : $value<br />\n";
}
foreach ($arr as $value) {
echo "Valeur : $value<br />\n";
}
?>
Les exemples suivants sont aussi fonctionnellement identiques :
<?php
$arr = array("un", "deux", "trois");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Clé : $key; Valeur : $value<br />\n";
}
foreach ($arr as $key => $value) {
echo "Clé : $key; Valeur : $value<br />\n";
}
?>
Voici quelques exemples de plus :
<?php
/* exemple foreach 1 : la valeur seulement */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valeur courante de \$a: $v.\n";
}
/* exemple foreach 2 : la valeur et sa clé d'index */
$a = array(1, 2, 3, 17);
$i = 0; /* uniquement pour l'illustration */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* exemple foreach 3 : la clé et la valeur */
$a = array(
"un" => 1,
"deux" => 2,
"trois" => 3,
"dix-sept" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* exemple foreach 4 : tableaux multidimensionnels */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* exemple foreach 5 : tableaux dynamiques */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
(PHP 5 >= 5.5.0)
PHP 5.5 ajout la possibilité d'itérer dans un tableau de tableaux, et d'en extraire les tableaux internes dans des variables, en fournissant une liste list() comme valeur.
Par exemple :
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b)) {
// $a contient le premier élément du tableau interne,
// et $b contient le second élément.
echo "A: $a; B: $b\n";
}
?>
L'exemple ci-dessus va afficher :
A: 1; B: 2 A: 3; B: 4
Vous pouvez fournir moins d'éléments dans la fonction list() qu'il n'y en a dans le tableau interne, auquel cas, les valeurs du tableau les plus à gauche seront ignorées :
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a)) {
// Notez qu'il n'y a pas de $b ici.
echo "$a\n";
}
?>
L'exemple ci-dessus va afficher :
1 3
Une notification sera générée s'il n'y a pas assez d'éléments dans le tableau pour remplir la fonction list() :
<?php
$array = [
[1, 2],
[3, 4],
];
foreach ($array as list($a, $b, $c)) {
echo "A: $a; B: $b; C: $c\n";
}
?>
L'exemple ci-dessus va afficher :
Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C:
(PHP 4, PHP 5)
L'instruction break permet de sortir d'une structure for, foreach, while, do-while ou switch.
break accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées doivent être interrompues.
<?php
$arr = array('un', 'deux', 'trois', 'quatre', 'stop', 'cinq');
while (list(, $val) = each($arr)) {
if ($val == 'stop') {
break; /* Vous pourriez aussi utiliser 'break 1;' ici. */
}
echo "$val<br />\n";
}
/* Utilisation de l'argument optionnel. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* Termine uniquement le switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* Termine le switch et la boucle while. */
default:
break;
}
}
?>
| Version | Description |
|---|---|
| 5.4.0 | break 0; n'est plus valide. Dans les précédentes versions, il était interprété de la même façon que break 1;. |
| 5.4.0 | Supprime la possibilité de passer des variables (i.e., $num = 2; break $num;) comme argument numérique. |
(PHP 4, PHP 5)
L'instruction continue est utilisée dans une boucle afin d'éluder les instructions de l'itération courante et de continuer l'exécution à la condition de l'évaluation et donc, de commencer la prochaine itération.
Note: Notez qu'en PHP, la structure switch est considérée comme une boucle par continue.
continue accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées doivent être éludées. La valeur par défaut est 1, ce qui revient à aller directement à la fin de la boucle courante.
<?php
while (list($key, $value) = each($arr)) {
if (!($key % 2)) { // évite les membres impairs
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Dehors<br />\n";
while (1) {
echo "Milieu<br />\n";
while (1) {
echo "Intérieur<br />\n";
continue 3;
}
echo "Ceci n'est jamais atteint.<br />\n";
}
echo "Ceci non plus.<br />\n";
}
?>
Oublier le point virgule après continue peut porter à confusion. Voici un exemple de ce que vous ne devez pas faire :
<?php
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
On peut s'attendre à ce que le résultat soit :
0 1 3 4
mais ce script affichera :
2
car le commande complète continue print "$i\n"; est évaluée comme une seule expression, et ainsi, la fonction print est appelée uniquement lorsque $i == 2 est vrai. (La valeur retournée de print est passée à continue comme argument numérique.)
| Version | Description |
|---|---|
| 5.4.0 | continue 0; n'est plus valide. Dans les précédentes versions, il était interprété de la même façon que continue 1;. |
| 5.4.0 | Supprime la possibilité de passer des variables (i.e., $num = 2; continue $num;) comme argument numérique. |
(PHP 4, PHP 5)
L'instruction switch équivaut à une série d'instructions if. En de nombreuses occasions, vous aurez besoin de comparer la même variable (ou expression) avec un grand nombre de valeurs différentes, et d'exécuter différentes parties de code suivant la valeur à laquelle elle est égale. C'est exactement à cela que sert l'instruction switch.
Note: Notez que contrairement à d'autres langages, la structure continue s'applique aux structures switch et se comporte de la même manière que break. Si vous avez un switch dans une boucle, et que vous souhaitez continuer jusqu'à la prochaine itération de la boucle extérieure, vous devez utiliser continue 2.
Note:
Notez que switch/case provoque une comparaison large.
Les deux exemples suivants sont deux manières différentes d'écrire la même chose, l'une en utilisant une séries de if, et l'autre en utilisant l'instruction switch :
Exemple #1 Instruction switch
<?php
if ($i == 0) {
echo "i égal 0";
} elseif ($i == 1) {
echo "i égal 1";
} elseif ($i == 2) {
echo "i égal 2";
}
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
}
?>
Exemple #2 Instruction switch utilisant une chaîne de caractères
<?php
switch ($i) {
case "apple":
echo "i est une tarte";
break;
case "bar":
echo "i est une barre";
break;
case "cake":
echo "i est un gateau";
break;
}
?>
Il est important de comprendre que l'instruction switch exécute chacune des clauses dans l'ordre. L'instruction switch est exécutée ligne par ligne. Au début, aucun code n'est exécuté. Seulement lorsqu'un case est vérifié, PHP exécute alors les instructions correspondantes. PHP continue d'exécuter les instructions jusqu'à la fin du bloc d'instructions du switch, ou bien dès qu'il trouve l'instruction break. Si vous ne pouvez pas utiliser l'instruction break à la fin de l'instruction case, PHP continuera à exécuter toutes les instructions qui suivent. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
case 1:
echo "i égal 1";
case 2:
echo "i égal 2";
}
?>
Dans cet exemple, si $i est égal à 0, PHP va exécuter quand même toutes les instructions qui suivent! Si $i est égal à 1, PHP exécutera les deux dernières instructions. Et seulement si $i est égal à 2, vous obtiendrez le résultat escompté, c'est-à-dire, l'affichage de "i égal 2". Donc, l'important est de ne pas oublier l'instruction break (même s'il est possible que vous l'omettiez dans certaines circonstances).
Dans une commande switch, une condition n'est évaluée qu'une fois, et le résultat est comparé à chaque case. Dans une structure elseif, les conditions sont évaluées à chaque comparaison. Si votre condition est plus compliquée qu'une simple comparaison, ou bien fait partie d'une boucle, switch sera plus rapide.
La liste de commandes d'un case peut être vide, auquel cas PHP utilisera la liste de commandes du cas suivant.
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i est plus petit que 3 mais n'est pas négatif";
break;
case 3:
echo "i égal 3";
}
?>
Un cas spécial est default. Ce cas est utilisé lorsque tous les autres cas ont échoué. Par exemple :
<?php
switch ($i) {
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0.";
}
?>
Une autre chose à mentionner est que la valeur du case peut être toute expression de type scalaire, c'est-à-dire nombre entier, nombre à virgule flottante et chaîne de caractères. Les tableaux sont sans intérêt dans ce contexte-là.
La syntaxe alternative pour cette structure de contrôle est la suivante : (pour plus d'informations, voir syntaxes alternatives).
<?php
switch ($i):
case 0:
echo "i égal 0";
break;
case 1:
echo "i égal 1";
break;
case 2:
echo "i égal 2";
break;
default:
echo "i n'est ni égal à 2, ni à 1, ni à 0";
endswitch;
?>
Il est possible d'utiliser un point-virgule plutôt que deux points après un case, comme ceci :
<?php
switch($beer)
{
case 'leffe';
case 'grimbergen';
case 'guinness';
echo 'Bon choix';
break;
default;
echo 'Merci de faire un choix...';
break;
}
?>
(PHP 4, PHP 5)
L'élément de langage declare sert à ajouter des directives d'exécutions dans un bloc de code. La syntaxe de declare est similaire à la syntaxe des autres fonctions de contrôle :
declare (directive)
commandes
L'expression directive permet de contrôler l'intervention du bloc declare. Actuellement, seulement deux directives sont reconnues : la directive ticks (voir plus bas pour plus de détails sur les ticks) et la directive d'encodage encoding (Voir plus bas pour plus de détails sur la directive encoding).
Note: La directive encoding a été ajoutée en PHP 5.3.0.
L'expression commandes du bloc de declare sera exécutée. Comment elle sera exécutée, et quels effets cela aura, dépend de la directive utilisée dans le bloc directive.
La structure declare peut aussi être utilisée dans le contexte global. Elle affecte alors tout le code qui la suit (même si le fichier avec declare a été inclus après, ça n'affecte pas le fichier parent).
<?php
// Ces déclarations sont identiques.
// Vous pouvez utiliser ceci
declare(ticks=1) {
// script entier ici
}
// ou ceci
declare(ticks=1);
// script entier ici
?>
Un tick est un événement qui intervient toutes les N
commandes bas niveau tickables, exécutées par l'analyseur dans le bloc de
declare. La valeur de N est spécifiée
par la syntaxe ticks=N dans le bloc de
directive declare.
Toutes les commandes ne sont pas tickables. Typiquement, les expressions de condition et les expressions d'arguments ne sont pas tickables.
Un événement qui intervient à chaque tick est spécifié avec la fonction register_tick_function(). Reportez-vous à l'exemple ci-dessous pour plus de détails. Notez que plus d'un événement peut intervenir par tick.
Exemple #1 Exemple d'utilisation des ticks
<?php
declare(ticks=1);
// A function called on each tick event
function tick_handler()
{
echo "tick_handler() called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
?>
Exemple #2 Exemple d'utilisation des ticks
<?php
function tick_handler()
{
echo "tick_handler() called\n";
}
$a = 1;
tick_handler();
if ($a > 0) {
$a += 2;
tick_handler();
print($a);
tick_handler();
}
tick_handler();
?>
Voir aussi register_tick_function() et unregister_tick_function().
L'encodage d'un script peut être spécifié par script en utilisant la directive encoding.
Exemple #3 Déclaration d'un encodage pour un script
<?php
declare(encoding='ISO-8859-1');
// le code
?>
Combinée avec les espaces de nommage, la seule syntaxe valable pour declare est declare(encoding='...'); où ... est la valeur de l'encodage. declare(encoding='...') {} soulèvera une erreur d'interprétation dans le cas des espaces de nommage.
La valeur d'encodage est ignorée en PHP 5.3 à moins que PHP soit compilé avec --enable-zend-multibyte.
Notez que PHP ne vous renseignera sur l'activation ou non de --enable-zend-multibyte qu'au moyen de phpinfo().
Voir aussi zend.script_encoding.
(PHP 4, PHP 5)
Si appelée depuis une fonction, la commande return termine immédiatement la fonction, et retourne l'argument qui lui est passé. return interrompt aussi l'exécution de commande eval() ou de scripts.
Si appelée depuis l'environnement global, l'exécution du script est interrompue. Si le script courant était inclus avec la structure include ou require, alors le contrôle est rendu au script appelant. De plus, si le fichier du script courant a été inclus via l'instruction include, alors la valeur retournée sera utilisée comme résultat de l'instruction include. Si return est appelée depuis le script principal, alors l'exécution du script s'arrête. Si le script courant est auto_prepend_file ou auto_append_file dans le fichier php.ini, alors l'exécution du script s'arrête.
Pour plus d'informations, voyez retourner des valeurs.
Note: Notez que puisque return est une structure de langage, et non une fonction, les parenthèses entourant les arguments ne sont pas nécessaires. Il est classique de les oublier et vous devriez le faire car PHP travaillera moins dans ce cas.
Note: Si aucun paramètre n'est fourni, alors les parenthèses peuvent être omises et
NULLsera retourné. L'appel à la fonction return avec des parenthèses mais sans argument résultera en une alerte d'analyse.
Note: Vous ne devriez jamais utiliser les parenthèses autour de la variable retournée lorsque vous la retournez pas référence, car cela ne fonctionnera pas. Vous ne pouvez retourner que les variables par référence, et non le résultat du traitement. Si vous utilisez return ($a);, alors vous ne retournez pas une variable mais le résultat de l'expression ($a) (qui est, bien sûr, la valeur de $a).
(PHP 4, PHP 5)
require est identique à
include
mise à part le fait que lorsqu'une erreur survient, il produit également
une erreur fatale de niveau E_COMPILE_ERROR. En d'autres termes,
il stoppera le script alors que include
n'émettra qu'une alerte de niveau E_WARNING, ce qui permet au script de
continuer.
Voir la documentation de l'instruction include pour en connaître son fonctionnement.
(PHP 4, PHP 5)
L'instruction de langage include inclut et exécute le fichier spécifié en argument.
Cette documentation s'applique aussi à l'instruction de langage require.
Les fichiers sont inclus suivant le chemin du fichier fourni ; si aucun n'est fourni, l'include_path sera vérifié. Si le fichier n'est pas trouvé dans l' include_path, include vérifiera dans le dossier du script appelant et dans le dossier de travail courant avant d'échouer. L'instruction include enverra une erreur de type warning si elle ne peut trouver le fichier; ce comportement est différent de require, qui enverra une erreur de niveau fatal.
Si un chemin est défini, absolu ou relatif (commençant par une lettre de lecteur suivie de \ pour Windows, ou / pour Unix/Linux), l'include_path sera ignoré. Par exemple, si un nom de fichier commence par ../, PHP cherchera dans le dossier parent pour y trouver le fichier spécifié.
Pour plus d'informations sur la façon dont PHP gère les fichiers inclus ainsi que le chemin d'inclusion, reportez-vous à la documentation relative à l'include_path.
Lorsqu'un fichier est inclus, le code le composant hérite de la portée des variables de la ligne où l'inclusion apparaît. Toutes les variables disponibles à cette ligne dans le fichier appelant seront disponibles dans le fichier appelé, à partir de ce point. Cependant, toutes les fonctions et classes définies dans le fichier inclus ont une portée globale.
Exemple #1 Exemple avec include
vars.php
<?php
$couleur = 'verte';
$fruit = 'pomme';
?>
test.php
<?php
echo "Une $fruit $couleur"; // Une
include 'vars.php';
echo "Une $fruit $couleur"; // Une pomme verte
?>
Si l'inclusion intervient à l'intérieur d'une fonction, le code inclus sera alors considéré comme faisant partie de la fonction. Cela modifie donc le contexte de variables accessibles. Une exception à cette règle : les constantes magiques sont analysées par l'analyseur avant que l'inclusion n'intervienne.
Exemple #2 Inclusion de fichiers dans une fonction
<?php
function foo()
{
global $couleur;
include 'vars.php';
echo "Une $fruit $couleur";
}
/* vars.php est dans le contexte de foo() *
* donc $fruit n'est pas disponible hors de *
* cette fonction. $couleur l'est, car c'est *
* une variable globale */
foo(); // Une pomme verte
echo "Une $fruit $couleur"; // Une verte
?>
Il est important de noter que lorsqu'un fichier est include ou require, les erreurs d'analyse apparaîtront en HTML tout au début du fichier, et l'analyse du fichier parent ne sera pas interrompue. Pour cette raison, le code qui est dans le fichier doit être placé entre les balises habituelles de PHP.
Si les gestionnaires d'inclusion d'URL sont activés dans PHP, vous pouvez localiser le fichier avec une URL (via HTTP ou bien avec un gestionnaire adapté : voir Liste des protocoles et des gestionnaires supportés pour une liste des protocoles), au lieu d'un simple chemin local. Si le serveur distant interprète le fichier comme du code PHP, des variables peuvent être transmises au serveur distant via l'URL et la méthode GET. Ce n'est pas, à strictement parler, la même chose que d'hériter du contexte de variable. Le fichier inclus est en fait un script exécuté à distance, et son résultat est inclus dans le code courant.
Les versions Windows de PHP antérieures à la version 4.3.0 ne supportent pas l'accès aux fichiers distants avec cette fonction, même si allow_url_fopen est activé.
Exemple #3 Utiliser l'instruction include via HTTP
<?php
/* Cet exemple suppose que www.example.com est configuré pour traiter
* les fichiers .php et non pas les fichiers .txt. De plus,
* 'Work' signifie ici que les variables
* $foo et $bar sont disponibles dans le fichier inclus
*/
// Ne fonctionne pas : file.txt n'a pas été traité par www.example.com comme du PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// Ne fonctionne pas : le script cherche un fichier nommé
// 'file.php?foo=1&bar=2' sur le système local
include 'file.php?foo=1&bar=2';
// Réussi
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Ok.
include 'file.php'; // Ok.
?>
Un fichier distant peut être traité sur le serveur distant (dépendamment de l'extension du fichier et si le serveur distant exécute PHP ou non) mais il doit toujours produire un script PHP valide parce qu'il sera traité sur le serveur local. Si le fichier du serveur distant doit être traité sur place et affiché seulement, readfile() est une fonction beaucoup plus appropriée. Autrement, vous devriez bien faire attention à sécuriser le script distant afin qu'il produise un code valide et désiré.
Voir aussi travailler avec les fichiers distants, fopen() et file() pour des informations relatives.
Gestion du retour : include retourne
FALSE et émet une alerte. Les inclusions avec succès, y compris si
elles sont écrasées par le fichier inclus, retourne
1. Il est possible d'exécuter la structure
de langage return à l'intérieur d'un fichier
inclus afin de déterminer le processus dans ce fichier, et retourner
au script qui l'a appelé. De plus, il est possible de retourner des
valeurs depuis des fichiers inclus. Vous pouvez prendre la valeur
depuis l'appel au fichier inclus comme vous le souhaitez depuis une
fonction normale. Ce n'est cependant pas possible lors de l'inclusion de
fichiers distants, et ce, tant que la sortie du fichier distant n'a pas
de balises PHP de début
et de fin valides (tout comme pour les fichiers locaux).
Vous pouvez déclarer les variables nécessaires à l'intérieur de ces balises
et elles seront introduites à l'endroit où le fichier a été inclus.
Comme include est une structure de langage particulière, les parenthèses ne sont pas nécessaires autour de l'argument. Faites attention lorsque vous comparez la valeur retournée.
Exemple #4 Comparaison de la valeur de retour d'une inclusion
<?php
// Ne fonctionne pas, évalué comme include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
echo 'OK';
}
// Fonctionne
if ((include 'vars.php') == 'OK') {
echo 'OK';
}
?>
Exemple #5 include et return
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // affiche 'PHP'
$bar = include 'noreturn.php';
echo $bar; // affiche 1
?>
$bar a la valeur de 1 car
l'inclusion était réussie. Notez la différence entre les deux
exemples ci-dessus. Le premier utilise la commande
return
dans le fichier inclus, alors que le second ne le fait pas.
Si le fichier ne peut être inclus, FALSE est retourné et une erreur
de niveau E_WARNING est envoyée.
S'il y a des fonctions définies dans le fichier inclus, elles peuvent être utilisées dans le fichier principal si elles sont avant le return ou après. Si le fichier est inclus deux fois, PHP 5 enverra une erreur fatale car les fonctions seront déjà déclarées, alors que PHP 4 ne dira rien sur les fonctions définies après return. Il est recommandé d'utiliser include_once au lieu de vérifier si le fichier a déjà été inclus et donc de retourner conditionnellement l'inclusion du fichier.
Une autre façon d'inclure un fichier PHP dans une variable est de capturer la sortie en utilisant les fonctions de contrôle de sortie avec include. Par exemple :
Exemple #6 Utilisation de la sortie du buffer pour inclure un fichier PHP dans une chaîne
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Pour automatiquement inclure des fichiers dans vos scripts, voyez également les options de configuration auto_prepend_file et auto_append_file du php.ini.
Note: Comme ceci est une structure du langage, et non pas une fonction, il n'est pas possible de l'appeler avec les fonctions variables.
Voir aussi require, require_once, include_once, get_included_files(), readfile(), virtual(), et include_path.
(PHP 4, PHP 5)
L'instruction require_once est identique à require mise à part que PHP vérifie si le fichier a déjà été inclus et si c'est le cas, ne l'inclut pas une deuxième fois.
Voir la documention de include_once pour plus d'informations concernant le comportement de _once, et ce qui le différencie des instructions sans _once.
(PHP 4, PHP 5)
La structure include_once inclut et évalue le fichier spécifié durant l'exécution du script. Le comportement est similaire à include, mais la différence est que si le code a déjà été inclus, il ne le sera pas une seconde fois.
La structure include_once est utilisée de préférence lorsque le fichier va être inclus ou évalué plusieurs fois dans un script, ou bien lorsque vous voulez être sûr qu'il ne sera inclus qu'une seule fois, pour éviter des redéfinitions de fonctions ou de classes.
Voyez la structure include pour plus de détails sur son fonctionnement.
Note:
En PHP 4, la fonctionnalité _once diffère avec les systèmes insensibles à la casse (comme Windows).
Exemple #1 include_once avec un OS insensible à la casse en PHP 4
<?php
include_once "a.php"; // ceci inclut le fichier a.php
include_once "A.php"; // ceci inclut encore le fichier a.php! (uniquement en PHP 4)
?>Ce comportement a changé en PHP 5 : le chemin est normalisé d'abord, donc, le fichier C:\PROGRA~1\A.php est reconnu comme étant identique au fichier C:\Program Files\a.php et le fichier ne sera inclus qu'une seule fois.
(PHP 5 >= 5.3.0)
L'opérateur goto peut être utilisé pour continuer l'exécution du script à un autre point du programme. La cible est spécifiée par un label, suivi de deux-point, et l'instruction goto est ensuite suivie de ce label. goto n'est pas totalement sans limitations. L'étiquette cible doit être dans le même contexte et fichier, ce qui signifie qu'il n'est pas possible de changer de méthode ou de fonction, ni de se rendre dans une autre fonction. Vous pouvez sortir d'une fonction, et l'utilisation courante est alors de se servir de goto comme un break.
Exemple #1 Exemple avec goto
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
L'exemple ci-dessus va afficher :
Bar
Exemple #2 Exemple de boucle avec goto
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
L'exemple ci-dessus va afficher :
j hit 17
Exemple #3 Ce goto ne fonctionne pas
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
L'exemple ci-dessus va afficher :
Fatal error: 'goto' into loop or switch statement is disallowed in script on line 2
Note:
L'opérateur goto est disponible depuis PHP 5.3.
Une fonction peut être définie en utilisant la syntaxe suivante :
Exemple #1 Pseudo code pour illustrer l'usage d'une fonction
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Exemple de fonction.\n";
return $retval;
}
?>
Tout code PHP, correct syntaxiquement, peut apparaître dans une fonction et dans des définitions de classe.
Les noms de fonctions suivent les mêmes règles que les autres labels en PHP. Un nom de fonction valide commence par une lettre ou un souligné, suivi par un nombre quelconque de lettres, de nombres ou de soulignés. Ces règles peuvent être représentées par l'expression rationnelle suivante : [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Les fonctions n'ont pas besoin d'être définies avant d'être utilisées, SAUF lorsqu'une fonction est définie conditionnellement, comme montré dans les deux exemples suivants.
Lorsqu'une fonction est définie de manière conditionnelle, comme dans les exemples ci-dessous, leur définition doit précéder leur utilisation.
Exemple #2 Fonctions conditionnelles
<?php
$makefoo = true;
/* Impossible d'appeler foo() ici,
car cette fonction n'existe pas.
Mais nous pouvons utiliser bar() */
bar();
if ($makefoo) {
function foo()
{
echo "Je n'existe pas tant que le programme n'est pas passé ici.\n";
}
}
/* Maitenant, nous pouvons appeler foo()
car $makefoo est maintenant vrai */
if ($makefoo) foo();
function bar()
{
echo "J'existe dès de début du programme.\n";
}
?>
Exemple #3 Fonctions dans une autre fonction
<?php
function foo()
{
function bar()
{
echo "Je n'existe pas tant que foo() n'est pas appelé.\n";
}
}
/* Impossible d'appeler bar() ici
car il n'existe pas. */
foo();
/* Maintenant, nous pouvons appeler bar(),
car l'utilisation de foo() l'a rendue
accessible. */
bar();
?>
Toutes les fonctions et classes en PHP ont une portée globale - elles peuvent être appelées à l'extérieur d'une fonction si elles ont été définies à l'intérieur et vice-versa.
PHP ne supporte pas le surchargement de fonction, ni la destruction ou la redéfinition de fonctions déjà déclarées.
Note: Les noms de fonctions sont insensibles à la casse, et il est généralement admis que les fonctions doivent être appelées avec le nom utilisé dans leur déclaration, y compris la casse.
Les listes variables d'arguments de fonction et les valeurs par défaut d'arguments sont supportés : voir les fonctions de références que sont func_num_args(), func_get_arg(), et func_get_args() pour plus d'informations.
Il est possible d'appeler des fonctions récursives en PHP. Cependant, les appels de méthodes/fonctions récursives avec 100-200 degrés de récursivité peuvent remplir la pile et ainsi, terminer le script courant.
Exemple #4 Fonctions récursives
<?php
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
recursion(3);
?>
Des informations peuvent être passées à une fonction en utilisant une liste d'arguments, dont chaque expression est séparée par une virgule. Les arguments seront évalués depuis la gauche vers la droite.
PHP supporte le passage d'arguments par valeur (comportement par défaut), le passage par référence, et des valeurs d'arguments par défaut. Une liste variable d'arguments est également supportée, voir la documentation sur les fonctions func_num_args(), func_get_arg(), et func_get_args() pour plus d'informations.
Exemple #1 Nombre variable d'argument sous forme de tableau
<?php
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
takes_array(array(2,3));
?>
Par défaut, les arguments sont passés à la fonction par valeur (Ainsi changer la valeur d'un argument dans la fonction ne change pas sa valeur à l'extérieur de la fonction). Si vous voulez que vos fonctions puissent changer la valeur des arguments, vous devez passer ces arguments par référence.
Si vous voulez qu'un argument soit toujours passé par référence, vous pouvez ajouter un '&' devant l'argument dans la déclaration de la fonction :
Exemple #2 Passage d'arguments par référence
<?php
function add_some_extra(&$string)
{
$string .= ', et un peu plus.';
}
$str = 'Ceci est une chaîne';
add_some_extra($str);
echo $str;
?>
Vous pouvez définir comme en C++ des valeurs par défaut pour les arguments de type scalaire :
Exemple #3 Valeur par défaut des arguments de fonctions
<?php
function servir_cafe ($type = "cappuccino")
{
return "Servir un $type.\n";
}
echo servir_cafe();
echo servir_cafe(null);
echo servir_cafe("espresso");
?>
L'exemple ci-dessus va afficher :
Servir un cappuccino. Servir un. Servir un espresso.
PHP vous autorise à utiliser des tableau ainsi que le type spécial
NULL comme valeur par défaut, par exemple :
Exemple #4 Utilisation de type non scalaire comme valeur par défaut
<?php
function servir_cafe($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "les mains" : $coffeeMaker;
return "Préparation d'une tasse de ".join(", ", $types)." avec $device.\n";
}
echo servir_cafe();
echo servir_cafe(array("cappuccino", "lavazza"), "une cafetière");
?>
La valeur par défaut d'un argument doit obligatoirement être une constante, et ne peut être ni une variable, ni un membre de classe, ni un appel de fonction.
Il est à noter que si vous utilisez des arguments avec valeur par défaut avec d'autres sans valeur par défaut, les premiers doivent être placés à la suite de tous les paramètres sans valeur par défaut. Sinon, cela ne fonctionnera pas. Considérons le code suivant :
Exemple #5 Les arguments sans valeur par défaut doivent être en premiers : erreur
<?php
function faireunyaourt ($type = "acidophilus", $flavour)
{
return "Préparer un bol de $type $flavour.\n";
}
echo faireunyaourt("framboise"); // ne fonctionne pas comme voulu
?>
L'exemple ci-dessus va afficher :
Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41 Préparer un bol de framboise .
Maintenant comparons l'exemple précédent avec l'exemple suivant :
Exemple #6 Les arguments sans valeur par défaut doivent être en premiers : valide
<?php
function faireunyaourt ($flavour, $type = "acidophilus")
{
return "Préparer un bol de $type $flavour.\n";
}
echo faireunyaourt ("framboise"); // fonctionne comme voulu
?>
L'exemple ci-dessus va afficher :
Préparer un bol de acidophilus framboise.
Note: Les valeurs par défaut peuvent être passées par référence.
PHP supporte les fonctions à nombre d'arguments variable. C'est très simple à utiliser, avec les fonctions func_num_args(), func_get_arg() et func_get_args().
Aucune syntaxe particulière n'est nécessaire, et la liste d'arguments doit toujours être fournie explicitement avec la définition de la fonction, et se comportera normalement.
Les valeurs sont renvoyées en utilisant une instruction de retour optionnelle. Tous les types de variables peuvent être renvoyés, tableaux et objets compris. Cela fait que la fonction finit son exécution immédiatement et passe le contrôle à la ligne appelante. Voir return pour plus d'informations.
Note:
Si return est omis, la valeur
NULLsera retournée.
Exemple #1 Utilisation de return
<?php
function carre ($num)
{
return $num * $num;
}
echo carre (4);
?>
Une fonction ne peut pas renvoyer plusieurs valeurs en même temps, mais vous pouvez obtenir le même résultat en renvoyant un tableau.
Exemple #2 Retourner un tableau d'une fonction
<?php
function petit_nombre()
{
return array (0, 1, 2);
}
list ($zero, $un, $deux) = petit_nombre();
var_dump($zero, $un, $deux);
?>
Pour retourner une référence d'une fonction, utilisez l'opérateur & aussi bien dans la déclaration de la fonction que dans l'assignation de la valeur de retour.
Exemple #3 Retourner une référence d'une fonction
<?php
function &retourne_reference()
{
return $uneref;
}
$newref =& retourne_reference();
?>
Pour plus d'informations sur les références, référez-vous à l'explication sur les références.
PHP supporte le concept de fonctions variables. Cela signifie que si le nom d'une variable est suivi de parenthèses, PHP recherchera une fonction de même nom, et essaiera de l'exécuter. Cela peut servir, entre autres, pour faire des fonctions de rappel, des tables de fonctions...
Les fonctions variables ne peuvent pas fonctionner avec les éléments de langage comme les echo, print, unset(), isset(), empty(), include, require etc. Vous devez utiliser votre propre gestion de fonctions pour utiliser un de ces éléments de langages comme fonctions variables.
Exemple #1 Exemple de fonction variable
<?php
function foo() {
echo "dans foo()<br />\n";
}
function bar($arg = '')
{
echo "Dans bar(); l'argument était '$arg'.<br />\n";
}
// Ceci est une fonction détournée de echo
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // Appel foo()
$func = 'bar';
$func('test'); // Appel bar()
$func = 'echoit';
$func('test'); // Appel echoit()
?>
Vous pouvez aussi appeler les méthodes d'un objet en utilisant le système des fonctions variables.
Exemple #2 Exemple de méthode variable
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // Appelle la méthode Bar()
}
function Bar()
{
echo "C'est Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // Appelle $foo->Variable()
?>
Lors de l'appel à des méthodes statiques, l'appel fonction est meilleur que l'opérateur de propriété statique :
Exemple #3 Exemple de méthode variable avec des propriétés statiques
<?php
class Foo
{
static $variable = 'static property';
static function Variable()
{
echo 'Method Variable called';
}
}
echo Foo::$variable; // Ceci affiche 'static property'. Il est nécessaire d'avoir une $variable dans le contexte.
$variable = "Variable";
Foo::$variable(); // Ceci appelle $foo->Variable(), lisant ainsi la $variable depuis le contexte.
?>
Voir aussi is_callable(), call_user_func(), les variables variables et function_exists().
PHP dispose de nombreuses fonctions et structures standards. Il y a aussi des fonctions qui requièrent des extensions spécifiques de PHP, sans lesquelles vous obtiendrez l'erreur fatale undefined function. Par exemple, pour utiliser les fonctions d'images, telles que imagecreatetruecolor(), vous aurez besoin du support de GD dans PHP. Ou bien, pour utiliser mysql_connect(), vous aurez besoin de l'extension MySQL. Il y a des fonctions de base qui sont incluses dans toutes les versions de PHP, telles que les fonctions de chaînes de caractères et les fonctions de variables. Utilisez phpinfo() ou get_loaded_extensions() pour savoir quelles sont les extensions qui sont compilées avec votre PHP. Notez aussi que de nombreuses extensions sont activées par défaut, et que le manuel PHP est compartimenté par extension. Voyez les chapitres de configuration, installation ainsi que les détails particuliers à chaque extension, pour savoir comment les mettre en place.
Lire et comprendre le prototype d'une fonction est décrit dans l'annexe Comment lire la définition d'une fonction (prototype). Il est important de comprendre ce qu'une fonction retourne, ou si une fonction travaille directement sur la valeur des paramètres fournis. Par exemple, str_replace() va retourner une chaîne modifiée, tandis que usort() travaille directement sur la variable passée en paramètre. Chaque page du manuel a des informations spécifiques sur chaque fonction, comme le nombre de paramètres, les évolutions de spécifications, les valeurs retournées en cas de succès ou d'échec, et la disponibilité en fonction des versions. Bien connaître ces différences, parfois subtiles, est crucial pour bien programmer en PHP.
Note: Si les paramètres donnés à une fonction ne sont pas corrects, comme le fait de passer un tableau alors qu'une chaîne de caractères est attendue, la valeur retournée de la fonction est indéfinie. Dans ce cas, la fonction retournera la plupart du temps une valeur
NULLmais ce n'est juste qu'une convention et ne peut être considéré comme une certitude.
Voir aussi function_exists(), l'index des fonctions, get_extension_funcs() et dl().
Les fonctions anonymes, aussi appelées fermetures ou closures permettent la création de fonctions sans préciser leur nom. Elles sont particulièrement utiles comme fonctions de rappel, mais leur utilisation n'est pas limitée à ce seul usage.
Exemple #1 Exemples avec des fonctions anonymes
<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'bonjour-le-monde');
?>
Les fonctions anonymes peuvent aussi être utilisées comme valeurs de variables. PHP va automatiquement convertir ces expressions en objets Closure. Assigner une fermeture à une variable est la même chose qu'un assignement classique, y compris pour le point-virgule final.
Exemple #2 Assignation de fonction anonyme à une variable
<?php
$greet = function($name)
{
printf("Bonjour %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
Les fonctions anonymes peuvent hériter des variables du contexte de leur parent. Ces variables doivent alors être déclarées dans la signature de la fonction. L'héritage du contexte parent n'est pas la même chose que les variables de l'environnement global. Les variables globales existent dans le contexte global, qui est le même, quelle que que soit la fonction qui s'exécute. Le contexte parent d'une fonction anonyme est la fonction dans laquelle la fonction a été déclarée (pas nécessairement celle qui appelle). Voyez l'exemple ci-dessous :
Exemple #3 Fonctions anonymes et contexte
<?php
// Un panier d'achat simple, qui contient une liste de produits
// choisis et la quantité désirée de chaque produit. Il inclut
// une méthode qui calcule le prix total des éléments dans le panier
// en utilisant une fonction de rappel anonyme.
class Panier
{
const PRICE_BEURRE = 1.00;
const PRICE_LAIT = 3.00;
const PRICE_OEUF = 6.95;
protected $products = array();
public function add($product, $quantity)
{
$this->products[$product] = $quantity;
}
public function getQuantity($product)
{
return isset($this->products[$product]) ? $this->products[$product] :
FALSE;
}
public function getTotal($tax)
{
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($this->products, $callback);
return round($total, 2);
}
}
$mon_panier = new Panier;
// Ajout d'élément au panier
$mon_panier->add('beurre', 1);
$mon_panier->add('lait', 3);
$mon_panier->add('oeuf', 6);
// Affichage du prix avec 5.5% de TVA
print $mon_panier->getTotal(0.055) . "\n";
?>
Les fonctions anonymes sont implémentées en utilisant la classe Closure.
| Version | Description |
|---|---|
| 5.4.0 | $this peut désormais être utilisé dans les fonctions anonymes. |
| 5.3.0 | Les fonctions anonymes deviennent disponibles. |
Note: Il est possible d'utiliser les fonctions func_num_args(), func_get_arg() et func_get_args() dans une fonction anonyme.
Depuis PHP 5, le modèle objet a été réécrit pour permettre de meilleures performances et offrir plus de fonctionnalités. Cette réécriture a été une des modifications majeures par rapport à PHP 4. PHP 5 a donc un modèle objet complet.
Parmi les fonctionnalités offertes par PHP 5, on peut citer la visibilité dans les classes, les classes abstract et les classes final mais aussi les méthodes magiques, les interfaces, le clônage et le typage (typehinting).
PHP gère les objets de la même façon, qu'ils soient des références ou des gestionnaires, ce qui signifie que chaque variable contient une référence vers l'objet plutôt qu'une copie de l'objet complet. Reportez-vous à la documentation Objets et Références pour plus de détails.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Une définition de classe basique commence par le mot-clé class, suivi du nom de la classe. Suit une paire d'accolades contenant la définition des propriétés et des méthodes appartenant à la classe.
Le nom de la classe peut être quelconque à condition que ce ne soit pas un mot réservé en PHP. Un nom de classe valide commence par une lettre ou un underscore, suivi de n'importe quel nombre de chiffres, ou de lettres, ou d'underscores. Si on devait l'exprimer sous forme d'une expression rationnelle, il s'agirait de [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Une classe peut contenir ses propres constantes, variables (appelées "propriétés" ou "attributs"), et fonctions (appelées "méthodes").
Exemple #1 Définition typique d'une classe
<?php
class SimpleClass
{
// déclaration d'une propriété
public $var = 'une valeur par défaut';
// déclaration des méthodes
public function displayVar() {
echo $this->var;
}
}
?>
La pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelant (habituellement, l'objet auquel la méthode appartient, mais ce peut être un autre objet si la méthode est appelée de manière statique depuis le contexte d'un autre objet).
Exemple #2 Quelques exemples de la pseudo-variable $this
<?php
class A
{
function toto()
{
if (isset($this)) {
echo '$this est définie (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this n'est pas définie.\n";
}
}
}
class B
{
function titi()
{
// Note: la ligne suivante émet une erreur si E_STRICT est activé.
A::toto();
}
}
$a = new A();
$a->toto