Copyright @ 1997 - 2009 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) et que vous ayez 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, Jesus M. Castagnetto, Ron Chmara, Sean Coates, John Coggeshall, Simone Cortesi, Markus Fischer, Wez Furlong, Sara Golemon, Rui Hirokawa, Brad House, Pierre-Alain Joye, Etienne Kneuss, Moriyoshi Koizumi, Rasmus Lerdorf, Andrew Lindeman, Stanislav Malyshev, Rafael Martinez, Rick McGuire, Yasuo Ohgaki, Derick Rethans, Rob Richards, Sander Roobol, Egon Schmid, Thomas Schoefbeck, Sascha Schumann, Dan Scott, Masahiro Takagi, 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 commande 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 : Apache, Microsoft Internet Information Server, Personal Web Server, Netscape et iPlanet servers, Oreilly Website Pro server, Caudium, Xitami, OmniHTTPd et beaucoup d'autres encore. Pour la majorité des serveurs web, PHP fonctionne comme module et, pour d'autres, il comme exécutable 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, ou encore un mélange des deux. Bien que le support de la couche objet ne soit pas très standard en PHP 4, beaucoup de bibliothèques et d'applications d'envergures (incluant la bibliothèque PEAR) ont été écrites en utilisant uniquement du code orienté objet. PHP 5 a rectifié les faiblesses de la couche objet de PHP 4 et a introduit un modèle objet complet.
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) générés à 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 fichier, ou bien les envoie directement au navigateur web.
Une des grandes forces de PHP est le support de nombreuses bases de données. Ecrire une page web exploitant une base de données est extrêmement simple. Les bases de données suivantes sont toutes supportées par PHP :
Il existe aussi une couche d'abstraction de base de données (nommée PDO) qui vous permettent de vous connecter de manière transparente à toute base de données supportée par cette extension. De plus, PHP supporte ODBC, ce qui vous permet de vous connecter à toute autre base de données qui supporte ce standard.
- Adabas D
- dBase
- Empress
- FilePro (lecture seule)
- Hyperwave
- IBM DB2
- Informix
- Ingres
- InterBase
- FrontBase
- mSQL
- Direct MS-SQL
- MySQL
- ODBC
- Oracle (OCI7 et OCI8)
- Ovrimos
- PostgreSQL
- SQLite
- Solid
- Sybase
- Velocis
- Unix dbm
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. Vous pouvez aussi exploiter les objets distants avec CORBA.
PHP dispose de fonctionnalités extrêmement utiles pour le traitement de texte, allant des expressions rationnelles POSIX étendues ou Perl aux traitements des fichiers XML, avec les standards SAX et DOM (PHP 4). Vous pouvez utiliser les transformations XSLT. PHP 5 standardise toutes les extensions XML sur la base solide de libxml2 et en attendant les fonctionnalités en ajoutant le support de SimpleXML et XMLReader.
Enfin, PHP dispose d'extensions très pratiques comme le moteur de recherche mnoGoSearch, la passerelle avec IRC, des outils de compression (gzip, bz2, zip) et de conversion calendaire, de traduction...
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é). Dans le cas où vous rencontriez 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 ceci 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 autres, 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évelopper 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 où 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 a 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éés 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é ses 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 modifications. En pratique, certaines modifications doivent être apportées.
Les deux modifications récentes les plus importantes qui affectent les anciens codes sont :
Pour plus de détails sur ces modifications, reportez-vous à la section sur les variables pré-définies.
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 :
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-dist /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-recommended, 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.
Pour PHP 4 :
LoadModule php4_module libexec/libphp4.so
Pour PHP 5 :
LoadModule php5_module libexec/libphp5.so
15. Et dans la section AddModule de httpd.conf, quelque part en dessous de
ClearModuleList, ajoutez ceci :
Pour PHP 4 :
AddModule mod_php4.c
Pour PHP 5 :
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-dist /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
Note: Remplacez php-5 par php-4 et php5 par php4 en PHP 4.
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 (ou libphp4.so en PHP 4) 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 libphp4.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 (remplacez php5 par php4 en PHP 4). 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 :
User nobody Group "#-1"À 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.
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.0 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 à la place, ou utilisez Apache 1. Pour savoir pourquoi, lisez l'entrée de la FAQ correspondante à l'utilisation d'Apache 2 dans un environnement threadé MPM.
Il est vivement recommandé de lire la » documentation Apache pour avoir une meilleure connaissance du serveur Web Apache 2.0.
Note: Notes sur la compatibilité de PHP avec Apache 2.0
Les versions de PHP suivantes sont reconnues pour fonctionner avec la plus récente version d'Apache 2.0.x :
- PHP 4.3.0 ou plus récent, disponible à » http://www.php.net/downloads.php.
- Les dernières versions stables de développement. Le code source est disponible à » http://snaps.php.net/php5-latest.tar.gz, ou les exécutables compilés pour Windows à » http://snaps.php.net/win32/php5-win32-latest.zip.
- Une version non stable, téléchargeable sur » http://qa.php.net/.
- Vous pouvez obtenir PHP sur le » serveur CVS anonyme.
Ces versions de PHP sont compatibles avec Apache 2.0.40 et plus récent.
Le support des SAPI d'Apache 2.0 a commencé avec PHP 4.2.0. PHP 4.2.3 est connu pour fonctionner avec Apache 2.0.39. N'essayez pas d'utiliser cette version de PHP avec une autre version d'Apache 2.0. Cependant, nous vous recommandons de configurer PHP 4.3.0 ou supérieures avec la plus récente des versions d'Apache 2.
Toutes les versions de PHP mentionnées ici fonctionnent avec Apache 1.3.x.
Téléchargez la version la plus récente de » Apache 2.0 et une version appropriée de PHP, tel que décrit ci-dessus. Ce guide rapide couvre les manipulations de base, nécessaires à l'installation de Apache 2.0 et 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. Il faudra donc remplacer les séquences 'NN' avec les valeurs correctes que vous utilisez.
Exemple #1 Instruction d'installation (Module partagé Apache 2)
1. gzip -d httpd-2_0_NN.tar.gz
2. tar xvf httpd-2_0_NN.tar
3. gunzip php-NN.tar.gz
4. tar -xvf php-NN.tar
5. cd httpd-2_0_NN
6. ./configure --enable-so
7. make
8. make install
Maintenant, vous avez un dossier Apache 2.0.NN installé dans /usr/local/apache2,
configure avec le support des modules dynamiques, et le prefork standard MPM.
Pour tester l'installation, utilisez votre procédure standard de démarrage d'Apache :
/usr/local/apache2/bin/apachectl start
et pour stopper le serveur, utilisez
/usr/local/apache2/bin/apachectl stop.
9. cd ../php-NN
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 une configuration assez simple avec uniquement le support de Apache 2 et MySQL.
Votre chemin vers apxs peut être différent ; en fait, le binaire devrait toujours s'appeler
apsx2 sur votre système.
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
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-dist /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-recommended, 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.
Pour PHP 4 :
LoadModule php4_module modules/libphp4.so
Pour PHP 5:
LoadModule php5_module modules/libphp5.so
15. Dites à Apache de faire analyser certaines extensions par PHP. Par exemple,
faites analyser l'extension .php par PHP. Plutôt que de n'utiliser que la directive Apache AddType,
nous souhaitons éviter des téléversements dangereux ou que des fichiers créés tels que
exploit.php.jpg soient intérprétés par PHP. En suivant cet exemple, vous pouvez ajouter n'importe quelle(s)
extension(s) à parser juste en l'(les)ajoutant à la suite, séparée(s) par un espace.
Nous ajouterons .phtml dans notre exemple.
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
Ou, si nous souhaitons permettre uniquement aux fichiers .php, .php2, .php3, .php4, .php5, .php6 et
.phtml d'être interprétés par PHP, et à aucun autre, nous utiliserons :
<FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Et pour permettre aux fichiers .phps d'être traités comme du code source PHP colorisé, ajoutez ceci :
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
16. Utilisez votre méthode habituelle pour démarrer le serveur Apache, e.g. :
/usr/local/apache2/bin/apachectl start
- OU -
service httpd restart
Suivez les étapes ci-dessus, et vous disposerez d'un serveur Apache 2.0 avec le support de PHP module comme module SAPI. Bien sur, il y a bien d'autres options de configuration disponibles pour les deux logiciels, Apache et PHP. Pour plus de détails, utilisez la commande ./configure --help dans le dossier de sources approprié. Si vous souhaitez compiler une version multithreadée de Apache 2.0 vous devrez remplacer le module standard MPM prefork avec worker ou perchild. Pour ce faire, ajoutez à la ligne de configuration de l'étape 6, l'option --with-mpm=worker ou --with-mpm=perchild. Avant de procéder, soyez conscient des conséquences, et comprenez bien ce que vous faites. Pour plus de détails sur ce sujet, lisez la documentation Apache sur » le module MPM.
Note: Si vous voulez utiliser la négociation sur le contenu, lisez la section FAQ Apache MultiViews.
Note: Pour compiler une version multithreadée d'Apache, votre système doit supporter les threads. Cela implique aussi de compiler PHP avec le module expérimental de Zend Thread Safety (ZTS). Par conséquent, toutes les extensions ne seront pas disponibles. La configuration recommandée actuellement est celle avec le module standard MPM prefork.
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 appel 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éfinit à 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 ))
)
PHP peut être compilé comme module Pike pour » le serveur Web Caudium. Suivez simplement les instructions suivantes pour installer PHP sur un serveur Caudium.
Exemple #1 Instructions d'installation Caudium
1. Assurez-vous que vous avez un serveur Caudium installé avant de tenter
l'installation PHP 4. Pour que PHP 4 fonctionne correctement, vous devez
installer Pike 7.0.268 ou plus récent. Pour cet exemple, nous supposerons
que vous avez installé Caudium dans le dossier /opt/caudium/server/.
2. Renommez le dossier en php-x.y.z (où x.y.z est le numéro de version).
3. ./configure --with-caudium=/opt/caudium/server
4. make
5. make install
6. Redémarrez Caudium s'il était en fonctionnement.
7. Connectez-vous à l'interface de configuration graphique et allez
dans le serveur virtuel auquel vous voulez ajouter le support PHP 4.
8. Cliquez sur "Add Module" et recherchez puis ajoutez le module
"PHP 4 Script Support".
9. Si la documentation dit que 'PHP 4 interpreter isn't
available', assurez-vous que vous avez bien redémarré le serveur.
Si vous l'avez fait, vérifiez le fichier
/opt/caudium/logs/debug/default.1 : il contient peut-être des
erreurs liées à PHP4.so. De même, assurez-vous
que caudium/server/lib/[pike-version]/PHP4.so
est présent.
10. Configurez le module "PHP Script Support" si nécessaire.
Vous pouvez bien sûr compiler votre module Caudium avec les diverses extensions disponibles. Voyez la page de référence pour la liste des options de configuration.
Note: Lorsque vous ajoutez le support MySQL à PHP 4, vous devez vous assurer que le client MySQL normal est utilisé. Sinon, il peut y avoir des conflits avec Pike, qui dispose déjà du support MySQL. Vous pouvez le faire en spécifiant le dossier d'installation de MySQL grâce à l'option --with-mysql.
Pour compiler PHP comme un module fhttpd, répondez "yes" à la question "Build as an fhttpd module?" (cela correspond à l'option de configuration --with-fhttpd=DIR et spécifiez la racine de la distribution fhttpd. Le répertoire par défaut est : /usr/local/src/fhttpd. Si vous utilisez fhttpd, compiler PHP en module vous permettra d'obtenir des performances supérieures, plus de contrôle et la possibilité d'exécution à distance.
Note: Le support de fhttpd n'est plus disponible depuis PHP 4.3.0.
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"]
(PHP >= 4.3.3) Le paramètre php_ini est optionnel mais, avec lui, vous pouvez placer votre php.ini dans le dossier de configuration de votre serveur web.
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>
(PHP >= 4.3.3) Comme paramètres additionnels, vous pouvez ajouter quelques valeurs spéciales dans le php.ini. Par exemple, vous pouvez définir un spécifique docroot="/path/to/docroot" où le contexte php4_execute est appelé. Pour les init-keys booléens, utilisez les valeurs 0/1, et non pas "On","Off",... (cela ne fonctionnera pas correctement), e.g. zlib.output_compression=1 au lieu de zlib.output_compression="On"
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>
Après cela, vous pouvez configurer un répertoire dans le serveur d'administration et y assigner le style x-httpd-php. Tous les fichiers dans ce répertoire seront exécutés comme étant du PHP. C'est pratique pour cacher l'usage de PHP en renommant les fichiers en .html.
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...]
où XXX est le code d'erreur HTTP. Effacez toute autre directive Error qui pourrait interférer avec la vôtre. Si vous voulez utiliser une page pour toutes les erreurs qui existent, laissez le paramètre code vide. Votre script peut obtenir le code de statut HTTP dans la variable $_SERVER['ERROR_TYPE'].
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...]
Pour ces deux points, l'URI originale et l'URI traduite sont dans les variables $_SERVER['PATH_INFO'] et $_SERVER['PATH_TRANSLATED'].
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 défaut, PHP est compilé en version CGI. Cela crée un interpréteur de commande qui peut être utilisé soit pour le traitement CGI, soit pour les scripts non relatifs au web. Si PHP peut être incorporé au serveur web que vous utilisez en tant que module, de manière générale c'est cette solution que vous devriez adopter pour des raisons de performances. Cependant, la version CGI permet aux utilisateurs sous Apache de lancer des scripts PHP sous leurs UID respectives.
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.
Avec PHP 4.3.0, d'importants ajouts ont été faits à PHP. une nouvelle SAPI, appelée CLI, existe aussi et porte le même nom que la version CGI. Ce qui est installé en tant que {PREFIX}/bin/php dépend de votre ligne de configuration. Tout ceci est décrit en détails dans la partie du manuel intitulée Utiliser PHP en ligne de commande. Veuillez vous y référer pour de plus amples informations.
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. Voici la liste des outils nécessaires :
De plus, vous devrez aussi installer (et peut être aussi compiler) toutes les bibliothèques nécessaires aux extensions comme MySQL, Oracle, etc.
Vous pouvez simplifier l'installation Solaris en utilisant pkgadd pour installer la plupart des composants.
Cette section contient des notes et des astuces spécifiques à l'installation de PHP sous » Debian GNU/Linux.
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. Il y a deux versions légèrement différentes de Mac OS X, Client et Serveur ; notre manuel vous guidera dans l'installation de PHP sur ces deux versions. Notez que PHP n'est pas disponible pour MacOS 9 et versions précédentes.
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 /etc/httpd/httpd.conf Quelques commandes nano : ^w (recherche), ^o (sauvegarde), et ^x (sortie) où ^ représente la touche Ctrl.
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(); ?>
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.
Décompressez-les, et utilisez le script configure sur Apache, comme ceci.
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache
Si vous voulez que le compilateur fasse certaines optimisations, ajoutez cette ligne :
setenv OPTIM=-O2
Puis, allez dans le dossier PHP 4 et configurez PHP.
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/share/man \
--with-xml \
--with-apache=/src/apache_1.3.12
Si vous avez d'autres extensions à ajouter (MySQL, GD, etc.), assurez-vous de placer les bonnes options ici. Pour la chaîne --with-apache, ajoutez le chemin de votre distribution source apache, par exemple, /src/apache_1.3.12.
Maintenant, reconfigurez Apache pour compiler PHP 4.
./configure --exec-prefix=/usr \ --localstatedir=/var \ --mandir=/usr/share/man \ --libexecdir=/System/Library/Apache/Modules \ --iconsdir=/System/Library/Apache/Icons \ --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ --enable-shared=max \ --enable-module=most \ --target=apache \ --activate-module=src/modules/php4/libphp4.a
Vous pouvez recevoir un message qui vous dit que libmodphp4.a est trop ancien. Si c'est le cas, allez dans le dossier src/modules/php4 de votre distribution Apache et utilisez cette commande : ranlib libmodphp4.a. Puis retournez à la racine de la distribution Apache et lancez la commande configure ci-dessus. Cela aura mis la table de liens à jour. Lancez à nouveau make et make install.
cp php.ini-dist /usr/local/bin/php.ini
ou, si vous n'avez pas de dossier local :
cp php.ini-dist /usr/bin/php.ini
.
Les instructions suivantes vous aideront à installer un module PHP pour le serveur web Apache inclus dans MacOS X en utilisant l'interface MacOS. Cette version inclue le support des bases de données MySQL, PostgreSQL, et iODBC, cURL, GD, PDFLib, LDAP, et bien plus. Ces instructions sont fournies par » Marc Liyanage.
Assurez-vous de savoir ce que vous faîtes avant d'aller plus loin ! Vous pouvez rendre votre installation d'Apache instable.
Note: Ces instructions ne fonctionneront qu'avec le serveur Web Apache fourni par Apple. Si vous recompilez ou mettez à jour votre installation d'Apache, vous devrez compiler votre propre module PHP.
Pour l'installer :
http://www2.entropy.ch/download/entropy-php-5.2.4-1.tar.gz
wget
http://www2.entropy.ch/download/entropy-php-5.2.4-1-apache2.tar.gz
C'est tout ! PHP doit maintenant être installé et doit fonctionner. Vous pouvez le tester en plaçant un fichier nommé test.php dans votre dossier Sites de votre répertoire personnel. Dans ce fichier, écrivez cette ligne : <?php phpinfo() ?>.
Maintenant, ouvrez-le en plaçant 127.0.0.1/~your_username/test.php dans votre navigateur Web favori. Vous devriez voir apparaître un tableau contenant les informations sur les modules PHP.
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. Windows 95 n'est plus supporté à partir de la version 4.3.0 de PHP.
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 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.
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 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.
Ce guide d'installation vous aide à installer manuellement et configurer PHP avec un serveur web sous Microsoft Windows. Pour commencer, vous devrez télécharger la distribution binaire Zip sur la page » http://www.php.net/downloads.php.
Bien qu'il existe beaucoup d'installeurs et que nous fournissons également un installeur pour Microsoft Windows, nous vous recommandons de prendre le temps de lire ceci et d'installer PHP vous-même, ce qui est la meilleur façon d'apprendre le système, et vous permettra d'installer des extensions PHP facilement lorsque vous en aurez besoin.
Note: Mise à jour d'une ancienne version de PHP
Les précédentes éditions de ce manuel vous suggéraient de déplacer les fichiers ini et les DLLs dans votre répertoire système (i.e dans le dossier C:\WINDOWS) et, de ce fait, vous aviez des fichiers relatifs à PHP dans de multiples dossiers sur votre disque dur. Nous vous conseillons d'effacer tous ces fichiers (comme php.iniet les bibliothèques DLLs relatives à PHP du dossier système de Windows), avant de commencer l'installation d'une nouvelle version de PHP. Assurez-vous d'avoir effectué des sauvegardes de ces bibliothèques DLLs, sinon, vous risquez de corrompte la totalité de votre système. L'ancien fichier php.ini peut également vous aider à configurer votre nouvelle installation de PHP. Et, comme vous l'apprendrez bientôt, la méthode préférée pour installer PHP est de garder tous les fichiers relatifs à PHP dans un seul dossier et d'avoir le dossier de disponible dans votre variable système PATH.
Note: Pré-requis MDAC
Si vous utilisez Microsoft Windows 9x/NT4, téléchargez la dernière version de Microsoft Data Access Components (MDAC) pour votre plate-forme. MDAC est disponible à » http://msdn.microsoft.com/data/. Cette condition existe car ODBC est compilé dans les binaires distribués pour Windows.
Les étapes suivantes doivent être terminées sur toutes les installations avant d'exécuter une quelconque instruction spécifique au serveur.
Décompressez la distribution dans un dossier de votre choix. Si vous installez PHP 4, extrayez le fichier zippé dans C:\ car il va créer un dossier comme php-4.3.7-Win32. Si vous installez PHP 5, extrayez le fichier zippé dans C:\php car il ne va pas créer de dossier principal, comme en PHP 4. Vous pouvez choisir un autre dossier, mais soyez prudent d'éviter les espaces dans le nom du chemin au dossier (comme C:\Program Files\PHP), sinon, certains serveurs web crasheront.
La structure du dossier que vous avez extrait depuis le fichier zippé est différente pour les versions 4 et 5 de PHP et ressemble à ceci :
Exemple #1 Structure de la distribution Windows de PHP 4
c:\php | +--cli | | | |-php.exe -- Executable CLI - UNIQUEMENT pour la ligne de commande | +--dlls -- DLL de support des extensions --> dossier systeme Windows | | | |-expat.dll | | | |-fdftk.dll | | | |-... | +--extensions -- extensions DLL pour PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--mibs -- fichiers de support de SNMP | +--openssl -- fichiers de support de Openssl | +--pdf-related -- fichiers de support de PDF | +--sapi -- DLL SAPI | | | |-php4apache.dll | | | |-php4apache2.dll | | | |-... | +--PEAR -- copie initiale de PEAR | | |-go-pear.bat -- script de configuration de PEAR | |-... | |-php.exe -- exécutable CGI | |-... | |-php.ini-dist -- paramètres par défaut du php.ini | |-php.ini-recommended -- paramètres recommandés du php.ini | |-php4ts.dll -- DLL principale | |-...
Ou :
Exemple #2 Structure du paquet PHP 5
c:\php | +--dev | | | |-php5ts.lib | +--ext -- extensions DLL pour PHP | | | |-php_bz2.dll | | | |-php_cpdf.dll | | | |-... | +--extras | | | +--mibs -- fichiers de support de SNMP | | | +--openssl -- fichiers de support de Openssl | | | +--pdf-related -- fichiers de support de PDF | | | |-mime.magic | +--pear -- copie initiale de PEAR | | |-go-pear.bat -- script de configuration de PEAR | |-fdftk.dll | |-... | |-php-cgi.exe -- exécutable CGI | |-php-win.exe -- permet d'exécuter des scripts sans ouvrir un fenêtre de prompt | |-php.exe -- exécutable CLI - UNIQUEMENT pour du script en ligne de commande | |-... | |-php.ini-dist -- paramètres par défaut du php.ini | |-php.ini-recommended -- paramètres recommandés du php.ini | |-php5activescript.dll | |-php5apache.dll | |-php5apache2.dll | |-... | |-php5ts.dll -- DLL principale | |-...
Notez les différences et les similitudes. PHP 4 et PHP 5 ont tous les deux un exécutable CGI, un exéctuable CLI et des modules serveurs, mais ils sont situés dans des dossiers différents et/ou ont des noms différents. En PHP 4, les modules serveurs se trouvent dans le dossier sapi, tandis qu'ils se trouvent dans le dossier principal en PHP 5. Le support des DLLs pour les extensions de PHP sont également dans le dossier principal en PHP 5. Observez l'arborescence pour connaître l'emplacement des exécutables CGI et CLI.
Note: En PHP 4, vous devez déplacer tous les fichiers se trouvant dans les dossiers dll et sapi dans le dossier principal (e.g. C:\php).
Voici une liste de modules serveur avec la correspondance entre PHP 4 et PHP 5.
sapi/php4activescript.dll (php5activescript.dll) - moteur ActiveScript vous permet d'intégrer PHP dans vos applications Windows.
sapi/php4apache.dll (php5apache.dll) - module Apache 1.3.x.
sapi/php4apache2.dll (php5apache2.dll) - module Apache 2.0.x.
sapi/php5apache2_2.dll - module Apache 2.2.x.
sapi/php4isapi.dll (php5isapi.dll) - module ISAPI pour les serveurs ISAPI compliant comme IIS 4.0/PWS 4.0 ou autres.
sapi/php4nsapi.dll (php5nsapi.dll) - module serveur Sun/iPlanet/Netscape.
sapi/php4pi3web.dll (pas d'équivalent en PHP 5) - module serveur Pi3Web.
Les modules serveurs permettent des gains de performances et quelques fonctionnalités supplémentaires par rapport à la version CGI. La version CLI est destinée à être utilisée pour les scripts en ligne de commande. Plus d'informations sur la version CLI est disponible dans le chapitre à propos "utilisez PHP en ligne de commande".
Les modules SAPI ont été significativement améliorés dans la version 4.1, mais vous pourrez rencontrer des erreurs avec le serveur ou d'autres modules (tels ASP), dans les systèmes plus anciens.
Les binaires CGI et CLI et les modules des serveurs web requierent tous la bibliothèque php4ts.dll (php5ts.dll). Vous devez vous assurer que ce fichier peut être trouvé par votre installation de PHP. Le dossier où ce fichier sera recherché suit ces règles :
Le même dossier depuis lequel le fichier php.exe est appelé ou, dans le cas où vous utilisez le module SAPI, le dossier du serveur web (e.g. C:\Program Files\Apache Group\Apache2\bin).
N'importe quel dossier de votre variable d'environnement PATH.
Pour rendre le fichier php4ts.dll / php5ts.dll disponible, vous avez trois options : copiez le fichier dans le dossier système de Windwos, copiez le fichier dans le dossier du serveur web ou ajoutez le dossier PHP, C:\php à votre variable d'environnement PATH. Pour une meilleur maintenance, nous vous conseillons de suivre la dernière option et d'ajoutez le dossier C:\php à votre variable d'environnement PATH, cela rendera plus facile la mise à jour de PHP dans le futur. Lisez l'entrée correspondante de la FAQ pour avoir plus d'informations sur la façon d'ajouter votre dossier PHP à la variable d'environnement PATH (et donc, n'oubliez pas de redémarrer votre ordinateur, une simple fermeture de session ne suffisant pas).
L'étape suivante est de définir une configuration valide pour PHP, php.ini. Il y a deux fichiers ini distribués avec le paquet zip, php.ini-dist et php.ini-recommended. Nous vous recommandons vivement d'utiliser le fichier php.ini-recommended, car nous avons optimisé les options par défaut dans ce fichier pour rendre PHP plus performant, plus sécurisé. Lisez ce document très attentivement car il contient des modifications depuis php.ini-dist qui affectent sérieusement votre configuration. Par exemple, display_errors est à off et magic_quotes_gpc est aussi à off. En complément de cette lecture, étudiez la configuration du fichier ini et définissez chacun des éléments manuellement. Si vous voulez avoir la meilleure sécurité, alors, c'est la seule façon pour vous, bien que PHP fonctionne très bien avec le fichier ini par défaut. Copiez le fichier ini de votre choix dans un dossier où PHP sera capable de le trouver et renommez-le en php.ini. PHP recherche un fichier php.ini dans les endroits décrits dans la section Le fichier de configuration.
Si vous utilisez Apache 2, l'option la plus simple est d'utiliser la directive PHPIniDir (lisez la page traitant de l'installation de PHP avec Apache 2) sinon, la meilleure option est de définir la variable d'environnement PHPRC. Ce processus est expliqué dans cette entrée de la FAQ.
Note: Si vous utilisez NTFS sous Windows NT, 2000, XP ou 2003, assurez-vous que l'utilisateur faisant fonctionner le serveur web a les permissions en lecture sur votre fichier php.ini (e.g. rendez-le lisible pour tout le monde).
Les étapes suivantes sont optionnelles :
Éditez votre nouveau fichier php.ini. Si vous avez prévu d'utiliser OmniHTTPd, ne suivez pas l'étape suivante. Définissez le paramètre doc_root de façon à ce qu'il pointe vers le document_root de votre serveur web. Par exemple :
doc_root = c:\inetpub\wwwroot // pour IIS/PWS doc_root = c:\apache\htdocs // pour Apache
PHP est maintenant installé sur votre système. L'étape suivante consiste à choisir un serveur web et le configurer pour y faire fonctionner PHP. Choisissez en un parmi ceux supportés.
Cette section contient des notes spécifiques à l'installation d'ActiveScript.
ActiveScript est une SAPI uniquement disponible sous Windows qui vous permet d'utiliser des scripts PHP dans l'importe quel hôte respectant ActiveScript comme Windows Scripts Host, ASP/ASP.NET, Windows Script Components ou encore Microsoft Scriptlet control.
Depuis PHP 5.0.1, ActiveScript a été déplacé dans le dépôt » PECL. Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Note: Vous devriez lire les étapes d'installation du manuel d'abord !
Après avoir installé PHP, vous devez télécharger la bibliothèque ActiveScript (php5activescript.dll) et la placer dans le dossier principal de PHP (e.g. C:\php).
Après avoir récupéré tous les fichiers nécessaires, vous devez enregistrer cette bibliothèque DLL sur votre système. Pour réaliser cela, ouvrez un prompt de commande Windows (qui se trouve dans le menu démarrer). Allez dans votre répertoire PHP en tapant quelque chose comme cd C:\php. Pour enregistrer cette bibliothèque DLL, tapez juste : regsvr32 php5activescript.dll.
Pour tester si ActiveScript fonctionne, créez un nouveau fichier, nommé test.wsf (l'extension est vraiment très importante) et tapez :
<job xml:id="test">
<script language="PHPScript">
$WScript->Echo("Bonjour le monde !");
</script>
</job>
Sauvegardez et double-cliquez sur le fichier. Si vous recevez une petite fenêtre disant "Bonjour le monde !", c'est que cela fonctionne.
Note: En PHP 4, le moteur était appelé 'ActivePHP', donc, si vous utilisez PHP 4, vous devez remplacer 'PHPScript' par 'ActivePHP' dans l'exemple ci-dessus.
Note: ActiveScript n'utilise pas le fichier php.ini par défaut. À la place, il regardera uniquement dans le répertoire où se trouve le .exe qui l'a chargé. Vous devez créer un fichier php-activescript.ini et le placer dans ce dossier si vous voulez charger des extensions, etc.
Cette section contient des notes sur l'installation de PHP avec IIS ( Microsoft Internet Information Server).
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.
PHP peut être installé en tant que binaire CGI ou en tant que module SAPI. Dans tous les cas, vous devez démarrer la console d'administration Microsoft (qui doit apparaître comme "Internet Services Manager", soit depuis le menu des options Pack de votre Windows NT 4.0 ou le menu 'Control Panel=>Administrative Tools' sous Windows 2000/XP). Faites alors un clic droit sur le noeud du serveur web (ceci doit apparaître comme "Default Web Server"), et sélectionnez "Properties".
Si vous voulez utiliser le binaire CGI, suivez ce qui suit :
Pour utiliser le module SAPI, faites ce qui suit :
Avec IIS 6 (2003 serveur), ouvrez le gestionnaire IIS, allez aux extensions de services web, choisissez "Add a new Web service extension", entrez-y un nom comme PHP, cliquez sur le bouton "Add" et pour la valeur, choisissez soit le fichier ISAPI (php4isapi.dll ou php5isapi.dll), soit le fichier CGI (php.exe ou php-cgi.exe), puis cochez "Set extension status to Allowed" et validez en cliquant sur OK.
Afin d'utiliser index.php en tant que page par défaut, faites ce qui suit : depuis l'onglet "Documents", choisissez "Add". Entrez-y index.php et validez en cliquant sur OK. Ajustez l'ordre en choisissant "Move Up" ou "Move Down". Ceci est similaire à la définition de "DirectoryIndex" sous Apache.
L'étape ci-dessus doit être répétée pour chaque extension qui doit être associée aux scripts PHP. .php est le plus courant, cependant .php3 peut être requis pour certaines applications.
Si vous atteignez 100 % d'utilisation du CPU après quelques minutes, désactivez l'option de configuration Cache ISAPI Application de IIS.
PWS 4 ne supporte pas ISAPI, uniquement PHP CGI doit être utilisé.
La méthode recommandée pour configurer ces serveurs est d'utiliser le fichier INF inclus dans la distribution (pws-php4cgi.reg dans le dossier SAPI pour PHP 4 ou pws-php5cgi.reg dans le dossier principal pour PHP 5). Vous pouvez éditer ce fichier, pour vous assurer que les extensions et les dossiers d'installation de PHP sont bien ceux de votre configuration. Ou alors, vous pouvez suivre les instructions suivantes pour le faire manuellement.
Ces instructions requièrent la manipulation du fichier de registre de Windows. Une erreur peut laisser votre système dans un état instable. Nous vous recommandons vivement de sauvegarder ce fichier en lieu sûr. L'équipe de développement et les traducteurs de cette documentation ne pourront pas être tenus responsable d'un quelconque dommage qui pourrait survenir dans votre registre.
Les étapes suivantes n'affectent pas la configuration du serveur web, et ne s'appliquent que si vous voulez que vos scripts PHP soient exécutés lorsqu'il sont exécutés en ligne de commande (par exemple, run C:\messcripts\test.php) ou en double-cliquant sur l'icône. Vous pouvez ignorer ces étapes si vous préférez que vos scripts PHP s'ouvrent dans un éditeur de texte, plutôt que de les voir s'exécuter lorsque vous double-cliquez dessus.
Les utilisateurs de PWS et IIS 3 sont prêts à utiliser leur serveur. Avec IIS 3, vous pouvez utiliser un » outil bien pratique de Steven Genusa pour configurer votre carte des scripts.
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, doivent ê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
Notez que la seconde ligne dans l'exemple ci-dessus peut être touvée dans l'actuelle version de votre httpd.conf, mais elle est commentée. Souvenez-vous également de faire correspondre le chemin c:/php/ à votre chemin actuel vers 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.0.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.x
Les utilisateurs d'Apache 2.2.x peuvent utiliser la documentation ci-dessous mise à part le fait que la bibliothèque est nommée php5apache2_2.dll et n'existe que depuis PHP 5.2.0. Voir aussi » http://snaps.php.net/
Nous ne recommandons pas l'utilisation de PHP dans un environnement threadé MPM, avec Apache 2. Utilisez le mode prefork MPM à la place, ou utilisez Apache 1. Pour savoir pourquoi, lisez l'entrée de la FAQ correspondante à l'utilisation d'Apache 2 dans un environnement threadé MPM.
Il est vivement recommandé de lire la » documentation Apache pour avoir une meilleure connaissance du serveur web Apache 2.0.x. Lisez également les » notes spécifiques à Windows pour Apache 2.0.x avant de lire cette documentation.
Note: Notes sur la compatibilité de PHP avec Apache 2.0
Les versions de PHP suivantes sont reconnues pour fonctionner avec la plus récente version d'Apache 2.0.x :
- PHP 4.3.0 ou plus récent, disponible à » http://www.php.net/downloads.php.
- Les dernières versions stables de développement. Le code source est disponible à » http://snaps.php.net/php5-latest.tar.gz, ou les exécutables compilés pour Windows à » http://snaps.php.net/win32/php5-win32-latest.zip.
- Une version non stable, téléchargeable sur » http://qa.php.net/.
- Vous pouvez obtenir PHP sur le » serveur CVS anonyme.
Ces versions de PHP sont compatibles avec Apache 2.0.40 et plus récent.
Le support des SAPI d'Apache 2.0 a commencé avec PHP 4.2.0. PHP 4.2.3 est connu pour fonctionner avec Apache 2.0.39. N'essayez pas d'utiliser cette version de PHP avec une autre version d'Apache 2.0. Cependant, nous vous recommandons de configurer PHP 4.3.0 ou supérieures avec la plus récente des versions d'Apache 2.
Toutes les versions de PHP mentionnées ici fonctionnent avec Apache 1.3.x.
Apache 2.0.x est conçu pour fonctionner sur Windows NT 4.0 et Windows 2000. Actuellement, le support des versions Windows 9x est incomplet. Apache 2.0 n'est pas prévu pour fonctionner sur ces plates-formes pour l'instant.
Téléchargez la version la plus récente de » Apache 2.0.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 deux méthodes pour que PHP fonctionne avec Apache 2.0.x sous Windows. La première est l'interface CGI, et l'autre est le module DLL Apache. Dans les deux cas, commencez par stopper le serveur Apache, éditez le fichier httpd.conf pour configurer Apache avec le support PHP et redémarrer Apache.
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, doivent être convertis en slashes, comme c:/repertoire/fichier.ext. Un slash final peut également être nécessaire pour les dossiers.
Vous devez insérer trois lignes à votre fichier de configuration Apache httpd.conf pour configurer le binaire CGI :
Exemple #1 PHP et Apache 2.0.x en mode 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"
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.
Vous devez insérer ces deux lignes à votre fichier de configuration Apache httpd.conf pour configurer le module PHP pour Apache 2.0.x :
Exemple #2 PHP et Apache 2.0.x en tant que module
# Pour PHP 4, faites quelques choses comme cela : LoadModule php4_module "c:/php/php4apache2.dll" # N'oubliez pas de copier le fichier php4apache2.dll depuis le dossier sapi ! AddType application/x-httpd-php .php # Pour PHP 5, faites quelques choses comme cela : LoadModule php5_module "c:/php/php5apache2.dll" AddType application/x-httpd-php .php # Configure le chemin vers le fichier php.ini PHPIniDir "C:/php"
Note: Souvenez-vous de remplacer votre chemin actuel vers PHP par c:/php/ dans l'exemple ci-dessus. Faites attention d'utiliser soit le fichier php4apache2.dll ou php5apache2.dll dans votre directive LoadModule et non pas php4apache.dll ou php5apache.dll sachant que les derniers sont conçus pour fonctionner avec Apache 1.3.x.
Note: Si vous voulez utiliser la négociation sur le contenu, lisez cette entrée de la FAQ.
Ne mélangez pas votre installation avec des fichiers DLL issus de versions différentes de PHP. Vous avez le seul choix d'utiliser le DLL et les extensions qui correspondent avec votre version téléchargée de 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"]
(PHP >= 4.3.3) Le paramètre php_ini est optionnel, mais si vous le définissez, vous pourrez placer votre fichier php.ini dans le dossier de configuration de votre serveur web.
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 ...]
(PHP >= 4.3.3) Comme paramètres supplémentaires, vous pouvez ajouter quelques valeurs spéciales du php.ini, par exemple, vous pouvez définir un docroot="/path/to/docroot" spécifique au contexte où php4_execute est appelé, non pas "On","Off",... (cela ne fonctionnerait pas correctement), e.g. zlib.output_compression=1 à la place de zlib.output_compression="On"
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>
Après cela, vous pouvez configurer un dossier dans l'administration du serveur et lui assigner le style x-httpd-php. Tous les fichiers s'y trouvant seront exécutés comme étant des scripts PHP. Cela peut être pratique pour cacher l'usage de PHP en renommant les fichiers en .html.
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...]
où XXX est le code d'erreur HTTP. Effacez toute autre directive Error qui pourrait interférer avec la vôtre. Si vous voulez utiliser une page pour toutes les erreurs qui existent, laissez le paramètre code vide. Votre script peut obtenir le code de statut HTTP dans la variable $_SERVER['ERROR_TYPE'].
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...]
Pour ces deux points, l'URI originale et l'URI traduite sont dans les variables $_SERVER['PATH_INFO'] et $_SERVER['PATH_TRANSLATED'].
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"
où XX est le numéro correct de la version de la DLL. Pour la connaître, regardez dans le server-root pour connaître le nom correct de la DLL. La DLL la plus grande en taille est la bonne.
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 pour installer PHP sur un serveur » OmniHTTPd sous Windows.
Note: Vous devriez lire les étapes d'installation du manuel d'abord !
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.
Vous devez réaliser les étapes suivantes pour configurer PHP sur votre serveur OmniHTTPd. C'est une configuration en exécutable CGI. SAPI est supporté par OmniHTTPd, mais des tests ont prouvé que ce n'est pas une solution stable.
Note: Important pour les utilisateurs CGI
Lisez la FAQ sur cgi.force_redirect pour plus de détails. Cette directive doit prendre la valeur de 0.
Installation du serveur OmniHTTPd.
Faites un clic droit sur l'icône bleue d'OmniHTTPd sur le système, et sélectionnez Properties
Cliquez sur Web Server Global Settings
Dans l'onglet 'External', entrez : virtual = .php | actual = c:\php\php.exe (utilisez php-cgi.exe si vous installez PHP 5), et utilisez le bouton "Add" (ajout).
Dans l'onglet Mime, entrez : virtual = wwwserver/stdcgi | actual = .php, et utilisez le bouton "Add" (ajout).
Cliquez sur OK
Répétez les étapes de 2 à 6 pour chaque extension que vous voulez associer à PHP.
Note: Certains paquets OmniHTTPd sont fournis avec le support de PHP. Vous pouvez le choisir au moment de l'installation, et décocher le composant PHP. Nous recommandons d'utiliser les dernières versions de PHP. Certains serveurs OmniHTTPd sont livrés avec des versions bêta de PHP, et il vaut donc mieux éviter de les installer, et choisir une autre version, stable. Si le serveur est déjà sur votre machine, utilisez le bouton "Replace" (remplacer) dans les étapes 4 et 5 pour configurer un nouveau PHP.
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
(Cette ligne suppose que PHP a été installé dans le dossier c:\php).
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.
Ce chapitre n'est plus à jour ; aussi, il a été temporairement supprimé du manuel. Pour le moment :
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émentaire 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 |
| 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 |
» 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 CVS 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ée 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 PHP4).
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 besoins 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'envoyez 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 CVS. 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.
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) :
L'endroit spécifique du module SAPI (la directive PHPIniDir d'Apache 2, l'option de la ligne de commande -cen CGI et en CLI, le paramètre php_ini en NSAPI, la variable d'environnement PHP_INI_PATH en THTTPD)
La variable d'environnement PHPRC. Avant PHP 5.2.0, cette variable était récupérée après la clé de registre mentionnée ci-dessous.
Depuis PHP 5.2.0, l'endroit où se trouve le fichier php.ini peut être définis pour différentes versions de PHP. Les clés de registre suivantes sont cherchées dans cet ordre : [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] and [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], où x, y et z signifie les versions majeures, mineures et normales. S'il y a une valeur pour IniFilePath dans ces clés, la première trouvée sera utilisée comme endroit où se trouve le fichier php.ini (uniquement sous Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP], valeur de IniFilePath (uniquement sous Windows).
Le dossier courant de travail (sauf pour CLI)
Le dossier du serveur web (pour les modules SAPI), ou le dossier contenant PHP (autrement sous Windows)
Le dossier Windows (C:\windows ou C:\winnt) (pour Windows), ou l'option de compilation --with-config-file-path lors de la compilation
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 fichier racine s'il existe.
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 CVS.
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".
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 |
| PHP_INI_PERDIR | La directive peut être modifiée dans les fichiers php.ini, .htaccess ou httpd.conf |
| 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.
Exemple #1 Exemple de configuration Apache
<IfModule mod_php5.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode on </IfModule> <IfModule mod_php4.c> php_value include_path ".:/usr/local/lib/php" php_admin_flag safe_mode 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().
Lorsque PHP traite un fichier, il cherche les balises d'ouvertures et de fermetures, qui délimitent le code qu'il doit interpréter. De cette manière, cela permet à PHP d'être intégré dans toutes sortes de documents, car tout ce qui se trouve en dehors des balises ouvrantes / fermantes de PHP est ignoré. La plupart du temps, vous verrez du code PHP dans des documents HTML, comme dans l'exemple ci-dessous.
Exemple #1 Code PHP dans un document HTML
<p>Ceci sera ignoré.</p>
<?php echo 'Alors que ceci sera analysé par PHP.'; ?>
<p>Ceci sera également ignoré.</p>
Vous pouvez également utiliser des structures plus avancées :
Exemple #2 Protections avancées
<?php
if ($expression) {
?>
<strong>Ceci est vrai.</strong>
<?php
} else {
?>
<strong>Ceci est faux.</strong>
<?php
}
?>
Ceci fonctionne comme prévu parce que lorsque PHP rencontre la balise fermante ?>, il commence simplement à afficher ce qu'il rencontre (mise à part s'il est immédiatement suivi d'une nouvelle ligne : voir l'instruction de séparation) jusqu'à ce qu'il rencontre une autre balise ouvrante. L'exemple ci-dessus est simple, bien sûr, mais pour afficher de gros bloc de textes, la mise à l'écart de ce type de bloc de l'analyseur de PHP est plus efficace que d'envoyer la totalité du texte en utilisant les fonctions 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 #3 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'ils 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 banni 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.
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 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 optionnel, 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 comment jusqu'à la fin de la ligne ou le bloc courant de code PHP, le premier des deux. 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 8 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 $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.
Note: Le type booléen a été introduit en PHP 4.
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, voici quelques opérateurs qui retournent 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 :
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 :
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 Z = {..., -2, -1, 0, 1, 2, ...}.
Voir aussi :
Les entiers peuvent être spécifiés en notation décimale (base 10), hexadécimale (base 16), ou octale (base 8), optionnellement précédée d'un signe (- ou +).
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.
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
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). 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 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.
<?php
$large_number = 2147483647;
var_dump($large_number);
// Affiche : int(2147483647)
$large_number = 2147483648;
var_dump($large_number);
// Affiche : float(2147483648)
// c'est vrai également pour les héxadécimaux compris entre 2^31 et 2^32-1:
var_dump( 0xffffffff );
// Affiche : float(4294967295)
// N'est pas vrai pour les héxadécimaux supérieures à 2^32-1:
var_dump( 0x100000000 );
// Affiche : int(2147483647)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// Affiche : float(50000000000)
?>
Malheureusement, il y a un bogue dans PHP qui fait que ceci ne fonctionne pas toujours correctement, lorsque des nombres négatifs sont demandés. Par exemple, le résultat de -50000 * $million est -429496728. Cependant, lorsque les 2 opérandes sont positives, il n'y a aucun problème.
Ceci a été résolu en PHP 4.1.0.
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), 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).
Typiquement, une simple fraction décimale comme 0.1 ou 0.7 ne peut être convertie en sa représentation binaire interne sans perte de précision. Ceci peut porter à confusion : par exemple, floor((0.1+0.7)*10) retournera 7 au lieu de 8 comme cela pourrait se prévoir, car la représentation interne serait quelque chose comme 7.9.
Ceci est dû au fait qu'il est impossible d'exprimer quelques fractions en une notation décimale avec une infinité de chiffres. Actuellement, 1/3, en décimal, devient 0.3.
Ainsi, ne faite jamais confiance aux derniers chiffres d'un nombre décimal, mais aussi, ne comparez jamais l'égalité de 2 nombres décimaux. Si vous avez besoin d'une haute précision, les fonctions mathématiques de précision et les fonctions gmp sont disponibles.
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. Depuis PHP 5, une notice est émise si un objet est converti en nombre décimal.
Une chaîne de caractères est une série de caractères. Avant PHP 6, un caractère est la même chose qu'un octet. Ainsi, il y a exactement 256 caractères différents. Ceci impliquait également que PHP n'avait pas de support natif pour l'Unicode. Voir les fonctions utf8_encode() et utf8_decode() pour des fonctionnalités Unicode simples.
Note: Ce n'est pas un problème pour une chaîne de caractères de devenir très grande. PHP n'impose pas de taille à une chaîne de caractères ; la seule limite est la mémoire disponible sur le système sous lequel PHP s'exécute.
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 guillemet simple (le caractère ').
Pour spécifier un guillemet simple littéral, vous devrez l'échapper d'un antislash (\). Pour spécifier un antislash littéral avant un guillemet simple, ou à la fin d'une chaîne de caractères, échappez-le deux fois (\\). Notez que si vous tentez d'échapper n'importe quel autre caractère, l'antislash s'affichera.
Note: Contrairement aux 2 autres syntaxes, les variables et les séquences échappées des caractères spéciaux ne seront pas traitées lorsqu'elles seront dans une chaîne de caractères entourée de simple guillemet.
<?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 dit : "I'll be back"
echo 'Arnold 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 guillemet double ("), PHP interprétera plus de séquences échappées pour les 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 or 0x0B (11) en ASCII) (depuis PHP 5.2.5) |
| \f | Saut de page (FF ou 0x0C (12) en ASCII) (depuis PHP 5.2.5) |
| \\ | Antislash |
| \$ | Signe dollars |
| \" | Guillemet double |
| \[0-7]{1,3} | La séquence de caractères correspondant à une expression régulière est un caractère, en notation octal |
| \x[0-9A-Fa-f]{1,2} | La séquence de caractères correspondant à une expression régulière est un caractère, en notation hexadécimale |
De la même façon que pour les chaînes entourées de simple guillemet, 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 guillemet double est que les noms de variables sont traité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, puis, une nouvelle ligne. La chaîne elle-même suit, puis, le même identifiant pour fermer la notation.
L'identifiant doit commencer la première colonne de la ligne. De plus, l'identifiant doit suivre les mêmes règles que n'importe quel 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 ne doit contenir aucun autre caractère, mise à part, éventuellement, un point-virgule (;). Cela signifie que l'identifiant ne doit pas être indenté, et 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 sur les systèmes Unix, incluant Mac OSX (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 membres 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 double guillemet, sans avoir de double guillemet. Cela signifie que les guillemets dans une syntaxe Heredoc n'ont pas besoin d'être échappés, mais les codes d'échappement listés ci-dessus peuvent toujours être utilisés. Les variables seront traitées mais les mêmes attentions doivent être prises lorsque vous utilisez des variables complexes dans une syntaxe Heredoc.
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': \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 arguments à 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 valerus 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;
}
?>
PHP 5.3.0 introduit aussi la possibilité pour Heredoc d'utiliser les guillemets doubles dans les déclarations :
Exemple #5 Utilisation des guillemets doubles avec Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
>
Note: Le support de la syntaxe Heredoc a été ajouté en PHP 4.
Nowdoc est aux chaînes entourées de guillemet simple ce qu'Heredoc est aux chaînes entourées de guillemet double. Nowdoc est spécifié de manière similaire à Heredoc, mut aucune analyse n'est effectuée dans une syntaxe Nowdoc. La construction est idéale pour embarquer du code PHP ou d'autres larges blocs de texte, sans avoir besoin d'échapper quoi que ce soit. Cette syntaxe partage les mêmes fonctionnalités que le constructeur 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 guillemet simple,e.g. <<<'EOT'. Toutes les règles concernant les identifiants Heredoc sont également appliquer aux identifiants Nowdoc, et tout spécialement, celles concernant l'apparence de l'identifiant.
Exemple #6 Exemple 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 membres ou de constantes de classe :
Exemple #7 Exemple avec des données statiques
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note: Le support Nowdoc a été ajouté en PHP 5.3.0.
Lorsqu'une chaîne de caractères est spécifié en guillemet double ou en Heredoc, les variables sont analysées.
Il y a 2 types de syntaxe : 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, un tableau ou un objet dans une chaîne avec un minimum d'effort.
La syntaxe complexe a été introduite en PHP 4, et se reconnaît en l'utilisation d'accolades autour de l'expression.
Si un signe dollars ($) est rencontré, l'analyse prendra autant de caractères que possible pour former un nom de variable valide. Si vous entourez un nom de variable par des accolades explicitement, alors le nom de la variable n'aura aucune ambiguïté.
<?php
$beer = 'Heineken';
echo "$beer's taste is great"; // fonctionne ; "'" est un caractère invalide pour les noms de variable
echo "He drank some $beers"; // ne fonctionne pas ; 's' est un caractère valide dans un nom de variable et la variable est en fait "$beer"
echo "He drank some ${beer}s"; // fonctionne
echo "He drank some {$beer}s"; // fonctionne
?>
De la même façon, l'index d'un tableau ou la propriété d'un objet peut être analysé. Avec les indices d'un tableau, les crochets (]) forment la fin de l'index. Les mêmes règles sont appliquées aux propriétés d'objet comme pour les simples variables.
<?php
// Ces exemples sont spécifiques à l'utilisation des tableaux dans des chaînes.
// Lorsqu'ils sont à l'extérieur d'une chaîne, quottez toujours les chaînes représentant
// les clés du tableau et n'utilisez pas d'{accolades}.
// Montre toutes les erreurs
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yellow');
// Fonctionne, mais notez que cela fonctionne différemment à l'extérieur d'une chaîne
echo "A banana is $fruits[banana].";
// Fonctionne
echo "A banana is {$fruits['banana']}.";
// Fonctionne, mais PHP cherche une constante nommée banana en premier, tel que décrit ci-dessous
echo "A banana is {$fruits[banana]}.";
// Ne fonctionne pas, utilisez des accolades. Ceci produira une erreur d'analyse.
echo "A banana is $fruits['banana'].";
// Fonctionne
echo "A banana is " . $fruits['banana'] . ".";
// Fonctionne
echo "This square is $square->width meters broad.";
// Ne fonctionne pas. Pour une solution, reportez-vous à la syntaxe complexe.
echo "This square is $square->width00 centimeters broad.";
?>
Pour tout ce qui est encore plus complexe, vous devriez utiliser la syntaxe complexe.
Cette syntaxe est appelée complexe, non pas par qu'elle est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.
En fait, n'importe quelle valeur d'un espace de nom peut être inclue dans une chaîne de caractères avec cette syntaxe. Écrivez simple l'expression de la même façon qu'elle devrait l'être à 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 {$. Quelques exemples pour être clair :
<?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
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 parceque 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 tableaux 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()}}";
?>
Note: Les appels de fonctions et de méthodes dans {$} fonctionnent depuis PHP 5.
On peut accéder et modifier les caractères 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 de voir une chaîne de caractères comme un tableau dans ce cas.
Note: On peut également accéder à une chaîne en utilisant des accolades, comme ceci : $str{42}. Cependant, cette syntaxe est obsolète depuis PHP 6. Utilisez les crochets à la place.
Écrire à une position hors de l'intervalle de l'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 positions invalides produisent une alerte E_NOTICE. Les positions négatives produisent une alerte E_NOTICE en écriture, mais lisent une chaîne vide. Seul le premier caractère d'une chaîne assignée est utilisée. Assigner une chaîne vide assigne le caractère NUL.
Exemple #8 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';
?>
Note: L'accès aux autres types de variables en utilisant [] ou {} retournera silencieusement NULL.
Une chaîne de caractères peut être concaténée en utilisant l'opérateur '.' (point). Notez que l'opérateur '+' (addition) ne fonctionnera pas. Reportez-vous aux opérateurs de chaîne pour plus d'informations.
Il y a beaucoup de fonctions utiles pour la manipulation de chaîne de caractères.
Reportez-vous à la section sur les fonctions des 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 recherches et des remplacements avancés.
Il y a également des fonctions pour les URL, et des fonctions pour chiffrer, déchiffrer les chaînes de caractères (mcrypt et mhash).
Et pour finir, reportez-vous aux 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 d'une 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 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ées. Reportez-vous également à la fonction settype().
La valeur booléenne TRUE est convertie en la chaîne "1". La 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 textuel (incluant la partie exponentielle 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éfinit dans la locale du script (catégorie LC_NUMERIC). Reportez-vous à la fonction setlocale().
Les tableaux sont toujours convertis en la chaîne "Array" ; ainsi, echo() et print() ne peuvent être utilisés pour afficher le contenu d'un tableau. Pour afficher un seul élément, utilisez un constructeur comme echo $arr['foo']. Voir ci-dessous pour des astuces permettant d'afficher le contenu complet.
Les objets en PHP 4 sont toujours convertis en la chaîne "Object". Pour afficher les valeurs des membres de l'objet (aux fins de déboguage, par exemple), lisez le paragraphes ci-dessous. Pour récupérer le nom de la classe de l'objet, utilisez la fonction get_class(). Depuis PHP 5, la méthode __toString est utilisée lorsqu'elle peut s'appliquer.
Les ressources sont toujours converties en la chaîne "Resource id #1", où 1 est le nombre unique assigné à la ressource par PHP au moment de l'exécution. Ne vous fiez pas à cette structure, il est possible qu'elle change. Pour récupérer le type de la ressource, utilisez la fonction get_resource_type().
NULL est toujours converti en une chaîne vide.
Au vue 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 la valeur contenue dans ce type. Reportez-vous aux fonctions print_r() et var_dump() pour plus d'informations sur le contenu de ces types.
La plupart des valeurs en PHP peuvent également être convertie 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 (et notamment 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 un caractère numérique valide, ce sera la valeur utilisée. Sinon, la valeur sera de 0 (zéro). Une valeur numérique valide est un signe optionnel, suivi par un ou plusieurs nombres (contenant, optionnellement, un point décimal), suivi par, éventuellement, un exponentiel. L'exponentiel est un 'e' ou 'E' suivi par un ou plusieurs nombres.
<?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 sur ces conversions, reportez-vous au manuel Unix de la fonction strtod(3).
Pour tester un exemple 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 possible en C. Utilisez la fonction ord() et la fonction chr() pour convertir les caractères en codes ASCII.
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éé avec le constructeur de langage array(). Il prend un nombre illimité de paramètres, chacun séparé par une virgule, sous la forme d'une paire clé => valeur.
array( clé => valeur , ... ) // clé ne peut être qu'un entier ou une chaîne de caractères // valeur peut être de n'importe quel type
<?php
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar
echo $arr[12]; // 1
?>
Une clé peut être soit un entier, soit une chaîne de caractères. Si une clé est une représentation standard d'un entier, elle sera interprétée comme telle (i.e. "8" sera interprété comme 8, alors que "08" sera interprétée comme "08"). Les nombres à virgule flottante, en tant que clé, seront tronqués en entier. Les tableaux indexés ou associatifs, en PHP, sont du même type ; ils peuvent ainsi contenir des indices sous la forme d'entier et de chaîne de caractères.
Une valeur peut être de n'importe quel type PHP.
<?php
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
?>
Si une clé n'est pas spécifiée pour une valeur, l'indice entier maximal sera pris et la nouvelle clé sera cette valeur, plus 1. Si une clé contient déjà une valeur associée, cette valeur sera écrasée.
<?php
// Ce tableau est identique à ...
array(5 => 43, 32, 56, "b" => 12);
// ...ce tableau
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
Avant PHP 4.3.0, le fait d'ajouter à un tableau une valeur, dont la précédent clé est négative, reproduisait le comportement ci-dessus. Depuis PHP 4.3.0, la nouvelle clé sera 0.
Utiliser TRUE comme clé sera évalué à l'entier 1. Utiliser FALSE comme clé sera évalué à l'entier 0. Utiliser NULL comme clé sera évalué à une chaîne de caractères vide. Utiliser une chaîne de caractères vide comme clé créera une clé (ou l'écrasera) vide et sa valeur ne sera pas la même si on utilise des parenthèses vides.
Les tableaux et les objets ne peuvent être utilisés comme clés. Si vous tentez de le faire, une message de type Alerte sera émis : Illegal offset type.
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. 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. 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 concerne 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 #1 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 #2 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 #3 Collection
<?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 #4 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 #5 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 #6 Trie 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 #7 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 objet en tableau fera que les propriétés seront les clés, et les valeurs correspondantes aux propriétés, les valeurs de ces clé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 correspondantes.
Note: Le type ressource a été introduit en PHP 4.
Voir aussi la fonction get_resource_type().
Sachant qu'une ressource représentant un fichier ouvert, une connexion à une base de données, une image, etc..., la conversion en une ressource n'a pas de sens.
Sachant que le système de comptage des références, introduit dans le moteur Zend PHP 4, une ressource qui n'a plus aucune référence est détectée automatiquement, et est libérée par le collecteur. Pour cette raison, il est rarement nécessaire de libérer la mémoire manuellement.
Note: Les liens 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.
Note: Le type null a été introduit en PHP 4.
Une variable est considérée comme null si :
elle s'est vu 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 le mot clé insensible à la casse NULL.
<?php
$var = NULL;
?>
Transtyper une variable vers null supprimera la variable et effacera sa valeur.
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).
Quelques fonctions comme call_user_func() ou usort() acceptent des fonctions de rappel définies par l'utilisateur comme paramètre. Les fonctions de rappel peuvent ne pas être de simples fonctions, mais aussi des méthodes d'objets, incluant des méthodes statiques.
Une fonction PHP est passée par son nom, comme une chaîne. N'importe quelle fonction interne ou définie par l'utilisateur peut être passée, excepté les constructeurs de langage comme : array(), echo(), empty(), eval(), exit(), isset(), list(), print() ou unset().
Une méthode d'un objet instancié est passée comme étant un tableau, contenant un objet à l'index 0 et le nom de la méthode à l'index 1.
Les méthodes de classe statique peuvent également être passées sans instanciation de l'objet, en passant le nom de la classe au lieu de l'objet à l'index 0.
Mise à part des fonctions définies par l'utilisateur, create_function() peut également être utilisée pour créer des fonctions de rappel anonymes. Depuis PHP 5.3.0, il est aussi possible de passer une fonction anonyme comme paramètre de rappel.
Exemple #1 Exemples de fonctions de rappel
<?php
// Un exemple de fonction de rappel
function ma_fonction_callback() {
echo 'Bonjour le monde !';
}
// Un exemple de méthode de rappel
class MaClasse {
static function maMethodeCallback() {
echo 'Bonjour le monde !';
}
}
// Type 1 : Rappel simple
call_user_func('ma_fonction_callback');
// Type 2 : Appel d'une méthode de classe statique
call_user_func(array('MaClasse', 'maMethodeCallback'));
// Type 3 : Appel d'une méthode d'objet
$obj = new MaClasse();
call_user_func(array($obj, 'maMethodeCallback'));
// Type 4 : Appel d'une méthode de classe statique (Depuis PHP 5.2.3)
call_user_func('MaClasse::maMethodeCallback');
// Type 5 : Appel d'une méthode de classe statique 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 de fonction anonyme comme fonction de rappel
<?php
// La fonction anonyme
$double = function($a) {
return $a * 2;
};
// Un intervalle de nombres
$numbers = range(1, 5);
// Utilise la fonction anoyme comme fonction de rappel
// pour doubler la taille de chaque élément
$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 est 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 à la section "Explication sur les références".
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 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. Si une valeur de type string est assignée à la variable $var, $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'ajout de l'opérateur '+'. Si une des opérandes est de type float, alors toutes les opérandes seront évaluées comme de types float, et le résultat sera de type float. Sinon, les opérandes seront interprétées comme integers, et le résultat sera également de type integer. Noter que cela ne modifie pas le type des opérandes ; 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 compliqués, 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, vu que 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 correct pour tous 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 ces caractères pour plus d'informations.
La modification de types en PHP fonctionne 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 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 fonctionnellement équivalents :
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Modification d'une chaîne littérale et de variables 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 doubles guillemets.
<?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 identique 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 fourni 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 celle 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étails 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
// déprécié.
echo $_POST['name'];
}
?>
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;
}
?>
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.
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;
// Plus disponible depuis PHP 6. 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.
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!\"). La protection des caractères est nécessaire pour l'insertion dans les bases de données. 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.
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 */
?>
Dans ce cas, l'analyseur croit voir la variable nommée $varname, suivie par l'opérateur de concaténation, et suivie encore par la chaîne sans guillemets (une chaîne sans guillemets et qui n'a pas de signification particulière). Visiblement, ce n'est pas ce qu'on attendait...
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 lettre, 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 TRUE et $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;
?>
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 sept 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é. Depuis PHP 4.0.2, __FILE__ contient toujours le chemin absolu pour les liens symboliques alors que les anciennes versions contenaient le chemin relatif, dans certaines circonstances. |
| __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. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la fonction comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. |
| __CLASS__ | Le nom de la classe courante. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la classe comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. |
| __METHOD__ | Le nom de la méthode courante. (Ajouté en PHP 5.0.0) 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.
Les utilisateurs de PHP/FI 2 ne verront aucun changement. Malgré tout, 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/FI 2 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. En PHP/FI 2, l'instruction '$a++' n'a aucune valeur (c'est-à-dire que ce n'est pas une expression) et vous ne pouvez donc pas l'utiliser. 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 que vous alimentez avec une ou plusieurs valeurs (ou expression, dans le jargon de programmation) qui retourne une autre valeur (donc que la construction elle-même devient une expression). Donc, vous pouvez penser aux fonctions ou constructions qui retournent une valeur (comme print()) comme opérateur et celles qui retournent rien du tout (comme echo()).
Il y a trois types d'opérateurs. Le premier, l'opérateur unaire, qui opère sur une seule valeur, par exemple ! (l'opérateur de négation) ou ++ (l'opérateur d'incrémentation). Le second groupe, les opérateurs binaires ; ce groupe contient la plupart des opérateurs supportés par PHP qui sont listés ci-dessous dans la section "La précédence des opérateurs".
Le troisième groupe est le groupe des opérateurs de terminaison : ?:. Ils doivent être utilisés pour choisir entre deux expressions dépendantes d'une troisième, plutôt que sélectionner deux phrases ou chemins d'exécution. Les expressions ternaires environnantes avec des parenthèses sont une très bonne idée.
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. Si la priorité d'opérateur est égale, l'associativité de gauche à droite est utilisée.
Le tableau suivant dresse une liste de la priorité des différents opérateurs dans un ordre décroissant de priorité. Les opérateurs sur une même ligne ont une priorité équivalente et, dans ce cas, leur association décide de l'ordre de leur évaluation.
| Associativité | Opérateurs | Information additionnelle |
|---|---|---|
| non-associative | clone new | clone et new |
| gauche | [ | array() |
| non-associatif | ++ -- | incrémentation/décrémentation |
| non-associatif | ~ - (int) (float) (string) (array) (object) (bool) @ | types |
| 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 | = += -= *= /= .= %= &= |= ^= <<= >>= | assignation |
| gauche | and | logique |
| gauche | xor | logique |
| gauche | or | logique |
| gauche | , | plusieurs utilisations |
L'associativité de gauche signifie que l'expression est évaluée de gauche à droite, l'associativité de droite, l'inverse.
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
?>
Utilisez les parenthèses pour augmenter la lisibilité du code.
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 entière (le résultat d'une division entière) si les deux opérandes sont entiers (ou bien des chaînes converties en entier).
Les opérandes du modulo sont converties en entiers (en supprimant la partie décimale) avant exécution.
Note: Souvenez-vous que $a % $b est négatif si $a est négatif.
Voir aussi le manuel sur les fonctions mathématiques.
L'opérateur d'assignation 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'assignation est la valeur assigné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.
?>
En plus du simple opérateur d'assignation, 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'assignation copie le contenu de la variable originale dans la nouvelle variable (assignation 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. L'assignation par référence est également supportée, en utilisant la syntaxe $var = &$othervar;. L'assignation par référence' signifie que les deux variables contiennent les mêmes données, et que la modification de l'une affecte l'autre et rien n'est copié nul part. Pour plus d'informations sur les références, lisez l'explication sur les références. Depuis PHP 5, les objets sont assignés par référence, sans une demande spécifique du contraire en utilisant le nouveau mot clé clone.
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 des 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 voulu 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 buts. 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, 'les bits de signe sont sortis');
$val = 4;
$places = (PHP_INT_SIZE * 8) - 2;
$res = $val << $places;
p($res, $val, '<<', $places, 'les bits de signe 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, 'les bits de signe 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 maintenant à 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 : les bits de signe sont sortis Expression : 0 = 4 << 30 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : bits shift out left side --- 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 : bits shift out left side, including sign bit
Résultat de l'exemple ci-dessus sur une machine 64 bits :
--- BIT SHIFT RIGHT ON POSITIVE INTEGERS --- 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 --- BIT SHIFT RIGHT ON NEGATIVE INTEGERS --- 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 : les bits de signe sont sortis Expression : 0 = 4 << 62 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : bits shift out left side --- 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 : bits shift out left side, including sign bit
N'effectuez pas de décalage à droite de plus de 32 bits sur les systèmes 32 bits. N'effectuez pas de décalage à droite 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. |
| $a === $b | Identique | TRUE si $a est égal à $b et qu'ils sont de même type (introduit en PHP 4). |
| $a != $b | Différent | TRUE si $a est différent de $b. |
| $a <> $b | Différent | TRUE si $a est différent de $b. |
| $a !== $b | Différent | TRUE si $a est différent de $b ou bien qu'ils ne sont pas du même type. (introduit en PHP 4) |
| $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 entier avec une chaîne, la chaîne est convertie en un nombre. Si vous comparez deux chaînes numériques, elles seront comparées en tant qu'entiers. Ces règles s'appliquent aussi à l'instruction switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> 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, la comparaison se fait de la même façon que pour les tableaux (PHP 4), PHP 5 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) |
| tableau | N'importe quoi | Le tableau est toujours plus grand |
| objet | N'importe quoi | L'objet 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.
Un autre opérateur conditionnel est l'opérateur ternaire (":?").
Exemple #2 Assignation 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'];
}
?>
L'expression (expr1) ? (expr2) : (expr3) est évaluée à expr2 si expr1 est évaluée à 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, est 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 dans les versions supérieures de PHP.
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 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 assigné à 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.
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 NULL n'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, et non pas celle du C. Par exemple, en Perl 'Z'+1 retourne 'AA', alors qu'en C, 'Z'+1 retourne '[' (ord('Z') == 90, donc ord('[') == 91). Notez que les variables de caractères peuvent être incrémentées, mais pas décrémentées et même seuls les caractères ASCII (a-z et A-Z) sont supportés.
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 appeler 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 que "or"
$e = false || true; // $e se vera assigner à (false || true), ce qui est true
$f = false or true; // $f se vera assigner à false
var_dump($e, $f);
// "&&" a une précédence supérieure à "and"
$g = true && false; // $g se vera assigner à (true && false), ce qui est false
$h = true and false; // $h se vera assigner à true
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'assignation concaténant (.=). Reportez-vous à opérateurs d'assignation 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 + ajoute les éléments du tableau de droite au tableau de gauche, sans pour autant écrasées les clés communes.
<?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);
?>
À l'exécution, le script affichera :
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 classe
<?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)
Il y a quelque piège à é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 #6 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é mais is_a() est depuis devenu 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.
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.
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";
}
?>
Les instructions après le else ne sont exécutées que si l'expression du if est FALSE, et si elle n'est pas suivi par l'expression elseif - uniquement si elles sont évaluées à FALSE (voir elseif).
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 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; 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 elsif et un else utilisant cette autre syntaxe :
<?php
if ($a == 5):
echo "a égal 5";
echo "...";
elseif ($a == 6):
echo "a égal 6";
echo "!!!";
else:
echo "a ne vaut ni 5 ni 6";
endif;
?>
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 de parenthèses 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 affiche est $i avant l'incrémentation
(post-incrémentation) */
}
/* exemple 2 */
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
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 l'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é.
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 pensez 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 < sizeof($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
Le problème se situe dans le deuxième argument de l'expression for. Ce code peut être lent parce qu'il doit caclculer 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 et en l'utilisant dans la boucle à la place de sizeof. L'exemple ci-dessous illustre ce cas :
<?php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0, $size = sizeof($people); $i < $size; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
?>
PHP 4 introduit une commande foreach, comme en Perl ou d'autres langages. C'est un moyen simple de passer en revue un tableau. foreach fonctionne uniquement sur les tableaux, et retournera une erreur si vous tentez de l'utiliser sur une variable d'un autre type ou non initialisée. Il y a deux syntaxes possibles : la seconde est une extension mineure mais pratique de la première.
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 deuxième forme fait exactement la même chose, mais c'est la clé de l'élément courant qui est assigné à la variable $key.
Depuis PHP 5, il est possible d' itérer également des objets.
Note: Lorsque foreach démarre, le pointeur interne de fichier est automatiquement ramené au premier élément du tableau. Cela signifie que vous n'aurez pas à faire appel à reset() avant foreach.
Note: A moins que le tableau soit une référence, foreach opère sur une copie du tableau spécifié et non sur le tableau lui-même. foreach affecte le pointeur interne du tableau. Ne l'utilisez pas sans le remettre à zéro avant.
Depuis PHP 5, 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); // Stop la référence sur le dernier élément
?>
Ceci n'est possible que si le tableau itéré peut être référencé (i.e. est une variable), ce qui signifie que le code suivant ne fonctionne 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";
}
?>
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 ont été 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;
}
}
?>
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 ont été ignorées.
<?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 la valeur de retour de l'appel à print() est int(1), et cela se comportera alors comme si on avait fournit l'argument optionnel mentionné plus haut.
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 vous devez utiliser continue 2.
Note: Notez que switch/case provoque une perte de comparaison.
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'affiche 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és. 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;
}
?>
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éclaration 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. En PHP 6.0, la directive encoding sera utilisée pour dire au scanner dans quel encodage le fichier a été créé. Les valeurs valables sont des noms d'encodage tels que UTF-8.
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 include() ou require(), alors le contrôle est rendu au script appelant, et la valeur retournée sera utilisée comme résultat de la fonction 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: 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).
require() est identique à include() mise à part le fait que lorsqu'une erreur survient, il produit une erreur fatale de type E_ERROR. En d'autres termes, il stoppera le script alors que include() n'émettra qu'une alerte de type E_WARNING, ce qui permet au script de continuer.
Voir la documentation de include() pour en connaître son fonctionnement.
La fonction include() inclut et exécute le fichier spécifié en argument.
Cette documentation s'applique aussi à la fonction require(). Les deux structures de langage sont identiques, hormis dans leur gestion des erreurs. Ils produisent tous les deux une Alerte mais require() génère une erreur fatale. En d'autres termes, n'hésitez pas à utiliser require() si vous voulez qu'un fichier d'inclusion manquant interrompe votre script. include() ne se comporte pas de cette façon, et le script continuera son exécution. Assurez-vous d'avoir bien configuré le include_path aussi. Soyez prévenus qu'une erreur d'analyse dans un fichier inclut ne cause pas l'arrêt du script en PHP dans les versions antérieures à 4.3.5. Depuis ces versions, il le peut.
Les fichiers à inclure sont d'abord recherchés dans chaque dossier de include_path, relativement au dossier courant, puis dans le dossier de travail du script. Par exemple, si include_path est ., que le dossier de travail est /www/, et que vous incluez le fichier include/a.php et qu'il y a une instruction include "b.php" dans ce fichier, alors b.php est d'abord recherché dans /www/libraries/, puis dans /www/include/. Si le nom du fichier commence par ./ ou ../, il est cherché uniquement dans le dossier courant d'exécution ou dans le dossier parent, respectivement.
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
$color = 'verte';
$fruit = 'pomme';
?>
test.php
<?php
echo "Une $couleur $fruit"; // Une
include 'vars.php';
echo "Une $couleur $fruit"; // Une verte pomme
?>
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 $couleur $fruit";
}
/* vars.php est dans le contexte de foo() *
* donc $fruit n'est pas disponibles hors de *
* cette fonction. $couleur l'est, car c'est *
* une variable globale */
foo(); // Une verte pomme
echo "Une $couleur $fruit"; // 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'URL sont activés dans PHP (ce qui est le cas par défaut), vous pouvez localiser le fichier avec une URL (via HTTP ou bien avec un gestionnaire adapté : voir Liste des protocoles 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 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 : il est possible d'exécuter une commande return() dans un fichier inclus pour en terminer le traitement et retourner au fichier appelant. De plus, il est possible de retourner des valeurs des fichiers inclus. Vous pouvez prendre et traiter la valeur retournée par la fonction, comme toute autre fonction. Ce n'est cependant pas possible lors de l'inclusion de fichier distant à moins que le fichier distant a des balises valides de début et de fin de script PHP (comme avec les fichiers locaux). Vous pouvez déclarer les variables nécessaire dans ces tags 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, évaluer 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, tandis que PHP 4 ne se plaindra pas des 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;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
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.
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'inclus 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.
La commande 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 fonction 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 fonction include() pour plus de détails sur le fonctionnement de cette fonction.
Note: En PHP 4, require_once() et include_once() sont insensibles à la casse sous les systèmes comme Windows.
Exemple #1 include_once() est 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.
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 suivi 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 rendu
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 deux ( liste variable d'arguments de fonction et 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);
?>
L'exemple ci-dessus va afficher :
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Des informations peuvent être passées à une fonction en utilisant une liste d'arguments, dont chaque expression est séparée par une virgule.
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));
?>
L'exemple ci-dessus va afficher :
2 + 3 = 5
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;
?>
L'exemple ci-dessus va afficher :
Ceci est une chaîne, et un peu plus.
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");
?>
L'exemple ci-dessus va afficher :
Préparation d'une tasse de cappuccino avec les mains. Préparation d'une tasse de cappuccino, lavazza avec 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 à valeur par défaut doivent être en premier : 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 :
PHP Warning: Missing argument 2 for faireunyaourt(), called on line 2 Warning: Missing argument 2 for faireunyaourt(), called on line 2 Préparer un bol de framboise .
Maintenant comparons l'exemple précédent avec l'exemple suivant :
Exemple #6 Les arguments à valeur par défaut doivent être en premier : 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: Depuis PHP 5, les valeurs par défaut peuvent être passées par référence.
PHP 4 et suivants supportent 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'argument 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.
Exemple #1 Utilisation de return()
<?php
function carre ($num)
{
return $num * $num;
}
echo carre (4);
?>
L'exemple ci-dessus va afficher :
16
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);
?>
L'exemple ci-dessus va afficher :
int(0) int(1) int(2)
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 une méthode 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()
?>
Voir aussi 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 NULL mais 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 fonction 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');
?>
L'exemple ci-dessus va afficher :
outputs bonjourLeMonde
Les fermetures 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');
?>
L'exemple ci-dessus va afficher :
outputs bonjourLeMonde
Les fermetures peuvent hériter des variables du contexte de leur parent. Ces variables doivent alors être déclaré 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, quelque que soit la fonction qui s'exécute. Le contexte parent d'une fermeture est la fonction dans laquelle la fonction a été déclaré (par nécessairement la fonction 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 produite. 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";
?>
L'exemple ci-dessus va afficher :
54.54
Les fonctions anonymes sont actuellement implémentée en utilisant la classe Closure. C'est un détail d'implémentation, et il est recommandé de ne pas s'appuyer dessus.
Note: Les fonctions anonymes sont disponibles depuis PHP 5.3.0.
Note: Il est possible d'utiliser les fonctions func_num_args(), func_get_arg() et func_get_args() dans une fermeture.
Une classe est une collection de variables et de fonctions qui fonctionnent avec ces variables. Les variables sont définies par l'élément var et les fonctions par function. Une classe est définie en utilisant la syntaxe suivante :
<?php
class Panier {
// Eléments de notre panier
var $items;
// Ajout de $num articles de type $artnr au panier
function add_item($artnr, $num) {
$this->items[$artnr] += $num;
}
// Suppression de $num articles du type $artnr du panier
function remove_item($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} elseif ($this->items[$artnr] == $num) {
unset($this->items[$artnr]);
return true;
} else {
return false;
}
}
}
?>
L'exemple ci-dessus définit la classe Panier qui est composée d'un tableau associatif contenant les articles du panier et de deux fonctions, une pour ajouter et une pour enlever des éléments au panier.
Vous NE POUVEZ PAS couper la définition d'une classe en plusieurs fichiers. De la même façon, vous NE POUVEZ PAS couper la définition d'une classe en de multiples blocs, à moins que la coupure ne soit à l'intérieur de la déclaration d'une méthode. Ce qui suit ne fonctionnera pas :
<?php
class test {
?>
<?php
function test() {
print 'OK';
}
}
?>
Néanmoins, ce qui suit est autorisé :
<?php
class test {
function test() {
?>
<?php
print 'OK';
}
}
?>
Les notes suivantes ne sont valables que pour PHP 4.
Le nom stdClass est utilisé en interne par Zend et ne doit pas être utilisé. Vous ne pouvez pas nommer une classe stdClass en PHP.
Les noms de fonctions __sleep et __wakeup sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de fonctions dans vos classes, à moins que vous ne souhaitiez utiliser la magie qui y est associée.
PHP se réserve l'usage de tous les noms de fonctions commençant par __, pour sa propre magie. Il est vivement recommandé de ne pas utiliser des noms de fonctions commençant par __, à moins que vous ne souhaitiez utiliser la magie qui y est associée.
En PHP 4, seuls les initialiseurs constants pour les variables var sont autorisés. Utilisez les constructeurs pour les initialisations variables, ou utilisant des expressions.
<?php
/* Aucune de ces syntaxes ne fonctionnera en PHP 4 */
class Panier {
var $date_du_jour = date("d/m/Y");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
var $items = array("DVD", "Télé","Magnétoscope");
}
/* Voici comment cela doit se faire désormais. */
class Panier {
var $date_du_jour;
var $name;
var $owner;
var $items;
function Panier() {
$this->date_du_jour = date("d/m/Y");
$this->name = $GLOBALS['firstname'];
/* etc. */
}
}
?>
Les classes forment un type de variable. Pour créer une variable du type désiré, vous devez utiliser l'opérateur new.
<?php
$cart = new Panier;
$cart->add_item("10", 1);
$another_cart = new Panier;
$another_cart->add_item("0815", 3);
?>
L'instruction ci-dessus crée l'objet $cart et $another_cart de la classe Panier. La fonction add_idem() de l'objet $cart est appelée afin d'ajouter l'article numéro 10 dans $cart. Trois articles numéro 0815 sont ajoutés au panier $another_cart.
$cart et $another_cart disposent des fonctions add_item(), remove_item() et de la variable items. Ce sont des fonctions et variables distinctes. Vous pouvez vous représenter les objets comme des dossiers sur votre disque dur. Vous pouvez avoir deux fichiers lisez-moi.txt sur votre disque dur, tant qu'ils ne sont pas dans le même répertoire. De même que vous devez alors taper le chemin complet jusqu'au fichier, vous devez spécifier le nom complet de la méthode avant de l'employer : en termes PHP, le dossier racine est l'espace de nom global, et le séparateur de dossier est ->. Par exemple, les noms $cart->items et $another_cart->items représentent deux variables distinctes. Notez que le nom de la variable est alors $cart->items, et non pas $cart->$items : il n'y a qu'un seul signe $ dans un nom de variable.
<?php
// correct, le signe $ est unique
$cart->items = array("10" => 1);
// incorrect, car $cart->$items devient $cart->""
$cart->$items = array("10" => 1);
// correct, mais risque de ne pas se comporter comme prévu
// $cart->$myvar devient $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);
?>
À l'intérieur d'une définition de classe, vous ne savez pas le nom de la variable à partir duquel l'objet sera accessible dans le script. On ne peut prévoir que l'objet créé sera affecté à la variable $cart, $another_cart ou quelque chose d'autres. Donc, vous ne pouvez pas utiliser la syntaxe $cart->items. Mais pour pouvoir accéder aux méthodes et membres d'un objet, vous pouvez utiliser la variable spéciale $this, qui peut s'interpréter comme "moi-même", ou bien "l'objet courant". Par exemple, '$this->items[$artnr] += $num' peut se lire comme 'ajouter $num au compteur $artnr de mon propre tableau de compteur' ou bien 'ajouter $num au compteur $artnr du tableau de compteurs de l'objet courant'.
Note: La pseudo-variable $this n'est pas toujours définie si la méthode dans laquelle elle est présente est appelée statiquement. Cependant, ceci n'est pas une règle stricte : $this est définie si une méthode est appelée statiquement depuis un autre objet. Dans ce cas, la valeur de $this vaut l'objet appelé. Ce comportement est illustré dans l'exemple ci-dessous :
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this est défini (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this n'est pas défini.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>L'exemple ci-dessus va afficher :
$this est défini (a) $this n'est pas défini. $this est défini (b) $this n'est pas défini.
Note: Il y a des fonctions très pratiques pour gérer les classes et objets. Vous pouvez étudier le chapitre sur les fonctions de classes et objets.
Souvent, vous aurez besoin d'une classe avec des méthodes et fonctions similaires à une autre classe. En fait, il est bon de définir des classes génériques, qui pourront être réutilisées et adaptées à tous vos projets. Pour faciliter cela, une classe peut être une extension d'une autre classe. La classe dérivée hérite alors de toutes les méthodes et variables de la classe de base (cet héritage a de bien que personne ne meurt pour en profiter), mais peut définir ses propres fonctions et variables, qui s'ajouteront. Une classe ne peut hériter que d'une seule autre classe, et l'héritage multiple n'est pas supporté. Les héritages se font avec le mot clé 'extends'.
<?php
class Panier_nomme extends Panier {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
L'exemple ci-dessus définit la classe Panier_nomme qui possède les mêmes variables que la classe Panier et la variable $owner en plus, ainsi que la fonction set_owner(). Vous créez un panier nominatif de la même manière que précédemment, et vous pouvez alors affecter un nom au panier ou en connaître le nom. Vous pouvez de toutes les façons utiliser les mêmes fonctions que sur un panier classique.
<?php
$ncart = new Panier_nomme; // Création d'un panier nominatif
$ncart->set_owner ("kris"); // Affectation du nom du panier
print $ncart->owner; // Affichage du nom du panier
$ncart->add_item ("10", 1); // (héritage des fonctions de la classe père)
?>
Ceci est également appelé une relation "parent-enfant". Vous créez une classe parent, et utilisez extends pour créer une nouvelle classe basée sur la classe parent : la classe enfant. Vous pouvez toujours utiliser cette nouvelle classe enfant et en créer une nouvelle basée sur cette classe enfant.
Note: Les classes doivent être définies avant d'être utilisées ! Si vous voulez que la classe Named_Cart étende la classe Cart, vous devez d'abord définir la classe Cart. Si vous voulez créer une autre classe appelée Yellow_named_cart, basée sur la classe Named_Cart, vous devez d'abord définir la classe Named_Cart. Pour faire court : l'ordre dans lequel les classes sont définies est important.
Le constructeur est la fonction qui est appelée automatiquement par la classe lorsque vous créez une nouvelle instance d'une classe à l'aide de l'opérateur new. La fonction constructeur a le même nom que la classe. Une fonction devient le constructeur si elle porte le même nom que la classe. Si une classe n'a pas de constructeur, le constructeur de la classe de base sera appelé, s'il existe.
<?php
class Auto_Panier extends Panier {
function Auto_Panier () {
$this->add_item ("10", 1);
}
}
?>
L'exemple ci-dessus définit la classe Auto_Panier qui hérite de la classe Panier et définit le constructeur de la classe. Ce dernier initialise le panier avec 1 article de type numéro 10 dès que l'instruction new est appelée. La fonction constructeur peut prendre ou non des paramètres optionnels, ce qui la rend beaucoup plus pratique. Pour pouvoir utiliser cette classe sans paramètre, tous les paramètres du constructeurs devraient être optionnels, en fournissant une valeur par défaut, comme ci-dessous.
<?php
class Constructor_Cart extends Cart {
function Constructor_Cart($item = "10", $num = 1) {
$this->add_item ($item, $num);
}
}
// Création du Panier
$default_cart = new Constructor_Cart;
// Création d'un vrai Panier
$different_cart = new Constructor_Cart("20", 17);
?>
Vous pouvez également utiliser l'opérateur @ pour empêcher les erreurs survenant dans le constructeur de s'afficher, e.g. @new.
<?php
class A
{
function A()
{
echo "Je suis le constructeur de A.<br />\n";
}
function B()
{
echo "Je suis une fonction standard appelée B dans la classe A.<br />\n";
echo "Je ne suis pas le constructeur de A.<br />\n";
}
}
class B extends A
{
}
// Cette syntaxe va appeler B() comme constructeur.
$b = new B;
?>
La fonction B() de la classe A va soudainement devenir le constructeur de la classe B, bien qu'il n'ait pas été prévu pour. PHP 4 ne se soucie guère si la fonction est définie dans la classe B ou si elle a été héritée.
PHP n'appelle pas automatiquement le constructeur de la classe supérieure depuis le constructeur de la classe dérivée. Il est de votre responsabilité de propager l'appel des constructeurs.
Les destructeurs sont des fonctions qui sont appelées lorsqu'un objet est détruit, soit avec la fonction unset() soit par simple sortie d'une fonction (cas des variables locales). Il n'y a pas de destructeurs en PHP. Vous devez utiliser la fonction register_shutdown_function() à la place pour simuler la plupart des effets des destructeurs.
La documentation suivante n'est valable que pour PHP 4 et plus récent.
Parfois, il est pratique de faire référence aux fonctions et variables d'une classe de base, ou bien d'utiliser des méthodes de classes qui n'ont pas encore d'objets créés. L'opérateur :: est là pour ces situations.
<?php
class A {
function example() {
echo "Je suis la fonction originale A::example().<br />\n";
}
}
class B extends A {
function example() {
echo "Je suis la fonction redéfinie B::example().<br />\n";
A::example();
}
}
// Il n'y a pas d'objets de classe A.
// L'affichage est :
// Je suis la fonction originale A::example().<br />
A::example();
// Création d'un objet de la classe B.
$b = new B;
// L'affichage est :
// Je suis la fonction redéfinie B::example().<br />
// Je suis la fonction originale A::example().<br />
$b->example();
?>
Les exemples ci-dessus appellent la fonction example() dans la classe A, mais il n'y a pas encore d'objet de classe A, alors il n'est pas possible d'écrire $a->example(). À la place, on appelle la fonction example() comme une fonction de classe, c'est-à-dire avec le nom de la classe elle-même, et sans objet.
Il y a des fonctions de classe, mais pas de variables de classe. En fait, il n'y a aucun objet au moment de l'appel de la fonction. Donc, une fonction de classe ne peut accéder à aucune variable (mais elle peut accéder aux variables locales et globales). Il faut proscrire l'utilisation de $this.
Dans l'exemple ci-dessus, la classe B redéfinit la fonction example(). La définition originale dans la classe A est remplacée par celle de B, et n'est plus accessible depuis B, à moins que vous n'appeliez spécifiquement la fonction example() de la classe A avec l'opérateur ::. Écrivez A::example() pour cela (en fait, il faudrait écrire parent::example(), comme expliqué dans la section suivante).
Dans ce contexte, il y a un objet courant, qui peut avoir d'autres variables objets. De ce fait, lorsqu'il est utilisé depuis une méthode d'un objet, vous pouvez utiliser $this.
Il arrive que vous ayez à écrire du code qui faire référence aux variables et fonctions des classes de base. C'est particulièrement vrai si votre classe dérivée est une spécialisation de votre classe de base.
Au lieu d'utiliser le nom littéral de votre classe de base dans votre code, vous pouvez utiliser le mot réservé parent, qui représente votre classe de base (celle indiqué par extends, dans la déclaration de votre classe). En faisant cela, vous évitez d'appeler le nom de votre classe de base directement dans votre code. Si votre héritage change, vous n'aurez plus qu'à modifier le nom de la classe dans la déclaration extends de votre classe.
<?php
class A {
function example() {
echo "Je suis A::example() et je fournis une fonctionnalité de base.<br />\n";
}
}
class B extends A {
function example() {
echo "Je suis B::example() et je fournis une fonctionnalité supplémentaire.<br />\n";
parent::example();
}
}
$b = new B;
// Cette syntaxe va appeler B::example(), qui, à sont tour, va appeler A::example().
$b->example();
?>
serialize() retourne une chaîne représentant une valeur qui peut être stockée dans les sessions de PHP, ou une base de données. unserialize() peut relire cette chaîne pour recréer la valeur originale. serialize() va sauver toutes les variables d'un objet. Le nom de la classe sera sauvé mais par les méthodes de cet objet.
Pour permettre à unserialize() de lire un objet, la classe de cet objet doit être définie. C'est-à-dire, si vous avez un objet $a de la classe A dans une page php1.php, et que vous le linéarisez avec serialize(), vous obtiendrez une chaîne qui fait référence à la classe A, et contient toutes les valeurs de $a. Pour pouvoir le relire avec la fonction unserialize() dans une page page2.php, recréé la variable $a de la classe A, il faut que la définition de la classe A soit présente dans page2.php. Cela peut se faire de manière pratique en sauvant la définition de la classe A dans un fichier séparé, et en l'incluant dans les deux pages page1.php et page2.php.
<?php
// classa.inc:
class A {
var $one = 1;
function show_one() {
echo $this->one;
}
}
// page1.php:
include("classa.inc");
$a = new A;
$s = serialize($a);
// enregistrez $s où la page2.php pourra la trouver.
$fp = fopen("store", "w");
fwrite($fp, $s);
fclose($fp);
// page2.php:
// Ceci est nécessaire pour que unserialize() fonctionne correctement
include("classa.inc");
$s = implode("", @file("store"));
$a = unserialize($s);
// maintenant, utilisez la méthode show_one de l'objet $a.
$a->show_one();
?>
Si vous utilisez les sessions et la fonction session_register() pour sauver des objets, ces objets seront linéarisés automatiquement avec la fonction serialize() à la fin de chaque script, et relus avec unserialize() au début du prochain script. Cela signifie que ces objets peuvent apparaître dans n'importe quelle page qui utilise vos sessions.
Il est vivement recommandé d'inclure la définition de classe dans toutes vos pages, même si vous n'utilisez pas ces classes dans toutes vos pages. Si vous l'oubliez et qu'un tel objet est présent, il perdra sa classe, et deviendra un objet de classe __PHP_Incomplete_Class_Name sans aucune fonction et, donc, plutôt inutile.
Si, dans l'exemple ci-dessus, $a devient un objet de session avec l'utilisation de session_register("a"), vous devez penser à inclure le fichier classa.inc dans toutes vos pages, et pas seulement page1.php et page2.php.
serialize() s'assure que votre classe a une méthode avec le nom magique __sleep. Si c'est le cas, cette fonction est appelée avant toute linéarisation. Elle peut alors nettoyer l'objet et on s'attend à ce qu'elle retourne un tableau avec la liste des noms de variables qui doivent être sauvées. Si la méthode ne retourne rien, alors NULL est linéarisé et une alerte de type E_NOTICE sera émise.
Le but avoué de __sleep est de valider les données en attente ou d'effectuer des opérations de nettoyage. Cette fonction est aussi pratique si vous avez de très grands objets qui n'ont pas besoin d'être sauvés entièrement.
À l'inverse, unserialize() s'assure de la présence de la fonction magique __wakeup. Si elle existe, cette fonction reconstruit toutes les ressources d'un objet.
Le but de cette fonction __wakeup est de rétablir toutes les connexions aux bases de données, et de recréer les variables qui n'ont pas été sauvées.
Créer des références dans un constructeur peut conduire à des résultats étranges. Ce tutoriel vous guide pour éviter ces problèmes.
<?php
class Foo {
function Foo($name) {
// crée une référence dans le tableau global $globalref
global $globalref;
$globalref[] = &$this;
// donne le nom de la variable
$this->setName($name);
// et l'affiche
$this->echoName();
}
function echoName() {
echo "<br />", $this->name;
}
function setName($name) {
$this->name = $name;
}
}
?>
Vérifions maintenant qu'il y a une différence entre $bar1 qui a été créé avec = et $bar2 qui a été créé avec l'opérateur de référence =& :
<?php
$bar1 = new Foo('crée dans le constructeur');
$bar1->echoName();
$globalref[0]->echoName();
/* affiche :
crée dans le constructeur
crée dans le constructeur
crée dans le constructeur */
$bar2 =&new foo('crée dans le constructeur');
$bar2->echoName();
$globalref[1]->echoName();
/* affiche :
crée dans le constructeur
crée dans le constructeur
crée dans le constructeur */
?>
Apparemment, il n'y a pas de différence, mais en fait, il y en a une significative : $bar1 et $globalref[0] ne sont pas référencées, ces deux variables sont différentes. Cela est dû au fait que l'opérateur new ne retourne par de référence, mais retourne une copie.
Note: Il n'y a aucune perte de performances (puisque PHP 4 utilise un compteur de références) à retourner des copies au lieu de références. Au contraire, il est souvent mieux de travailler sur les copies plutôt que sur les références, car créer une référence prend un peu plus de temps que de créer une copie qui ne prend virtuellement pas de temps (à moins de créer un tableau géant ou un objet monstrueux, auquel cas il est préférable de passer par des références).
Pour prouver ceci, regardez le code suivant :
<?php
// maintenant, nous allons changer de nom. Qu'attendez-vous ?
// Vous pouvez vous attendre à ce que les deux variables $bar
// et $globalref[0] changent de nom...
$bar1->setName('modifié');
// comme prédit, ce n'est pas le cas
$bar1->echoName();
$globalref[0]->echoName();
/* affiche :
modifié
crée dans le constructeur
*/
// quelle est la différence entre $bar2 et $globalref[1]
$bar2->setName('modifié');
// Heureusement, elles sont non seulement égales, mais
// elles représentent la même variable.
// donc $bar2->Name et $globalref[1]->Name sont les mêmes
$bar2->echoName();
$globalref[1]->echoName();
/* affiche :
modifié
modifié */
?>
Un dernier exemple pour bien comprendre.
<?php
class A {
function A($i) {
$this->value = $i;
// Essayez de comprendre on n'a pas besoin de
// référence ici
$this->b = new B($this);
}
function createRef() {
$this->c = new B($this);
}
function echoValue() {
echo "<br />","class ",get_class($this),': ',$this->value;
}
}
class B {
function B(&$a) {
$this->a = &$a;
}
function echoValue() {
echo "<br />","class ",get_class($this),': ',$this->a->value;
}
}
// Essayez de comprendre pourquoi une copie simple va
// conduire à un résultat indésirable à
// la ligne marquée d'une étoile
$a =&new a(10);
$a->createRef();
$a->echoValue();
$a->b->echoValue();
$a->c->echoValue();
$a->value = 11;
$a->echoValue();
$a->b->echoValue(); // *
$a->c->echoValue();
?>
L'exemple ci-dessus va afficher :
class A: 10 class B: 10 class B: 10 class A: 11 class B: 11 class B: 11
En PHP 4, les objets sont comparés de manière très simple, à savoir : deux instances sont égales si elles ont les mêmes attributs et valeurs, et qu'elles sont de la même classe. Des règles similaires s'appliquent lors de la comparaison avec l'opérateur ===.
Si vous exécutez le code suivant :
Exemple #1 Exemple de comparaison d'objets en PHP 4
<?php
function bool2str($bool) {
if ($bool === false) {
return 'FALSE';
} else {
return 'TRUE';
}
}
function compareObjects(&$o1, &$o2) {
echo 'o1 == o2 : '.bool2str($o1 == $o2)."\n";
echo 'o1 != o2 : '.bool2str($o1 != $o2)."\n";
echo 'o1 === o2 : '.bool2str($o1 === $o2)."\n";
echo 'o1 !== o2 : '.bool2str($o1 !== $o2)."\n";
}
class Flag {
var $flag;
function Flag($flag=true) {
$this->flag = $flag;
}
}
class SwitchableFlag extends Flag {
function turnOn() {
$this->flag = true;
}
function turnOff() {
$this->flag = false;
}
}
$o = new Flag();
$p = new Flag(false);
$q = new Flag();
$r = new SwitchableFlag();
echo "Compare des instances créées avec les mêmes paramètres\n";
compareObjects($o, $q);
echo "\nCompare des instances créées avec différents paramètres\n";
compareObjects($o, $p);
echo "\nCompare une instance d'un parent avec celle d'une sous-classe\n";
compareObjects($o, $r);
?>
L'exemple ci-dessus va afficher :
Compare des instances créées avec les mêmes paramètres o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Compare des instances créées avec différents paramètres o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE Compare une instance d'un parent avec celle d'une sous-classe o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Ce qui est le résultat que nous attendions, au vu des règles édictées. Seules deux instances avec les mêmes valeurs d'attributs, et issues de la même classe, sont considérées comme égales.
Même lorsque nous avons une composition d'objet, la même règle de comparaison s'applique. Dans l'exemple ci-dessous, nous allons créer une classe conteneur, qui stocke un tableau associatif Flag.
Exemple #2 Comparaison d'objets composés en PHP 4
<?php
class FlagSet {
var $set;
function FlagSet($flagArr = array()) {
$this->set = $flagArr;
}
function addFlag($name, $flag) {
$this->set[$name] = $flag;
}
function removeFlag($name) {
if (array_key_exists($name, $this->set)) {
unset($this->set[$name]);
}
}
}
$u = new FlagSet();
$u->addFlag('flag1', $o);
$u->addFlag('flag2', $p);
$v = new FlagSet(array('flag1'=>$q, 'flag2'=>$p));
$w = new FlagSet(array('flag1'=>$q));
echo "\nObjects composés u(o,p) et v(q,p)\n";
compareObjects($u, $v);
echo "\nu(o,p) et w(q)\n";
compareObjects($u, $w);
?>
L'exemple ci-dessus va afficher :
Objects composés u(o,p) et v(q,p) o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE u(o,p) et w(q) o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
En PHP 5, il y a un tout nouveau modèle objet. La gestion des objets en PHP a été complètement réécrite, permettant de meilleurs performances ainsi que plus de fonctionnalités.
Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.
Chaque définition de classe commence par le mot-clé class, suivi par le nom de la classe, qui peut être quelconque à condition que ce ne soit pas un mot réservé en PHP. Suivent une paire de parenthèses contenant la définition des membres et des méthodes. Une pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelé (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). Ce comportement est illustré dans l'exemple suivant :
Exemple #1 La variable $this en programmation objet
<?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()
{
A::toto();
}
}
$a = new A();
$a->toto();
A::toto();
$b = new B();
$b->titi();
B::titi();
?>
L'exemple ci-dessus va afficher :
$this est définie (a) $this n'est pas définie. $this est définie (b) $this n'est pas définie.
Exemple #2 Définition simple d'une classe
<?php
class SimpleClass
{
// déclaration d'un membre
public $var = 'une valeur par défaut';
// déclaration de la méthode
public function displayVar() {
echo $this->var;
}
}
?>
La valeur par défaut doit être une expression, et non (par exemple) une variable, un membre d'une classe ou un appel à une fonction.
Exemple #3 Valeur par défaut des membres d'une classe
<?php
class SimpleClass
{
// Déclarations de membres non valides :
public $var1 = 'hello '.'world';
public $var2 = <<<EOD
Bonjour le monde !
EOD;
public $var3 = 1+2;
public $var4 = self::myStaticMethod();
public $var5 = $myVar;
// Déclarations de membres valides :
public $var6 = myConstant;
public $var7 = self::classConstant;
public $var8 = array(true, false);
}
?>
Note: Il y a plusieurs fonctions utiles pour gérer les classes et les objets. Vous devriez regarder du côté des fonctions d'objets et de classes.
Contrairement à heredocs, nowdocs peut être utilisé dans n'importe quel contexte de données statiques.
Exemple #4 Exemple avec des données statiques
<?php
class foo {
// Depuis PHP 5.3.0
public $bar = <<<'EOT'
bar
EOT;
}
?>
Note: Le support de Nowdoc a été ajouté depuis PHP 5.3.0.
Pour créer une instance d'une classe, un nouvel objet doit être créé et assigné à une variable. Un objet doit toujours être assigné lors de la création d'un nouvel objet à moins qu'il ait un constructeur défini qui lance une exception en cas d'erreur. Les classes doivent être définies avant l'instanciation (dans certains cas, c'est impératif).
Exemple #5 Création d'une instance
<?php
$instance = new SimpleClass();
// Ceci peut également être réalisé avec une variable :
$className = 'Foo';
$instance = new $className(); // Foo()
?>
Dans le contexte de la classe, il est possible de créer un nouvel objet avec new self et new parent.
Lors de l'assignation d'une instance déjà créée d'une classe à une variable, la nouvelle variable accédera à la même instance de l'objet assigné. Ce comportement est le même que lors du passage d'une instance à une fonction. Une copie d'un objet déjà créé peut être effectuée par clonage.
Exemple #6 Assignation d'un objet
<?php
$assigned = $instance;
$reference =& $instance;
$instance->var = '$assigned aura cette valeur';
$instance = null; // $instance et $reference deviennent null
var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>
L'exemple ci-dessus va afficher :
NULL
NULL
object(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned aura cette valeur"
}
Une classe peut hériter des méthodes et des membres d'une autre classe en utilisant le mot-clé extends dans la déclaration. Il n'est pas possible d'étendre de multiples classes : une classe peut uniquement hériter d'une seule classe de base.
Les méthodes et membres hérités peuvent être surchargés, à moins que la classe parente ait défini une méthode comme final. Pour surcharger, il suffit de déclarer à nouveau la méthode avec le même nom que celui défini dans la classe parente. Il est possible d'accéder à une méthode ou un membre statique avec l'opérateur parent::
Exemple #7 Héritage d'une classe simple
<?php
class ExtendClass extends SimpleClass
{
// Redéfinition de la méthode parent
function displayVar()
{
echo "Classe étendue\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
L'exemple ci-dessus va afficher :
Classe étendue une valeur par défaut
De nombreux développeurs qui créent des applications orientées objet, créent un fichier source par définition de classe. L'inconvénient majeur de cette méthode est d'avoir à écrire une longue liste d'inclusions de fichier classes au début de chaque script : une inclusion par classe.
En PHP 5, ce n'est plus nécessaire. Vous pouvez définir la fonction __autoload() qui va automatiquement être appelée si une classe n'est pas encore définie au moment de son utilisation. Grâce à elle, vous avez une dernière chance pour inclure une définition de classe, avant que PHP ne déclare une erreur.
Note: Les exceptions lancées depuis la fonction __autoload() ne peuvent être interceptées par un bloc catch : elles provoqueront une erreur fatale.
Note: L'auto-chargement n'est pas disponible si vous utilisez PHP en mode interactif CLI.
Note: Si le nom de la classe est utilisé, .g. dans la fonction call_user_func(), alors il peut contenir des caractères dangereux comme ../. Il est recommandé de ne pas utiliser d'entrées utilisateur dans de telle fonction, ou, au moins, vérifier l'entrée dans la fonction __autoload().
Exemple #1 Exemple avec __autoload()
Cet exemple tente de charger les classes MaClasse1 et MaClasse2, dans les fichiers MaClasse1.php et MaClasse2.php respectivement.
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MaClasse1();
$obj2 = new MaClasse2();
?>
Exemple #2 Autre exemple d'auto-chargement
Cet exemple tente de charger l'interface ITest.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
PHP 5 permet aux développeurs de déclarer des constructeurs pour les classes. Les classes qui possèdent une méthode constructeur appellent cette méthode à chaque création d'une nouvelle instance de l'objet, ce qui est intéressant pour toutes les initialisations dont l'objet a besoin avant d'être utilisé.
Note: Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définie un constructeur. Si vous voulez utiliser un constructeur parent, il sera nécessaire de faire appel à parent::__construct().
Exemple #1 Exemple d'utilisation des nouveaux constructeurs unifiés
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
Pour des raisons de compatibilité ascendante, si PHP 5 ne peut pas trouver une fonction __construct() pour une classe donnée, il cherchera une fonction constructeur représentée, comme dans l'ancien style (PHP < 5), par le nom de la classe. Effectivement, cela signifie que le seul cas où il pourrait y avoir un problème de compatibilité est celui où votre classe contiendrait une méthode nommée __construct() et que vous en ayez un autre usage.
PHP 5 introduit un concept de destructeur similaire aux autres langages orientés objet, comme le C++. La méthode destructeur doit être appelée aussitôt que toutes les références à un objet particulier sont effacées ou lorsque l'objet est explicitement détruit ou dans n'importe quel ordre de la séquence d'arrêt.
Exemple #2 Exemple avec un Destructeur
<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destruction de " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
Tout comme le constructeur, le destructeur parent n'est pas appelé implicitement par le moteur. Pour exécuter le destructeur parent, vous devez appeler explicitement la fonction parent::__destruct dans le corps du destructeur.
Note: Les destructeurs appelées durant l'arrêt du script ont déjà envoyés les en-têtes HTTP. Le dossier de travail dans la phase du script d'arrêt peut être différent avec d'autres APIs (e.g. Apache).
Note: Tenter de lancer une exception depuis un destructeur (appelé à la fin du script) émet une erreur fatale.
La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec un mot-clé : public, protected ou private. Les éléments déclarés publics (public) peuvent être utilisés par n'importe quelle partie du programme. L'accès aux éléments protégés (protected) est limité aux classes et parents hérités (et à la classe qui a défini l'élément). L'accès aux éléments privés (private) est uniquement réservé à la classe qui les a définis.
Les classes membres doivent être définies comme publiques, protégées ou privées.
Exemple #1 Déclaration des membres
<?php
/**
* Définition de MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Fonctionne
echo $obj->protected; // Erreur fatale
echo $obj->private; // Erreur fatale
$obj->printHello(); // Affiche Public, Protected et Private
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// On peut redéclarer les éléments publics ou protégés, mais pas ceux privés
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Fonctionne
echo $obj2->private; // Indéfini
echo $obj2->protected; // Erreur fatale
$obj2->printHello(); // Affiche Public, Protected2 et Indéfini
?>
Note: La méthode de déclaration de variable en PHP 4 avec le mot-clé var est toujours supportée pour des raisons de compatibilité (en tant que synonyme du mot-clé public). Depuis PHP 5.1.3, son utilisation génère une erreur de niveau E_STRICT.
Les méthodes des classes doivent être définies en tant que publiques, privées ou protégées. Les méthodes sans déclaration seront automatiquement définies comme étant publiques.
Exemple #2 Déclaration d'une méthode
<?php
/**
* Définition de MyClass
*/
class MyClass
{
// Déclare un contructeur public
public function __construct() { }
// Déclaration d'une méthode publique
public function MyPublic() { }
// Déclaration d'une méthode protégée
protected function MyProtected() { }
// Déclaration d'une méthode privée
private function MyPrivate() { }
// Celle-ci sera publique
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Fonctionne
$myclass->MyProtected(); // Erreur fatale
$myclass->MyPrivate(); // Erreur fatale
$myclass->Foo(); // Public, Protected et Private fonctionnent
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// Celle-ci sera publique
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Erreur fatale
}
}
$myclass2 = new MyClass2