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;
$myclass2->MyPublic(); // Fonctionne
$myclass2->Foo2(); // Public et Protected fonctionnent, non pas Private
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
L'opérateur de résolution de portée (aussi appelé Paamayim Nekudotayim) ou, en termes plus simples, le symbole "double deux points" (::), fournit un moyen d'accéder aux membres statiques ou constants ainsi qu'aux éléments redéfinis par la classe.
Lorsque vous référencez ces éléments en dehors de la définition de la classe, utilisez le nom de la classe.
Depuis PHP 5.3.0, il est possible de référencer une classe en utilisant une variable. La valeur de la variable ne peut être un mot clé (e.g. self, parent et static).
Paamayim Nekudotayim peut sembler un choix étrange pour un double deux points. Cependant, au moment de l'écriture du Zend Engine 0.5 (fourni avec PHP 3), c'est le nom choisi par le groupe Zend. En fait, cela signifie un double deux points... en hébreu !
Exemple #1 :: en dehors de la définition de la classe
<?php
class MyClass {
const CONST_VALUE = 'Une valeur constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Depuis PHP 5.3.0
echo MyClass::CONST_VALUE;
?>
Deux mots-clé spéciaux, self et parent, sont utilisés pour accéder aux membres ou aux méthodes depuis la définition de la classe.
Exemple #2 :: depuis la définition de la classe
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variable statique';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // Depuis PHP 5.3.0
OtherClass::doubleColon();
?>
Lorsqu'une classe étendue redéfinit une méthode de la classe parente, PHP n'appellera pas la méthode d'origine. Il appartient à la méthode dérivée d'appeler la méthode d'origine en cas de besoin. Cela est également valable pour les définitions des constructeurs et destructeurs, les surcharges et les méthodes magiques.
Exemple #3 Appel d'une méthode parente
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Dépassement de la définition parent
public function myFunc() {
// Mais appel de la fonction parent
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>
Le fait de déclarer des membres ou des méthodes comme statiques vous permet d'y accéder sans avoir besoin d'instancier la classe. On ne peut accéder à un membre déclaré comme statique avec l'objet instancié d'une classe (bien qu'une méthode statique le puisse).
Pour des raisons de compatibilité avec PHP 4, si aucune déclaration de visibilité n'est spécifiée, alors le membre ou la méthode sera automatiquement spécifié comme public.
Comme les méthodes statiques peuvent être appelées sans objet, la pseudo-variable $this n'est pas disponible dans la méthode déclarée en tant que statique.
On ne peut pas accéder à des propriétés statiques à travers l'objet en utilisant l'opérateur ->.
L'appel non-statique à des méthodes statiques génère une alerte de degré E_STRICT.
Comme n'importe quelle autre variable PHP statique, les propriétés statiques ne peuvent être initialisées qu'en utilisant un litéral ou une constante; les expressions ne sont pas permises. Ainsi, vous pouvez initialiser une propriété statique avec un entier ou un tableau, mais ni avec une autre variable, ni avec une valeur de retour, ni avec un objet.
Depuis PHP 5.3.0, il est possible de référencer la classe en utilisant une variable. La valeur de la variable ne peut être un mot clé (e.g. self, parent et static).
Exemple #1 Exemple avec un membre statique
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // propriété my_static non définie
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // Depuis PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>
Exemple #2 Exemple avec une méthode statique
<?php
class Foo
{
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // Depuis PHP 5.3.0
?>
Il est possible de définir des valeurs constantes à l'intérieur d'une classe, qui ne seront pas modifiables. Les constantes diffèrent des variables normales du fait qu'on n'utilise pas le symbole $ pour les déclarer ou les utiliser.
La valeur doit être une expression constante, non (par exemple) une variable, un membre de la classe, le résultat d'une opération mathématique ou un appel de fonction.
Il est aussi possible pour les interfaces d'avoir des constantes. Regardez la documentation des interfaces pour quelques exemples.
Depuis PHP 5.3.0, il est possible de référencer une classe en utilisant une variable. La valeur de la variable ne peut être un mot clé (e.g. self, parent et static).
Exemple #1 Définition et utilisation d'une constante de classe
<?php
class MyClass
{
const constant = 'valeur constante';
function showConstant() {
echo self::constant . "\n";
}
}
echo MyClass::constant . "\n";
$classname = "MyClass";
echo $classname::constant . "\n"; // Depuis PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::constant."\n"; // Depuis PHP 5.3.0
?>
Exemple #2 Exemple de données statiques
<?php
class foo {
// Depuis PHP 5.3.0
const bar = <<<'EOT'
bar
EOT;
}
?>
Contrairement à heredocs, nowdocs peut être utilisé dans n'importe quel contexte de données statiques.
Note: Le support de Nowdoc a été ajouté en PHP 5.3.0.
PHP 5 introduit les classes et les méthodes abstraites. Il n'est pas autorisé de créer une instance d'une classe définie comme abstraite. Toutes les classes contenant au moins une méthode abstraite doivent également être abstraites. Pour définir une méthode abstraite, il faut simplement déclarer la signature de la méthode et ne fournir aucune implémentation.
Lors de l'héritage d'une classe abstraite, toutes les méthodes marquées comme abstraites dans la déclaration de la classe parent doivent être définies par l'enfant ; de plus, ces méthodes doivent être définies avec la même visibilité, ou une visibilité moins restreinte. Par exemple, si la méthode abstraite est définie comme protégée, l'implémentation de la fonction doit être définie comme protégée ou publique, mais non privée.
Exemple #1 Exemple de classe abstraite
<?php
abstract class AbstractClass
{
// Force la classe étendue à définir cette méthode
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// méthode commune
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
L'exemple ci-dessus va afficher :
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Du code ancien n'ayant aucune classe ou fonction nommée abstract devrait fonctionner sans modifications.
Les interfaces objet permettent de créer du code qui spécifie quelles méthodes une classe doit implémenter.
Les interfaces sont définies en utilisant le mot-clé interface, de la même façon qu'une classe standard mais sans aucun contenu de méthode.
Toutes les méthodes déclarées dans une interface doivent être publiques.
Pour implémenter une interface, l'opérateur implements est utilisé. Toutes les méthodes de l'interface doivent être implémentées dans une classe ; si ce n'est pas le cas, une erreur fatale sera émise. Les classes peuvent implémenter plus d'une interface en séparant chaque interface par une virgule.
Note: Une classe ne peut implémenter deux interfaces qui partagent des noms de fonctions, puisque cela causerait une ambiguïté.
Note: Les interfaces peuvent être étendues comme des classes en utilisant l'opérateur extend.
Les interfaces peuvent contenir des constantes. Les constantes d'interfaces fonctionnent exactement comme les constantes de classe. Elles ne peuvent pas être écrasées par des classes ou des interfaces qui en héritent.
Exemple #1 Exemple d'interface
<?php
// Declaration de l'interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implémentation de l'interface
// Ceci va fonctionner
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Ceci ne fonctionnera pas
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Exemple #2 Les interfaces extensibles
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Ceci ne fonctionnera pas
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Ceci ne fonctionnera pas et soulèvera une erreur fatale
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Exemple #3 L'héritage de plusieurs interfaces
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Exemple #4 Les interfaces avec des constantes
<?php
interface a
{
const b = 'Constante de l\'interface';
}
// Affiche: Constante de l'interface
echo a::b;
// Ceci ne fonctionnera pas de toutes façons vu qu'il n'est pas autorisé
// d'écraser des constantes. C'est le même principe qu'avec les constantes
// de classe
class b implements a
{
const b = 'Constante de classe';
}
?>
Voir aussi l'opérateur instanceof.
La surcharge en PHP permet de créer dynamiquement des propriétés et des méthodes. Ces entités dynamiques sont traitées via mes méthodes magiques établies dans une classe pour diverses types d'actions.
Les méthodes surchargées sont appelées lors de l'interaction avec les propriétés et les méthodes qui n'ont pas été déclarés ou ne sont pas visibles dans le contexte courant. Le reste de cette section utilise les termes de "propriétés inaccessibles" et de "méthodes inaccessibles" pour se référer à cette combinaison de déclaration et de visibilité.
Toutes les méthodes surchargées doivent être définies comme public.
Note: Aucun des arguments de ces méthodes magiques ne peut être passé par référence.
Note: L'interprétation PHP de la "surcharge" est différente de la plupart des langages orientés objet. La surcharge, habituellement, fournit la possibilité d'avoir plusieurs méthodes portant le même nom mais avec une quantité et des types différents d'arguments.
| Version | Description |
|---|---|
| 5.3.0 | Ajout de __callStatic(). Ajout d'un avertissement pour forcer la visibilité public et la déclaration non static. |
| 5.1.0 | Ajout de __isset() et de __unset(). |
__set() est sollicitée lors de l'écriture de données vers des propriétés inaccessibles.
__get() est sollicitée pour lire des données depuis des propriétés inaccessibles.
__isset() est sollicitée lorsque isset() ou la fonction empty() sont appelés avec des propriétés inaccessibles.
__unset() est sollicitée lorsque unset() est appelée avec des propriétés inaccessibles.
L'argument $name est le nom du propriété qui interagit. L'argument $value de la méthode __set() spécifie la valeur du propriété $name qui doit être définie.
La surcharge des propriétés ne fonctionne que sur des objets du contexte. Ces méthodes magiques ne seront pas lancées dans un contexte statique. Par conséquent, ces méthodes ne peuvent être déclarées comme statiques.
Exemple #1 Exemple de surcharge avec __get, __set, __isset et __unset
<?php
class MemberTest {
/** Variable pour les données surchargées. */
private $data = array();
/** La surcharge n'est pas utilisée sur les propriétés déclarés. */
public $declared = 1;
/** La surcharge n'est lancée que lorsque l'on accède à la classe depuis l'extérieur. */
private $hidden = 2;
public function __set($name, $value) {
echo "Définition de '$name' à la valeur '$value'\n";
$this->data[$name] = $value;
}
public function __get($name) {
echo "Récupération de '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Propriété non-définie via __get(): ' . $name .
' dans ' . $trace[0]['file'] .
' à la ligne ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** Depuis PHP 5.1.0 */
public function __isset($name) {
echo "Est-ce que '$name' est défini ?\n";
return isset($this->data[$name]);
}
/** Depuis PHP 5.1.0 */
public function __unset($name) {
echo "Effacement de '$name'\n";
unset($this->data[$name]);
}
/** Ce n'est pas une méthode magique, nécessaire ici que pour l'exemple. */
public function getHidden() {
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new MemberTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Manipulons maintenant la propriété privée nommée 'hidden':\n";
echo "'hidden' est visible depuis la classe, donc __get() n'est pas utilisé...\n";
echo $obj->getHidden() . "\n";
echo "'hidden' n'est pas visible en dehors de la classe, donc __get() est utlisé...\n";
echo $obj->hidden . "\n";
?>
L'exemple ci-dessus va afficher :
Définition de 'a' à '1' Récupération de 'a' 1 Est-ce que 'a' est défini ? bool(true) Effacement de 'a' Est-ce que 'a' est défini ? bool(false) 1 Manipulons maintenant la propriété privée nommée 'hidden': 'hidden' est visible depuis la classe, donc __get() n'est pas utilisé... 2 'hidden' n'est pas visible en dehors de la classe, donc __get() est utlisé... Récupération de 'hidden' Notice: Propriété non-définie via __get(): hidden dans <file> à la ligne 64 dans <file> à la ligne 28
__call() est lancé lorsque l'on invoque des méthodes inaccessibles dans le contexte de l'objet.
__callStatic() est lancé lorsque l'on invoque des méthodes inaccessibles dans un contexte statique.
L'argument $name est le nom de la méthode appelée. L'argument $arguments est un tableau contenant les paramètres passés à la méthode $name.
Exemple #2 Surcharge de méthodes avec __call et __callStatic
<?php
class MethodTest {
public function __call($name, $arguments) {
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode '$name' "
. implode(', ', $arguments). "\n";
}
/** Depuis PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note : la valeur de $name est sensible à la casse.
echo "Appel de la méthode statique '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('dans un contexte objet');
MethodTest::runTest('dans un contexte statique'); // Depuis PHP 5.3.0
?>
L'exemple ci-dessus va afficher :
Appel de la méthode 'runTest' dans un contexte objet Appel de la méthode statique 'runTest' dans un contexte statique
PHP 5 fournit une façon de définir les objets de manière à ce qu'on puisse parcourir une liste de membres avec une structure foreach. Par défaut, toutes les propriétés visibles seront utilisées pour le parcours.
Exemple #1 Parcours d'objet simple
<?php
class MyClass
{
public $var1 = 'valeur 1';
public $var2 = 'valeur 2';
public $var3 = 'valeur 3';
protected $protected = 'variable protégée';
private $private = 'variable privée';
function iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
$class = new MyClass();
foreach($class as $key => $value) {
print "$key => $value\n";
}
echo "\n";
$class->iterateVisible();
L'exemple ci-dessus va afficher :
var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 MyClass::iterateVisible: var1 => valeur 1 var2 => valeur 2 var3 => valeur 3 protected => variable protégée private => variable privée
Comme nous le montre l'affichage, l'itération foreach affiche toutes les variables visibles disponibles. Pour aller plus loin, vous pouvez implémenter l'interface interne de PHP 5 nommée Iterator. Ceci permet de déterminer comment l'objet doit être parcouru.
Exemple #2 Itération d'un objet implémentant un itérateur
<?php
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array) ) {
$this->var = $array;
}
}
public function rewind() {
echo "rembobinage\n";
reset($this->var);
}
public function current() {
$var = current($this->var);
echo "actuel : $var\n";
return $var;
}
public function key() {
$var = key($this->var);
echo "clé : $var\n";
return $var;
}
public function next() {
$var = next($this->var);
echo "suivant : $var\n";
return $var;
}
public function valid() {
$var = $this->current() !== false;
echo "valide : {$var}\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
L'exemple ci-dessus va afficher :
rembobinage actuel : 1 valide : 1 actuel : 1 clé : 0 0: 1 suivant : 2 actuel : 2 valide : 1 actuel : 2 clé : 1 1: 2 suivant : 3 actuel : 3 valide : 1 actuel : 3 clé : 2 2: 3 suivant : actuel : valide :
Vous pouvez également définir votre classe de façon à ce qu'elle n'ait pas besoin de définir toutes les fonctions Iterator en implémentant simplement l'interface PHP 5 IteratorAggregate.
Exemple #3 Itération d'un objet implémentant IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// Définition requise de l'interface IteratorAggregate
public function getIterator() {
return new MyIterator($this->items);
}
public function add($value) {
$this->items[$this->count++] = $value;
}
}
$coll = new MyCollection();
$coll->add('valeur 1');
$coll->add('valeur 2');
$coll->add('valeur 3');
foreach ($coll as $key => $val) {
echo "clé/valeur : [$key -> $val]\n\n";
}
?>
L'exemple ci-dessus va afficher :
rembobinage actuel : valeur 1 valide : 1 actuel : valeur 1 clé : 0 clé/valeur : [0 -> valeur 1] suivant : valeur 2 actuel : valeur 2 valide : 1 actuel : valeur 2 clé : 1 clé/valeur : [1 -> valeur 2] suivant : valeur 3 actuel : valeur 3 valide : 1 actuel : valeur 3 clé : 2 clé/valeur : [2 -> valeur 3] suivant : actuel : valide :
Note: Pour plus d'exemples sur le parcours d'objets, lisez la section sur l'extension SPL.
Les masques sont un moyen de décrire les meilleures pratiques et les bonnes conceptions. Ils proposent une solution flexible aux problèmes habituels de programmation.
Le masque d'usine permet l'instanciation d'objets durant l'exécution. Il est appelé "masque d'usine" puisqu'il est responsable de la "fabrication" d'un objet. Un paramètre d'usine reçoit le nom de la classe pour l'instancier en tant qu'argument.
Exemple #1 Méthode de paramètre d'usine
<?php
class Exemple
{
// La méthode de paramètre d'usine
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Driver non trouvé');
}
}
}
?>
Définir cette méthode dans une classe permet de charger un pilote à la volée. Si la classe Example était une classe d'abstraction de base de données, le chargement des pilotes MySQL et SQLite pourrait être effectué comme ceci :
<?php
// Chargement du driver MySQL
$mysql = Exemple::factory('MySQL');
// Chargement du driver SQLite
$sqlite = Example::factory('SQLite');
?>
Le masque singleton est utilisé dans les situations où l'on a besoin qu'il y ait une unique instance d'une certaine classe. L'exemple le plus commun est une connexion à une base de données. L'implémentation de ce masque permet au développeur de rendre cette unique instance facilement accessible par beaucoup d'autres objets.
Exemple #2 Fonction Singleton
<?php
class Example
{
// instance de la classe
private static $instance;
// Un constructeur privé ; empêche la création directe d'objet
private function __construct()
{
echo 'Je suis construit';
}
// La méthode singleton
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Exemple d'une méthode
public function bark()
{
echo 'Woof!';
}
// Prévient les utilisateurs sur le clônage de l'instance
public function __clone()
{
trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
}
}
?>
Ceci autorise une unique instance de la classe Example.
<?php
// Ceci échoue car le constructeur est privé
$test = new Example;
// Ceci récupère toujours une seule instance de la classe
$test = Example::singleton();
$test->bark();
// Ceci provoque une erreur E_USER_ERROR.
$test_clone = clone $test;
?>
Les fonctions __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state et __clone sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de fonction dans vos classes, sauf si vous voulez implémenter le comportement associé à ces fonctions magiques.
PHP réserve tous les noms de fonctions commençant par un double souligné __ pour les fonctions magiques. Il est recommandé de ne pas utiliser de noms de fonctions commençant par __ sauf si vous voulez des fonctionnalités magiques documentées.
La fonction serialize() vérifie si votre classe a une fonction avec le nom magique __sleep. Si c'est le cas, cette fonction sera exécutée avant toute linéarisation. Elle peut nettoyer l'objet et elle est supposée retourner un tableau avec les noms de toutes les variables de l'objet qui doivent être linéarisées. Si la méthode ne retourne rien, alors NULL est linéarisé et une alerte de type E_NOTICE est émise.
Le but avoué de __sleep est de valider des données en attente ou d'effectuer les opérations de nettoyage. De plus, cette fonction est utile si vous avez de très gros objets qui n'ont pas besoin d'être sauvegardés en totalité.
Réciproquement, la fonction unserialize() vérifie la présence d'une fonction dont le nom est le nom magique __wakeup. Si elle est présente, cette fonction peut reconstruire toute ressource que l'objet possède.
Le but avoué de __wakeup est de rétablir toute connexion base de données qui aurait été perdue durant la linéarisation et d'effectuer des tâches de réinitialisation.
Exemple #1 Utilisation de sleep() et wakeup()
<?php
class Connection {
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
?>
La méthode __toString détermine comment la classe doit réagir lorsqu'elle est convertie en chaîne de caractères.
Exemple #2 Exemple simple
<?php
// Déclaration d'une classe simple
class ClasseTest
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new ClasseTest('Bonjour');
echo $class;
?>
L'exemple ci-dessus va afficher :
Bonjour
Il est important de noter qu'avant PHP 5.2.0, la méthode __toString n'était appelée que si elle était directement combinée avec echo() ou print(). Depuis PHP 5.2.0, il est appelé dans tous les contextes de chaîne de caractères (e.g. dans printf() avec le modificateur %s) mais pas dans les autres types de contextes (e.g. avec le modificateur %d). Depuis PHP 5.2.0, convertir un objet sans la méthode __toString en chaîne de caractères émettra une E_RECOVERABLE_ERROR.
La méthode __invoke est appelée lorsque le script tente d'appeler un objet comme une fonction.
Note: Cette fonctionnalité est disponible depuis PHP 5.3.0.
Exemple #3 Exemple avec __invoke
<?php
class CallableClass {
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>
L'exemple ci-dessus va afficher :
int(5) bool(true)
Cette méthode statique est appelée pour les classes exportées par la fonction var_export() depuis PHP 5.1.0.
Le seul paramètre de cette méthode est un tableau contenant les propriétés exportées sous la forme array('propriété' => valeur, ...).
Exemple #4 Utilisation de __set_state (depuis PHP 5.1.0)
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($an_array) // Depuis PHP 5.1.0
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';
eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
?>
L'exemple ci-dessus va afficher :
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
PHP 5 dispose du mot-clé "final", qui empêche les classes filles de surcharger une méthode, lorsque la définition de cette dernière est préfixées par le mot-clé "final". Si la classe elle-même est définie comme finale, elle ne pourra plus être étendue.
Exemple #1 Exemple de méthode finale
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() appelé\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() appelé\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() appelé\n";
}
}
// Résultat : Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Exemple #2 Exemple de classe finale
<?php
final class BaseClass {
public function test() {
echo "BaseClass::test() appelé\n";
}
// Ici, peut importe si vous spécifiez la fonction en finale ou pas
final public function moreTesting() {
echo "BaseClass::moreTesting() appelé\n";
}
}
class ChildClass extends BaseClass {
}
// Résultat : Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
Note: Les propriétés ne peuvent être déclarées finales, seulement les méthodes peuvent l'être.
Le fait de créer une copie d'un objet possédant exactement les mêmes propriétés n'est pas toujours le comportement que l'on souhaite. Un bon exemple pour illustrer le besoin d'un constructeur de copie : si vous avez un objet qui représente une fenêtre GTK et que l'objet contient la ressource représentant cette fenêtre GTK, lorsque vous créez une copie vous pouvez vouloir créer une nouvelle fenêtre avec les mêmes propriétés mais que le nouvel objet contienne une ressource représentant la nouvelle fenêtre.
Une copie d'objet est créée en utilisant le mot-clé clone (qui fait appel à la méthode __clone() de l'objet, si elle a été définie). La méthode __clone() d'un objet ne peut être appelée directement.
<?php $copie_d_objet = clone $objet; ?>
Lorsqu'un objet est cloné, PHP 5 effectue une copie superficielle de toutes les propriétés de l'objet. Toutes les propriétés qui sont des références à d'autres variables demeureront des références.
Une fois le clonage effectué, si une méthode __clone() est définie, la méthode __clone() du nouvel objet sera appelée pour permettre à chaque propriété qui doit l'être d'être modifiée.
Exemple #1 Exemple de duplication d'objets
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $objet1;
public $objet2;
function __clone()
{
// Force la copie de this->object, sinon
// il pointera vers le même objet.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Objet original :\n");
print_r($obj);
print("Objet cloné :\n");
print_r($obj2);
?>
L'exemple ci-dessus va afficher :
Object original :
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Object cloné :
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
En PHP 5, la comparaison d'objets est plus compliquée qu'en PHP 4 afin d'être plus proche du comportement des langages orientés objet (bien que PHP n'en soit pas un).
Lors de l'utilisation de l'opérateur de comparaison ==, les objets sont comparées de manière simple, à savoir : deux objets sont égaux s'ils ont les mêmes attributs et valeurs, et qu'ils sont des instances de la même classe.
D'un autre coté, lors de l'utilisation de l'opérateur d'identité (===), les objets sont identiques uniquement s'ils font référence à la même instance de la même classe.
Un exemple va illustrer ces règles.
Exemple #1 Exemple de comparaison d'objets en PHP 5
<?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
{
public $flag;
function Flag($flag = true) {
$this->flag = $flag;
}
}
class OtherFlag
{
public $flag;
function OtherFlag($flag = true) {
$this->flag = $flag;
}
}
$o = new Flag();
$p = new Flag();
$q = $o;
$r = new OtherFlag();
echo "Deux instances de la même classe\n";
compareObjects($o, $p);
echo "\nDeux références sur le même objet\n";
compareObjects($o, $q);
echo "\nInstances de classes différentes\n";
compareObjects($o, $r);
?>
L'exemple ci-dessus va afficher :
Deux instances de la même classe o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : FALSE o1 !== o2 : TRUE Deux références sur le même objet o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Instances de classes différentes o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Note: Les extensions peuvent définir leurs propres règles pour leurs comparaisons d'objet.
PHP 5 introduit API de réflexion complète qui permet de faire du reverse-engineering sur les classes, les interfaces, les fonctions et les méthodes tout comme les extensions. L'API de réflexion permet également d'obtenir les commentaires de la documentation pour les fonctions, les classes et les méthodes.
L'API de réflexion est une extension orientée objet du Moteur Zend, constituée des classes suivantes :
<?php
class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector { }
class ReflectionParameter implements Reflector { }
class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector { }
class ReflectionClass implements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionProperty implements Reflector { }
class ReflectionExtension implements Reflector { }
?>
Note: Pour plus de détails sur ces classes, lisez les chapitres suivants.
Si nous exécutons le code de l'exemple ci-dessous :
Exemple #1 Utilisation basique de l'API de réflexion
<?php
Reflection::export(new ReflectionClass('Exception'));
?>
L'exemple ci-dessus va afficher :
Class [ <internal> class Exception ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [6] {
Property [ <default> protected $message ]
Property [ <default> private $string ]
Property [ <default> protected $code ]
Property [ <default> protected $file ]
Property [ <default> protected $line ]
Property [ <default> private $trace ]
}
- Methods [9] {
Method [ <internal> final private method __clone ] {
}
Method [ <internal, ctor> public method __construct ] {
- Parameters [2] {
Parameter #0 [ <optional> $message ]
Parameter #1 [ <optional> $code ]
}
}
Method [ <internal> final public method getMessage ] {
}
Method [ <internal> final public method getCode ] {
}
Method [ <internal> final public method getFile ] {
}
Method [ <internal> final public method getLine ] {
}
Method [ <internal> final public method getTrace ] {
}
Method [ <internal> final public method getTraceAsString ] {
}
Method [ <internal> public method __toString ] {
}
}
}
Reflector est une interface implémentée par toutes les classes exportables de réflection.
<?php
interface Reflector
{
public string __toString()
public static string export()
}
?>
ReflectionException étend le standard Exception et est lancé par l'API Reflection. Aucune méthode spécifique ni de propriété ne sont introduites.
La classe ReflectionFunction vous permet de faire du reverse-engineering sur les fonctions.
<?php
class ReflectionFunction extends ReflectionFunctionAbstract implements Reflector
{
final private __clone()
public void __construct(string name)
public string __toString()
public static string export(string name, bool return)
public string getName()
public bool isInternal()
public bool isDisabled()
public mixed getClosure() /* Depuis PHP 5.3.0 */
public bool isUserDefined()
public string getFileName()
public int getStartLine()
public int getEndLine()
public string getDocComment()
public array getStaticVariables()
public mixed invoke([mixed args [, ...]])
public mixed invokeArgs(array args)
public bool returnsReference()
public ReflectionParameter[] getParameters()
public int getNumberOfParameters()
public int getNumberOfRequiredParameters()
}
?>
La classe parent ReflectionFunctionAbstract a les mêmes méthodes, exceptée invoke(), invokeArgs(), export() et isDisabled().
Note: getNumberOfParameters() et getNumberOfRequiredParameters() ont été ajoutés en PHP 5.0.3, tandis que invokeArgs() a été ajouté en PHP 5.1.0.
Pour connaître le fonctionnement d'une fonction, vous devez tout d'abord créer une instance de la classe ReflectionFunction. Ainsi, vous pouvez appeler n'importe quelle méthode de cette instance.
Exemple #2 Utilisation de la classe ReflectionFunction
<?php
/**
* Un simple compteur
*
* @return int
*/
function counter()
{
static $c = 0;
return $c++;
}
// Création d'une instance de la classe ReflectionFunction
$func = new ReflectionFunction('counter');
// Affichage d'informations basiques
printf(
"===> The %s function '%s'\n".
" declared in %s\n".
" lines %d to %d\n",
$func->isInternal() ? 'internal' : 'user-defined',
$func->getName(),
$func->getFileName(),
$func->getStartLine(),
$func->getEndline()
);
// Affichage du commentaire de la documentation
printf("---> Documentation:\n %s\n", var_export($func->getDocComment(), 1));
// Affichage des variables statiques si elles existent
if ($statics = $func->getStaticVariables())
{
printf("---> Variables statiques : %s\n", var_export($statics, 1));
}
// Appel de la fonction
printf("---> Invocation des résultats dans : ");
var_dump($func->invoke());
// vous pouvez préférer utiliser la méthode export()
echo "\nRésultat de ReflectionFunction::export() :\n";
echo ReflectionFunction::export('counter');
?>
Note: La méthode invoke() accepte un nombre variable d'arguments, tout comme la fonction call_user_func().
La classe ReflectionParameter récupère les informations concernant les paramètres des fonctions ou des méthodes.
<?php
class ReflectionParameter implements Reflector
{
final private __clone()
public void __construct(string function, string parameter)
public string __toString()
public static string export(mixed function, mixed parameter, bool return)
public string getName()
public bool isPassedByReference()
public ReflectionClass getDeclaringClass()
public ReflectionClass getClass()
public bool isArray()
public bool allowsNull()
public bool isPassedByReference()
public bool isOptional()
public bool isDefaultValueAvailable()
public mixed getDefaultValue()
public int getPosition()
}
?>
Note: getDefaultValue(), isDefaultValueAvailable() et isOptional() ont été ajoutés en PHP 5.0.3, tandis que isArray() a été ajoutée en PHP 5.1.0. getDeclaringFunction() et getPosition() ont été ajoutés en PHP 5.2.3.
Pour connaître le fonctionnement des paramètres d'une fonction, vous devez tout d'abord créer une instance de la classe ReflectionFunction ou ReflectionMethod et, ainsi, utiliser leurs méthodes getparameters() pour récupérer un tableau de paramètres.
Exemple #3 Utilisation de la classe ReflectionParameter
<?php
function foo($a, $b, $c) { }
function bar(Exception $a, &$b, $c) { }
function baz(ReflectionFunction $a, $b = 1, $c = null) { }
function abc() { }
// Création d'une instance de la classe ReflectionFunction avec le
// paramètre fourni en ligne de commande.
$reflect = new ReflectionFunction($argv[1]);
echo $reflect;
foreach ($reflect->getParameters() as $i => $param) {
printf(
"-- Paramètre #%d : %s {\n".
" Classe : %s\n".
" Autorise NULL : %s\n".
" Passé par référence : %s\n".
" Est optionnel ?: %s\n".
"}\n",
$i, // $param->getPosition() peut être utilisé depuis PHP 5.2.3
$param->getName(),
var_export($param->getClass(), 1),
var_export($param->allowsNull(), 1),
var_export($param->isPassedByReference(), 1),
$param->isOptional() ? 'oui' : 'non'
);
}
?>
La classe ReflectionClass vous permet de faire du reverse-engineering sur des classes et des interfaces.
<?php
class ReflectionClass implements Reflector
{
final private __clone()
public void __construct(string name)
public string __toString()
public static string export(mixed class, bool return)
public string getName()
public bool isInternal()
public bool isUserDefined()
public bool isInstantiable()
public bool hasConstant(string name)
public bool hasMethod(string name)
public bool hasProperty(string name)
public string getFileName()
public int getStartLine()
public int getEndLine()
public string getDocComment()
public ReflectionMethod getConstructor()
public ReflectionMethod getMethod(string name)
public ReflectionMethod[] getMethods()
public ReflectionProperty getProperty(string name)
public ReflectionProperty[] getProperties()
public array getConstants()
public mixed getConstant(string name)
public ReflectionClass[] getInterfaces()
public bool isInterface()
public bool isAbstract()
public bool isFinal()
public int getModifiers()
public bool isInstance(stdclass object)
public stdclass newInstance(mixed args)
public stdclass newInstanceArgs(array args)
public ReflectionClass getParentClass()
public bool isSubclassOf(ReflectionClass class)
public array getStaticProperties()
public mixed getStaticPropertyValue(string name [, mixed default])
public void setStaticPropertyValue(string name, mixed value)
public array getDefaultProperties()
public bool isIterateable()
public bool implementsInterface(string name)
public ReflectionExtension getExtension()
public string getExtensionName()
}
?>
Note: hasConstant(), hasMethod(), hasProperty(), getStaticPropertyValue() et setStaticPropertyValue() ont été ajoutées en PHP 5.1.0, tandis que newInstanceArgs() a été ajoutée dans PHP 5.1.3.
Pour connaître le fonctionnement d'une classe, vous devez d'abord créer une instance de la classe ReflectionClass. Vous pourrez donc appeler n'importe quelle méthode sur cette instance.
Exemple #4 Utilisation de la classe ReflectionClass
<?php
interface Linearisable
{
// ...
}
class Object
{
// ...
}
/**
* Une classe compteur
*/
class Compteur extends Object implements Linearisable
{
const START = 0;
private static $c = Compteur::START;
/**
* Invocation du compteur
*
* @access public
* @return int
*/
public function count() {
return self::$c++;
}
}
// Création d'une instance de la classe ReflectionClass
$class = new ReflectionClass('Compteur');
// Affichage d'informations basiques
printf(
"===> La %s%s%s %s '%s' [extension de %s]\n".
" déclarée dans %s\n".
" lignes %d à %d\n".
" a le modificateur %d [%s]\n",
$class->isInternal() ? 'internal' : 'user-defined',
$class->isAbstract() ? ' abstract' : '',
$class->isFinal() ? ' final' : '',
$class->isInterface() ? 'interface' : 'class',
$class->getName(),
var_export($class->getParentClass(), 1),
$class->getFileName(),
$class->getStartLine(),
$class->getEndline(),
$class->getModifiers(),
implode(' ', Reflection::getModifierNames($class->getModifiers()))
);
// Affichage du commentaire de la documentation
printf("---> Documentation:\n %s\n", var_export($class->getDocComment(), 1));
// Affichage de l'interface qui implémente cette classe
printf("---> Implémenté :\n %s\n", var_export($class->getInterfaces(), 1));
// Affichage des constantes de la classe
printf("---> Constantes : %s\n", var_export($class->getConstants(), 1));
// Affichage des propriétés de la classe
printf("---> Properties: %s\n", var_export($class->getProperties(), 1));
// Affichage des méthodes de la classe
printf("---> Méthodes : %s\n", var_export($class->getMethods(), 1));
// Si cette classe est instanciable, création d'une instance
if ($class->isInstantiable()) {
$counter = $class->newInstance();
echo '---> $counter est uneinstance ? ';
echo $class->isInstance($counter) ? 'oui' : 'non';
echo "\n---> Le nouvel objet Object() est une instance ? ";
echo $class->isInstance(new Object()) ? 'oui' : 'non';
}
?>
Note: La méthode newinstance() accepte un nombre variable d'arguments, tout comme la fonction call_user_func().
Note: $class = new ReflectionClass('Foo'); $class->isInstance($arg) est équivalent à $arg instanceof Foo ou is_a($arg, 'Foo').
La classe ReflectionObject vous permet de retrouver les objets.
<?php
class ReflectionObject extends ReflectionClass
{
final private __clone()
public void __construct(mixed object)
public string __toString()
public static string export(mixed object, bool return)
}
?>
La classe ReflectionMethod vous permet de faire du reverse-engineering sur les méthodes des classes.
<?php
class ReflectionMethod extends ReflectionFunctionAbstract implements Reflector
{
public void __construct(mixed class, string name)
public string __toString()
public static string export(mixed class, string name, bool return)
public mixed invoke(stdclass object [, mixed args [, ...]])
public mixed invokeArgs(stdclass object, array args)
public bool isFinal()
public bool isAbstract()
public bool isPublic()
public bool isPrivate()
public bool isProtected()
public bool isStatic()
public bool isConstructor()
public bool isDestructor()
public int getModifiers()
public mixed getClosure() /* Depuis PHP 5.3.0 */
public ReflectionClass getDeclaringClass()
// Inherited from ReflectionFunctionAbstract
final private __clone()
public string getName()
public bool isInternal()
public bool isUserDefined()
public string getFileName()
public int getStartLine()
public int getEndLine()
public string getDocComment()
public array getStaticVariables()
public bool returnsReference()
public ReflectionParameter[] getParameters()
public int getNumberOfParameters()
public int getNumberOfRequiredParameters()
}
?>
Pour connaître le fonctionnement d'une méthode, vous devez d'abord créer une instance de la classe ReflectionMethod. Vous pourrez ainsi appeler n'importe quelle méthode de cette instance.
Exemple #5 Utilisation de la classe ReflectionMethod
<?php
class Compteur
{
private static $c = 0;
/**
* Incrémentation d'un compteur
*
* @final
* @static
* @access public
* @return int
*/
final public static function increment()
{
return self::$c;
}
}
// Création d'une instance de la classe ReflectionMethod
$method = new ReflectionMethod('Compteur', 'increment');
// Affichage d'informations basiques
printf(
"===> La méthode %s%s%s%s%s%s%s '%s' (qui est %s)\n".
" déclaré dans %s\n".
" lignes %d à %d\n".
" a les modificateurs %d[%s]\n",
$method->isInternal() ? 'internal' : 'user-defined',
$method->isAbstract() ? ' abstract' : '',
$method->isFinal() ? ' final' : '',
$method->isPublic() ? ' public' : '',
$method->isPrivate() ? ' private' : '',
$method->isProtected() ? ' protected' : '',
$method->isStatic() ? ' static' : '',
$method->getName(),
$method->isConstructor() ? 'the constructor' : 'a regular method',
$method->getFileName(),
$method->getStartLine(),
$method->getEndline(),
$method->getModifiers(),
implode(' ', Reflection::getModifierNames($method->getModifiers()))
);
// Affichage du commentaire de la documentation
printf("---> Documentation:\n %s\n", var_export($method->getDocComment(), 1));
// Affichage des variables statiques si elles existent
if ($statics= $method->getStaticVariables()) {
printf("---> Variales statiques : %s\n", var_export($statics, 1));
}
// Invocation de la méthode
printf("---> Résultat de l'invocation dans : ");
var_dump($method->invoke(NULL));
?>
La classe ReflectionProperty vous permet de faire du reverse-engineering sur les propriétés des classes.
<?php
class ReflectionProperty implements Reflector
{
final private __clone()
public void __construct(mixed class, string name)
public string __toString()
public static string export(mixed class, string name, bool return)
public string getName()
public bool isPublic()
public bool isPrivate()
public bool isProtected()
public bool isStatic()
public bool isDefault()
public void setAccessible() /* Depuis PHP 5.3.0 */
public int getModifiers()
public mixed getValue(stdclass object)
public void setValue(stdclass object, mixed value)
public ReflectionClass getDeclaringClass()
public string getDocComment()
}
?>
Note: getDocComment() a été ajouté en PHP 5.1.0. setAccessible() a été ajouté en PHP 5.3.0.
Pour connaître le fonctionnement d'une propriété, vous devez d'abord créer une instance de la classe ReflectionProperty. Vous pourrez ainsi appeler n'importe quelle méthode de cette instance.
Exemple #6 Utilisation de la classe ReflectionProperty
<?php
class Chaine
{
public $length = 5;
}
// Création d'une instance de la classe ReflectionProperty
$prop = new ReflectionProperty('Chaine', 'length');
// Affichage d'informations basiques
printf(
"===> Les propriétés %s%s%s%s '%s' (qui a %s)\n".
" a les modificateurs %s\n",
$prop->isPublic() ? ' public' : '',
$prop->isPrivate() ? ' private' : '',
$prop->isProtected() ? ' protected' : '',
$prop->isStatic() ? ' static' : '',
$prop->getName(),
$prop->isDefault() ? 'déclaré au moment de la compilation' : 'créé au moment de l\'exécution',
var_export(Reflection::getModifierNames($prop->getModifiers()), 1)
);
// Création d'une instance de Chaine
$obj= new Chaine();
// Récupération de la valeur courante
printf("---> La veleur est : ");
var_dump($prop->getValue($obj));
// Modification de la valeur
$prop->setValue($obj, 10);
printf("---> Définition de la valeur à 10, la nouvelle valeur est : ");
var_dump($prop->getValue($obj));
// Affichage de l'objet
var_dump($obj);
?>
Exemple #7 Obtenir la valeur d'une propriété privée et protégée en utilisant la classe ReflectionProperty
<?php
class Foo {
public $x = 1;
protected $y = 2;
private $z = 3;
}
$obj = new Foo;
$prop = new ReflectionProperty('Foo', 'y');
$prop->setAccessible(true); /* Depuis PHP 5.3.0 */
var_dump($prop->getValue($obj)); // int(2)
$prop = new ReflectionProperty('Foo', 'z');
$prop->setAccessible(true); /* Depuis PHP 5.3.0 */
var_dump($prop->getValue($obj)); // int(2)
?>
Note: Essayer de récupérer ou de définir les valeurs des propriétés d'une classe privée ou protégée produira une exception.
La classe ReflectionExtension vous permet de faire du reverse-engineering sur les extensions. Vous pouvez connaître toutes les extensions chargées à l'exécution en utilisation la fonction get_loaded_extensions().
<?php
class ReflectionExtension implements Reflector {
final private __clone()
public void __construct(string name)
public string __toString()
public static string export(string name, bool return)
public string getName()
public string getVersion()
public ReflectionFunction[] getFunctions()
public array getConstants()
public array getINIEntries()
public ReflectionClass[] getClasses()
public array getClassNames()
public string info()
}
?>
Pour connaître le fonctionnement d'une extension, vous devez d'abord créer une instance de la classe ReflectionExtension. Vous pourrez ainsi appeler n'importe quelle méthode sur cette instance.
Exemple #8 Utilisation de la classe ReflectionExtension
<?php
// Création d'une instance de la classe ReflectionExtension
$ext = new ReflectionExtension('standard');
// Affichage d'informations basiques
printf(
"Nom : %s\n".
"Version : %s\n".
"Fonctions : [%d] %s\n".
"Constantes : [%d] %s\n" .
"Entrées INI : [%d] %s\n" .
"Classes : [%d] %s\n",
$ext->getName(),
$ext->getVersion() ? $ext->getVersion() : 'NO_VERSION',
sizeof($ext->getFunctions()),
var_export($ext->getFunctions(), 1),
sizeof($ext->getConstants()),
var_export($ext->getConstants(), 1),
sizeof($ext->getINIEntries()),
var_export($ext->getINIEntries(), 1),
sizeof($ext->getClassNames()),
var_export($ext->getClassNames(), 1)
);
?>
Dans le cas où vous voudriez créer des versions spéciales des classes embarquées (par exemple pour créer du HTML colorisé lorsqu'il est exporté, pour avoir un accès facile aux variables des membres au lieu des méthodes ou pour avoir des méthodes utiles), vous devez étendre la classe.
Exemple #9 Extension des classes embarquées
<?php
/**
* Ma classe Reflection_Method
*/
class My_Reflection_Method extends ReflectionMethod
{
public $visibility = array();
public function __construct($o, $m)
{
parent::__construct($o, $m);
$this->visibility = Reflection::getModifierNames($this->getModifiers());
}
}
/**
* Démo classe #1
*
*/
class T {
protected function x() {}
}
/**
* Démo classe #2
*
*/
class U extends T {
function x() {}
}
// Affichage des informations
var_dump(new My_Reflection_Method('U', 'x'));
?>
Note: Attention : si vous écrasez le constructeur, n'oubliez pas d'appeler le constructeur parent avant d'insérer le moindre code. Sinon, votre code produira l'erreur suivante : Fatal error: Internal error: Failed to retrieve the reflection object
PHP 5 introduit le typage objet implicite (littéralement, Type Hinting). Les fonctions peuvent maintenant imposer aux paramètres d'être des objets (en spécifiant le nom de la classe dans le prototype de la fonction) ou des tableaux (depuis PHP 5.1). Cependant, si NULL est utilisé en tant que valeur par défaut du paramètre, il sera autorisé comme argument pour tous les futurs appels.
Exemple #1 Exemples de typage d'objets
<?php
// Un exemple de classe
class MaClasse
{
/**
* Fonction de test
*
* Le premier paramètre doit être un objet de type AutreClasse
*/
public function test(AutreClasse $autreclasse) {
echo $autreclasse->var;
}
/**
* Une autre fonction de test
*
* Le premier paramètre doit être un tableau
*/
public function test_array(array $input_array) {
print_r($input_array);
}
}
// Un autre exemple de classe
class AutreClasse {
public $var = 'Bonjour le monde!';
}
?>
Si le paramètre ne satisfait pas les conditions imposées, une erreur fatale (qui peut être attrapée) est émise.
<?php
// Une instance de chaque classe
$maclasse = new MaClasse;
$autreclasse = new AutreClasse;
// Erreur fatale : Argument 1 doit être un objet de la classe AutreClasse
$maclasse->test('salut');
// Erreur fatale : Argument 1 doit être une instance de AutreClasse
$foo = new stdClass;
$maclasse->test($foo);
// Erreur fatale : Argument 1 ne doit pas être null
$maclasse->test(null);
// Fonctionne : Affiche 'Bonjour le monde!'
$maclasse->test($autreclasse);
// Erreur fatale : Argument 1 doit être un tableau
$myclass->test_array('a string');
// Fonctionne : Affiche le tableau
$myclass->test_array(array('a', 'b', 'c'));
?>
Le typage fonctionne aussi avec les fonctions :
<?php
// Un exemple de classe
class MaClasse {
public $var = 'Bonjour le monde!';
}
/**
* Fonction de test
*
* Le premier paramètre doit être un objet de type MaClasse
*/
function MaFonction(MaClasse $foo) {
echo $foo->var;
}
// Fonctionne
$maclasse = new MaClasse;
MaFonction($maclasse);
?>
Le typage objet autorise les valeurs NULL :
<?php
/* On accepte la valeur NULL */
function test(stdClass $obj = NULL) {
}
test(NULL);
test(new stdClass);
?>
Le typage de paramètre ne fonctionne qu'avec les variables de type object et array. Le typage avec les types traditionnels, tels que int et string, n'est pas supporté.
Depuis PHP 5.3.0, PHP implémente une fonctionnalité appelée late static bindings, en français la résolution statique à la volée, qui est utilisée pour choisir la classe appelée dans le cadre de l'héritage de méthodes statiques.
Cette fonctionnalité a été baptisée "late static bindings", d'un point de vue interne. "Late binding", littéralement compilation tardive, vient du fait que les éléments static:: ne seront plus résolus en utilisant la classe où la méthode a été définie, mais celle qui est active durant l'exécution. L'adjectif statique a été ajouté car ce problème s'applique aux méthodes statiques, mais pas seulement.
Les références à la classe courante, avec self:: ou __CLASS__ sont résolues en utilisant la classe à qui appartiennent les fonctions, où elles ont été définies :
Exemple #1 Utilisation de self::
<?php
class A {
public static function qui() {
echo __CLASS__;
}
public static function test() {
self::qui();
}
}
class B extends A {
public static function qui() {
echo __CLASS__;
}
}
B::test();
?>
L'exemple ci-dessus va afficher :
A
La résolution statique à la volée essaie de dépasser cette limitation en introduisant un mot clé qui fait référence à la classe qui est appelée durant l'exécution. Simplement, ce mot-clé vous permet de faire référence à B depuis test(), dans l'exemple précédent. Il a été décidé de ne pas introduire de nouveau mot clé, mais plutôt d'utiliser le mot static qui était déjà réservé.
Exemple #2 Utilisation simple de static::
<?php
class A {
public static function qui() {
echo __CLASS__;
}
public static function test() {
static::qui(); // Ici, résolution à la volée
}
}
class B extends A {
public static function qui() {
echo __CLASS__;
}
}
B::test();
?>
L'exemple ci-dessus va afficher :
B
Note: static:: ne fonctionne pas comme $this pour les méthodes statiques. $this-> suit les règles de l'héritage alors que static:: ne les suit pas. Cette différence est détaillée plus loin dans le manuel.
Exemple #3 Utilisation de static:: dans un contexte non statique
<?php
class TestChild extends TestParent {
public function __construct() {
static::qui();
}
public function test() {
$o = new TestParent();
}
public static function qui() {
echo __CLASS__."\n";
}
}
class TestParent {
public function __construct() {
static::qui();
}
public static function qui() {
echo __CLASS__."\n";
}
}
$o = new TestChild;
$o->test();
?>
L'exemple ci-dessus va afficher :
TestChild TestParent
Note: La résolution des statiques à la volée va s'arrêter à un appel statique complètement résolu. D'un autre coté, les appels statiques en utilisant un mot-clé comme parent:: ou self:: va transmettre l'information appelante.
Exemple #4 Appel avec ou sans transmission
<?php
class A {
public static function foo() {
static::qui();
}
public static function qui() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function qui() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function qui() {
echo __CLASS__."\n";
}
}
C::test();
?>L'exemple ci-dessus va afficher :
A C C
Il y a de nombreuses solutions pour lancer un appel à une méthode en PHP, comme des fonctions de rappels, ou des méthodes magiques. La résolution statique à la volée qui effectue son travail à l'exécution, il peut y avoir des cas particuliers qui donnent des résultats inattendus.
Exemple #5 Résolution statique à la volée dans une méthode magique
<?php
class A {
protected static function qui() {
echo __CLASS__."\n";
}
public function __get($var) {
return static::qui();
}
}
class B extends A {
protected static function qui() {
echo __CLASS__."\n";
}
}
$b = new B;
$b->foo;
?>
L'exemple ci-dessus va afficher :
B
Un des piliers de la POO de PHP 5 est le fait que les "objets sont passés par référence par défaut". Ce n'est pas complètement vrai. Cette section rectifie cette généralisation avec quelques exemples.
Une référence PHP est un alias, qui permet à deux variables différentes de représenter la même valeur. Depuis PHP 5, une variable contenant un objet ne contient plus l'objet lui-même. Il contient un identifiant d'objet, ce qui permet aux accesseurs d'objets de trouver cet objet. Lorsque l'objet est utilisé comme argument, retourné par une fonction ou assigné à une autre variable, les différentes variables ne sont pas des alias : ils contiennent le même identifiant, qui pointe sur la même valeur.
Exemple #1 Références et Objets
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a et $b sont des copies du même identifiant
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c et $d sont des références
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
L'exemple ci-dessus va afficher :
2 2 2
Que sont les espaces de noms ? Dans leur définition la plus large, ils représentent un moyen d'encapsuler des éléments. Cela peut être conçu comme un concept abstrait, à différents endroits. Par exemple, dans un système de fichiers, les dossiers représentent un groupe de fichiers associés, et sert d'espace de noms pour les fichiers qu'il contient. Un exemple concret est que le fichier foo.txt peut exister dans les deux dossiers /home/greg et /home/other, mais que les deux copies de foo.txt ne peuvent pas co-exister dans le même dossier. De plus, pour accéder au fichier foo.txt depuis l'extérieur du dossier /home/greg, il faut préciser le nom du dossier en utilisant un séparateur de dossier, tel que /home/greg/foo.txt. Le même principe applique les espaces de noms au monde de la programmation.
Dans le monde PHP, les espaces de noms sont conçus pour résoudre deux problèmes que les auteurs de bibliothèques et applications rencontrent lors de la réutilisation d'éléments tels que des classes ou des bibliothèques de fonctions :
Les espaces de noms PHP fournissent un moyen pour regrouper des classes, fonctions ou constantes. Voici un exemple de syntaxe des espaces de noms PHP :
Exemple #1 Exemple de syntaxe des espaces de noms
<?php
namespace mon\nom; // Voyez la section "Définition des espaces de noms"
class MaClasse {}
function mafonction() {}
const MACONSTANTE = 1;
$a = new MaClasse;
$c = new \mon\nom\MaClasse; // Voyez la section "Espace global"
$a = strlen('bonjour'); // Voyez "Utilisation des espaces de noms : retour
// à l'espace global
$d = namespace\MACONSTANTE; // Voyez "L'opérateur namespace et la constante __NAMESPACE__
$d = __NAMESPACE__ . '\MACONSTANTE';
echo constant($d); // Voyez "Espaces de noms et fonctionnalités dynamiques"
?>
Les espaces de noms sont disponibles en PHP depuis PHP 5.3.0.
Bien que du code PHP valide puisse être contenu dans un espace de noms, seuls trois types de code peuvent être affectés par les espaces de noms : les classes, les fonctions et les constantes.
Les espaces de noms sont déclarés avec le mot-clé namespace. Un fichier contenant un espace de noms doit déclarer l'espace au début du fichier, avant tout autre code, avec une seule exception : le mot clé declare.
Exemple #1 Déclaration d'un espace de noms
<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
Le seul élément autorisé avant la déclaration d'espace de noms est la commande declare, pour définir l'encodage du fichier source. De plus, aucun code non-PHP ne peut précéder la déclaration d'espace de noms, y compris des espaces :
Exemple #2 Erreur de déclaration d'un espace de noms
<html>
<?php
namespace MonProjet; // erreur fatale : l'espace de noms doit être le premier élément du script
?>
De plus, contrairement à d'autres structures PHP, le même espace de noms peut être défini dans plusieurs fichiers, ce qui permet de scinder le contenu d'un espace de noms sur plusieurs fichiers.
Comme pour les fichiers et les dossiers, les espaces de noms sont aussi capables de spécifier une hiérarchie d'espaces de noms. Ainsi, un nom d'espace de noms peut être défini avec ses sous-niveaux :
Exemple #1 Déclaration d'un espace de noms avec hiérarchie
<?php
namespace MonProjet\Sous\Niveau;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
Dans l'exemple ci-dessus, la constante MonProjet\Sous\Niveau\CONNEXION_OK, la classe MonProjet\Sous\Niveau\Connexion et la fonction MonProjet\Sous\Niveau\connecte sont créées.
Plusieurs espaces de noms peuvent aussi être déclarés dans le même fichier. Il y a deux syntaxes autorisées.
Exemple #1 Déclaration de plusieurs espaces de noms, syntaxe à combinaison simple
<?php
namespace MonProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
namespace AutreProjet;
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
?>
Cette syntaxe n'est pas recommandée pour combiner des espaces de noms dans un seul fichier. Au lieu de cela, il est recommandé d'utiliser la syntaxe à accolades.
Exemple #2 Déclaration de plusieurs espaces de noms, syntaxe à accolades
<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace AutreProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
?>
Il est fortement recommandé, en tant que pratique de codage, de ne pas mélanger plusieurs espaces de noms dans le même fichier. L'utilisation recommandée est de combiner plusieurs scripts PHP dans le même fichier.
Pour combiner plusieurs codes sans espaces de noms dans du code avec espace de noms, seul la syntaxe à accolades est supportée. Le code global doit être encadré par un espace de noms sans nom, tel que celui-ci :
Exemple #3 Déclaration de plusieurs espaces de noms avec un espace sans nom
<?php
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { // code global
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?>
Aucun code PHP ne peut exister hors des accolades de l'espace de noms, sauf pour ouvrir une nouvelle instruction declare.
Exemple #4 Déclaration de plusieurs espaces de noms avec un espace sans noms (2)
<?php
declare(encoding='UTF-8');
namespace MonProjet {
const CONNEXION_OK = 1;
class Connexion { /* ... */ }
function connecte() { /* ... */ }
}
namespace { // code global
session_start();
$a = MonProjet\connecte();
echo MonProjet\Connexion::start();
}
?>
Avant de discuter de l'utilisation des espaces de noms, il est important de comprendre comment PHP devine quel espace de noms votre code utilise. Une analogie simple peut être faite entre les espaces de noms de PHP et un système de fichiers. Il y a trois moyens d'accéder à un fichier dans un système de fichiers :
Le même principe peut être appliqué aux espaces de noms de PHP. Par exemple, on peut faire référence à une classe de trois manières :
Voici un exemple des trois syntaxes, dans du code réel :
file1.php
<?php
namespace Foo\Bar\sousespacedenoms;
const FOO = 1;
function foo() {}
class foo
{
static function methodestatique() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function methodestatique() {}
}
/* nom non qualifié */
foo(); // Devient Foo\Bar\foo
foo::methodestatique(); // Devient Foo\Bar\foo, méthode methodestatique
echo FOO; // Deviet la constante Foo\Bar\FOO
/* nom qualifié */
sousespacedenoms\foo(); // Devient la fonction Foo\Bar\sousespacedenoms\foo
sousespacedenoms\foo::methodestatique(); // devient la classe Foo\Bar\sousespacedenoms\foo,
// méthode methodestatique
echo sousespacedenoms\FOO; // Devient la constante Foo\Bar\sousespacedenoms\FOO
/* nom absolu */
\Foo\Bar\foo(); // Devient la fonction Foo\Bar\foo
\Foo\Bar\foo::methodestatique(); // Devient la classe Foo\Bar\foo, méthode methodestatique
echo \Foo\Bar\FOO; // Devient la constante Foo\Bar\FOO
?>
Notez que pour accéder à n'importe quelle classe, fonction ou constante globale, un nom absolu peut être utilisé, tel que \strlen() ou \Exception ou \INI_ALL.
Exemple #1 Accès aux classes, fonctions et constantes globales depuis un espace de noms
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // appel la fonction globale strlen
$b = \INI_ALL; // accès à une constante INI_ALL
$c = new \Exception('error'); // instantie la classe globale Exception
?>
L'implémentation des espaces de noms de PHP est influencée par sa nature dynamique de langage de programmation. Par conséquent, pour convertir du code tel que le code de l'exemple suivant, en un espace de noms :
Exemple #1 Accès dynamique aux éléments
example1.php:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // affiche classname::__construct
$b = 'funcname';
$b(); // affiche funcname
echo constant('constname'), "\n"; // affiche global
?>
Il faut utiliser un nom absolu (le nom de la classe, avec son préfixe d'espace de noms). Notez qu'il n'y a pas de différence entre un nom absolu et un nom qualifié dans un nom de classe, de fonction ou de constante dynamique, ce qui fait que l'anti-slash initial n'est pas nécessaire.
Exemple #2 Accès dynamique à des espaces de noms
<?php
namespace nomdelespacedenoms;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // affiche classname::__construct
$b = 'funcname';
$b(); // affiche funcname
echo constant('constname'), "\n"; // affiche global
/* Note que si vous utilisez des guillemets doubles, "\\nomdelespacedenoms\\classname" doit être utilisé */
$a = '\nomdelespacedenoms\classname';
$obj = new $a; // affiche nomdelespacedenoms\classname::__construct
$a = 'nomdelespacedenoms\classname';
$obj = new $a; // affiche aussi nomdelespacedenoms\classname::__construct
$b = 'nomdelespacedenoms\funcname';
$b(); // affiche nomdelespacedenoms\funcname
$b = '\nomdelespacedenoms\funcname';
$b(); // affiche aussi nomdelespacedenoms\funcname
echo constant('\nomdelespacedenoms\constname'), "\n"; // affiche namespaced
echo constant('nomdelespacedenoms\constname'), "\n"; // affiche aussi namespaced
?>
Il est recommandé de lire la note au sujet de la protection des espaces de noms dans les chaînes.
PHP supporte deux moyens pour accéder de manière abstraite aux éléments dans l'espace de nom courant, à savoir la constante magique __NAMESPACE__ et la commande namespace.
La valeur de __NAMESPACE__ est une chaîne qui contient le nom de l'espace de noms courant. Dans l'espace global, sans nom, elle contient une chaîne vide.
Exemple #1 Exemple avec __NAMESPACE__, dans un code avec espace de noms
<?php
namespace MonProjet;
echo '"', __NAMESPACE__, '"'; // affiche "MonProjet"
?>
Exemple #2 Exemple avec __NAMESPACE__, dans un code avec espace de noms global
<?php
echo '"', __NAMESPACE__, '"'; // affiche ""
?>
La constante __NAMESPACE__ est utile pour construire dynamiquement des noms, tels que :
Exemple #3 Utilisation de __NAMESPACE__ pour une construction dynamique de noms
<?php
namespace MonProjet;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
La commande namespace peut aussi être utilisée pour demander explicitement un élément de l'espace de noms courant, ou d'un sous-espace. C'est l'équivalent pour les espaces de noms de l'opérateur self des classes.
Exemple #4 l'opérateur namespace, dans un espace de noms
<?php
namespace MonProjet;
use blah\blah as mine; // Voyez "Utilisation des espaces de noms : importation et alias"
blah\mine(); // appelle la fonction MonProjet\blah\mine()
namespace\blah\mine(); // appelle la fonction MonProjet\blah\mine()
namespace\func(); // appelle la fonction MonProjet\func()
namespace\sub\func(); // appelle la fonction MonProjet\sub\func()
namespace\cname::method(); // appelle la méthode statique "method" de la classe MonProjet\cname
$a = new namespace\sub\cname(); // instantie un objet de la classe MonProjet\sub\cname
$b = namespace\CONSTANT; // assigne la valeur de la constante MonProjet\CONSTANT à $b
?>
Exemple #5 l'opérateur namespace, dans l'espace de noms global
<?php
namespace\func(); // appelle la fonction func()
namespace\sub\func(); // appelle la fonction sub\func()
namespace\cname::method(); // appelle la méthode statique "method" de la classe cname
$a = new namespace\sub\cname(); // instantie un objet de la classe sub\cname
$b = namespace\CONSTANT; // assigne la valeur de la constante CONSTANT à $b
?>
La capacité de faire référence à un nom absolu avec un alias ou en important un espace de noms est stratégique. C'est un avantage similaire aux liens symbolique dans un système de fichiers.
Les espaces de noms PHP supportent deux types d'alias et d'importation : l'alias de nom de classe, et l'alias d'espace de noms. Notez que l'importation de constantes ou fonctions n'est pas supporté.
En PHP, l'alias est créé avec l'opérateur use. Voici un exemple qui présente les trois types d'importation :
Exemple #1 importation et alias avec l'opérateur use
<?php
namespace foo;
use My\Full\Classname as Another;
// Ceci est la même chose que use My\Full\NSname as NSname
use My\Full\NSname;
// importation d'une classe globale
use \ArrayObject;
$obj = new namespace\Another; // instantie un objet de la classe foo\Another
$obj = new Another; // instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantie un objet de la classe ArrayObject
// Sans l'instruction "use \ArrayObject" nous aurions instantié un objet de la classe foo\ArrayObject
?>
Notez que pour les noms avec chemin (les noms absolus contenant des séparateurs d'espaces, tels que Foo\Bar, par comparaison avec les noms globaux, tels que FooBar), qui n'en contiennent pas, l'anti-slash initial n'est pas nécessaire, et même interdit, car les noms importés doivent être absolus, et ne sont pas résolus relativement à l'espace de noms courant.
De plus, PHP supporte des raccourcis pratiques, tels que les commandes use multiples.
Exemple #2 importation et alias multiples avec l'opérateur use
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
?>
L'importation est réalisée à la compilation, ce qui fait que cela n'affecte pas les classes, fonctions et constantes dynamiques.
Exemple #3 Importation et noms d'espaces dynamiques
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
$a = 'Another';
$obj = new $a; // instantie un objet de la classe Another
?>
De plus, l'importation n'affecte que les noms sans qualifications. Les noms absolus restent absolus, et inchangés par un import.
Exemple #4 Importation et noms d'espaces absolus
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantie un objet de la classe My\Full\Classname
$obj = new \Another; // instantie un objet de la classe Another
$obj = new Another\untruc; // instantie un objet de la classe My\Full\Classname\untruc
$obj = new \Another\untruc; // instantie un objet de la classe Another\untruc
?>
Sans aucune définition d'espace de noms, toutes les classes et les fonctions sont placées dans l'espace de noms global : comme en PHP avant que les espaces de noms ait été introduits. En préfixant un nom avec un anti-slash \, on peut demander l'utilisation de l'espace de noms global, même dans un contexte d'espace de noms spécifique.
Exemple #1 Spécification d'espace de noms global
<?php
namespace A\B\C;
/* Cette fonction est A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // appel à fopen global
return $f;
}
?>
Dans un espace de noms, lorsque PHP rencontre un nom sans qualification, que ce soit une classe, une fonction ou une constante, il le résout avec différentes priorités. Les noms de classes sont toujours résolus avec l'espace de noms courant. Pour accéder à des classes internes ou à des classes qui ne sont pas dans un espace de noms, il faut les représenter avec leur nom absolu, tel que :
Exemple #1 Accès aux classes globales depuis un espace de noms
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a est un objet de la classe A\B\C\Exception
$b = new \Exception('hi'); // $b est un objet de la classe Exception
$c = new ArrayObject; // erreur fatale, classe A\B\C\ArrayObject non trouvée
?>
Pour les fonctions et constantes, PHP va aller les chercher dans l'espace global s'il ne peut les trouver dans l'espace de noms courant.
Exemple #2 Accès aux fonctions et constantes globales dans un espace de noms
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // affiche "45"
echo INI_ALL, "\n"; // affiche "7" : accès dans l'espace de noms global INI_ALL
echo strlen('hi'), "\n"; // affiche "1"
if (is_array('hi')) { // affiche "n'est pas un tableau"
echo "est un tableau\n";
} else {
echo "n'est pas un tableau\n";
}
?>
Dans le cadre des règles de résolution, il y a plusieurs définitions importantes :
Ceci est un identifiant ne contenant pas un séparateur d'espace de noms. Par exemple : Foo
Ceci est un identifiant contenant un séparateur d'espace de noms. Par exemple : Foo\Bar
Ceci est un identifiant qui commence par un séparateur d'espace de noms. Par exemple : \Foo\Bar. namespace\Foo est aussi un nom absolu.
Les noms sont résolus en suivant les règles suivantes :
Exemple #1 Exemples de résolutions d'espaces de noms
<?php
namespace A;
use B\D, C\E as F;
// appels de fonctions
foo(); // tente d'appeler la fonction "foo" dans l'espace de noms "A"
// puis appelle la fonction globale "foo"
\foo(); // appelle la fonction "foo" définie dans l'espace de noms global
my\foo(); // appelle la fonction "foo" définie dans l'espace de noms "A\my"
F(); // tente d'appeler la fonction "F" définie dans l'espace "A"
// puis tente d'appeler la fonction globale "F"
// référence de classes references
new B(); // crée un objet de la classe "B" définie dans l'espace de noms "A"
// si non trouvé, il essaie l'autoload sur la classe "A\B"
new D(); // using import rules, crée un objet de la classe "D" définie dans l'espace de noms "B"
// si non trouvé, il essaie l'autoload sur la classe "B\D"
new F(); // using import rules, crée un objet de la classe "E" définie dans l'espace de noms "C"
// si non trouvé, il essaie l'autoload sur la classe "C\E"
new \B(); // crée un objet de la classe "B" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "B"
new \D(); // crée un objet de la classe "D" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "D"
new \F(); // crée un objet de la classe "F" définie dans l'espace de noms global
// si non trouvé, il essaie l'autoload sur la classe "F"
// méthodes statiques et fonctions d'espace de noms d'un autre espace
B\foo(); // appelle la fonction "foo" de l'espace de noms "A\B"
B::foo(); // appelle la méthode "foo" de la classe "B" définie dans l'espace de noms "A"
// si la classe "A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\B"
D::foo(); // using import rules, appelle la méthode "foo" de la classe "D" définie dans l'espace de noms "B"
// si la classe "B\D" n'est pas trouvée, il essaie l'autoload sur la classe "B\D"
\B\foo(); // appelle la fonction "foo" de l'espace de noms "B"
\B::foo(); // appelle la méthode "foo" de la classe "B" from global scope
// si la classe "B" n'est pas trouvée, il essaie l'autoload sur la classe "B"
// méthodes statiques et fonctions d'espace de noms de l'espace courant
A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A\A"
// si la classe "A\A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\A\B"
\A\B::foo(); // appelle la méthode "foo" de la classe "B" de l'espace de noms "A\B"
// si la classe "A\B" n'est pas trouvée, il essaie l'autoload sur la classe "A\B"
?>
Cette FAQ est décomposée en deux sections : les questions courantes, et les points particuliers de l'implémentation, qui peuvent être utile à la compréhension globale.
D'abord, les questions courantes.
Voici les points particuliers de l'implémentation, qui peuvent être utile à la compréhension globale.
Non, les espaces de noms n'affectent pas le code existant, d'une manière ou d'une autre, ni le code qui sera produit et qui n'utilise pas les espaces de noms. Vous pouvez écrire ceci si vous voulez :
Exemple #1 Accès à une classe globale de l'extérieur d'un espace de noms
<?php
$a = new \stdClass;
C'est une fonctionnalité équivalente à :
Exemple #2 Accéder à des classes globales hors d'un espace de noms
<?php
$a = new stdClass;
Exemple #3 Accès aux classes internes depuis un espace de noms
<?php
namespace foo;
$a = new \stdClass;
function test(\ArrayObject $typehintexample = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// extension d'une classe interne ou globale
class MyException extends \Exception {}
?>
Exemple #4 Accès aux classes, fonctions et constantes internes dans un espace de noms
<?php
namespace foo;
class MaClasse {}
// utilisation d'une classe dans l'espace de noms courant, sous forme de type d'argument
function test(MaClasse $typehintexample = null) {}
// une autre manière d'utiliser une classe dans l'espace de noms courant
function test(\foo\MaClasse $typehintexample = null) {}
// extension d'une classe dans l'espace de noms courant
class Extended extends MaClasse {}
// accès à une fonction globale
$a = \globalfunc();
// accès à une constante globale
$b = \INI_ALL;
?>
Les noms qui commencent par \ sont toujours résolus en ce à quoi ils ressemblent, ce qui fait que \mon\nom est en fait mon\nom, et \Exception est Exception.
Exemple #5 Noms d'espaces absolus
<?php
namespace foo;
$a = new \mon\nom(); // instantie la classe "mon\nom"
echo \strlen('hi'); // appelle la fonction "strlen"
$a = \INI_ALL; // $a reçoit la valeur de la constante "INI_ALL"
?>
Les noms qui contiennent un anti-slash mais ne commencent par par un anti-slash, comme mon\nom peuvent être résolus de deux manières différentes.
S'il y a eu une commande d'importation qui fait un alias de mon, alors l'alias importé est appliqué à la place de mon, et l'espace de noms devient mon\nom.
Sinon, l'espace de noms courant est ajouté avant le chemin de la classe mon\nom.
Exemple #6 Noms qualifiés
<?php
namespace foo;
use blah\blah as foo;
$a = new mon\nom(); // instantie la classe "foo\mon\nom"
foo\bar::name(); // appelle la méthode statique "name" dans la classe "blah\blah\bar"
mon\bar(); // appelle la fonction "foo\mon\bar"
$a = mon\BAR; // affecte à $a la valeur de la constante "foo\mon\BAR"
?>
Les noms de classes qui ne contiennent pas d'anti-slash comme nom peuvent être résolus de deux manières différentes.
S'il y a une instruction d'importation qui définit un alias pour nom, alors l'alias est appliqué.
Sinon, l'espace de noms courant est utilisé, et préfixé à nom.
Exemple #7 Classes sans qualification
<?php
namespace foo;
use blah\blah as foo;
$a = new nom(); // instantie "foo\nom" class
foo::nom(); // appelle la méthode statique "nom" dans la classe "blah\blah"
?>
Les fonctions et constantes qui n'ont pas d'anti-slash dans leur nom comme nom sont résolues de deux manières différentes :
D'abord, l'espace de noms courant est préfixé à name.
Ensuite, si la constante ou la fonction nom n'existe pas dans l'espace de nom courant, la version globale de la constante ou la fonction nom est utilisée.
Exemple #8 Fonctions et constantes sans espace de noms
<?php
namespace foo;
use blah\blah as foo;
const FOO = 1;
function mon() {}
function foo() {}
function sort(&$a)
{
sort($a);
$a = array_flip($a);
return $a;
}
mon(); // appelle "foo\mon"
$a = strlen('hi'); // appelle la fonction globale "strlen" car "foo\strlen" n'existe pas
$arr = array(1,3,2);
$b = sort($arr); // appelle la fonction "foo\sort"
$c = foo(); // appelle la fonction "foo\foo" : l'importation n'est pas appliquée
$a = FOO; // assigne à $a la valeur de la constante "foo\FOO" : l'importation n'est pas appliquée
$b = INI_ALL; // assigne à $b la valeur de la constante "INI_ALL"
?>
La combinaison de script suivante est valide :
file1.php
<?php
namespace mes\trucs;
class MaClasse {}
?>
another.php
<?php
namespace another;
class untruc {}
?>
file2.php
<?php
namespace mes\trucs;
include 'file1.php';
include 'another.php';
use another\untruc as MaClasse;
$a = new MaClasse; // instantie la classe "untruc" de l'espace de noms another
?>
Il n'y a pas de conflit de noms, même si la classe MaClasse existe dans l'espace de noms mes\trucs, car la définition de MaClasse est dans un fichier séparé. Cependant, l'exemple suivant produit une erreur fatale à cause d'un conflit de noms, car MaClasse est définie dans le même fichier que l'instruction use.
<?php
namespace mes\trucs;
use another\untruc as MaClasse;
class MaClasse {} // erreur fatale: MaClasse est en conflit avec la commande d'importation
$a = new MaClasse;
?>
PHP ne permet pas d'imbriquer des espaces de noms.
<?php
namespace mes\trucs {
namespace nested {
class foo {}
}
}
?>
Cependant, il est facile de simuler des espaces de noms imbriqués, comme ceci :
<?php
namespace mes\trucs\nested {
class foo {}
}
?>
Les seuls éléments qui sont affectés par la commande use sont les espaces de noms et les classes. Afin de réduire le nom d'une constante ou d'une fonction, il faut l'importer dans un espace de noms.
<?php
namespace mine;
use ultra\long\ns\nom;
$a = nom\CONSTANT;
nom\func();
?>
Il est très important de réaliser que, comme les anti-slash sont utilisés comme caractères de protection dans les chaînes, il faut toujours les doubler pour pouvoir les utiliser dans une chaîne. Sinon, il y a un risque d'utilisation inattendue :
Exemple #9 Dangers de l'utilisation des espaces de noms dans une chaîne
<?php
$a = new "dangereux\nom"; // \n est une nouvelle ligne dans une chaîne!
$obj = new $a;
$a = new 'pas\vraiment\dangereux'; // aucun problem ici
$obj = new $a;
?>
Dans une chaîne à double guillemets, la séquence de protection est beaucoup plus sécuritaire à utiliser, mais il est quand même recommandé de toujours protéger les anti-slashs dans une chaîne qui contient un espace de noms.
Toute constante indéfinie qui est sans qualificatif tel que FOO va produite une alerte : PHP supposait que FOO était la valeur de la constante. Toute constante, qualifiée partiellement ou totalement, qui contient un anti-slash, produite une erreur fatale si indéfinie.
Exemple #10 Constantes indéfinies
<?php
namespace bar;
$a = FOO; // produit une alerte : constante indéfinie "FOO", qui prend la valeur de "FOO";
$a = \FOO; // erreur fatale, constante d'espace de noms indéfinie FOO
$a = Bar\FOO; // erreur fatale, constante d'espace de noms indéfinie bar\Bar\FOO
$a = \Bar\FOO; // erreur fatale, constante d'espace de noms indéfinie Bar\FOO
?>
Toute tentative dans un espace de noms de remplacer les constantes natives ou spéciales engendre une erreur fatale.
Exemple #11 Constantes qui ne peuvent être redéfinies
<?php
namespace bar;
const NULL = 0; // erreur fatale;
const true = 'stupid'; // encore une erreur fatale;
// etc.
?>
PHP 5 a une gestion des exceptions similaire à ce qu'offrent les autres langages de programmation. Une exception peut être lancée ("throw") et attrapée ("catch") dans PHP. Le code devra être entouré d'un bloc try pour faciliter la saisie d'une exception potentielle. Chaque try doit avoir au moins un bloc catch correspondant. Plusieurs blocs catch peuvent être utilisés pour attraper différentes classes d'exceptions. L'exécution normale (lorsque aucune exception n'est lancée dans le bloc try ou lorsqu'un catch correspondant à l'exception lancée n'est pas présent) continue après le dernier bloc catch défini dans la séquence. Les exceptions peuvent être lancées (ou relancées) dans un bloc catch.
Lorsqu'une exception est jetée, le code suivant le traitement ne sera pas exécuté et PHP tentera de trouver le premier bloc catch correspondant. Si une exception n'est pas attrapé, une erreur fatale issue de PHP sera envoyée avec un message spécifiant que l'exception n'a pu être attrapée à moins qu'un gestionnaire ne soit défini avec la fonction set_exception_handler().
Note: Les fonctions internes de PHP utilisent principalement l' Error reporting, seules les extensions orientées objet utilisent les exceptions. Quoiqu'il en soit, des erreurs peuvent facilement être traduites en exceptions avec ErrorException.
La bibliothèque standard PHP (SPL) fournit un bon nombre d'exceptions en dur.
Exemple #1 Lancer une exception
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division par zéro.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Exception reçue : ', $e->getMessage(), "\n";
}
// Continue execution
echo 'Bonjour le monde !';
?>
L'exemple ci-dessus va afficher :
0.2 Exception reçue : Division par zéro. Hello World
Exemple #2 Héritage d'une exception
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* on la relance */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
?>
L'exemple ci-dessus va afficher :
string(4) "foo!"
Une classe Exception définie par l'utilisateur peut être définie en étendant la classe Exception interne. Les membres et les propriétés suivantes montrent ce qui est accessible dans la classe enfant qui est dérivée de la classe exception interne.
Exemple #1 La classe Exception interne
<?php
class Exception
{
protected $message = 'exception inconnu'; // message de l'exception
protected $code = 0; // code de l'exception défini par l'utilisateur
protected $file; // nom du fichier source de l'exception
protected $line; // ligne de la source de l'exception
function __construct(string $message=NULL, int code=0);
final function getMessage(); // message de l'exception
final function getCode(); // code de l'exception
final function getFile(); // nom du fichier source
final function getLine(); // ligne du fichier source
final function getTrace(); // un tableau de backtrace()
final function getTraceAsString(); // chaîne formattée de trace
/* Remplacable */
function __toString(); // chaîne formatée pour l'affichage
}
?>
Si une classe étend la classe Exception interne et redéfinit le constructeur, il est vivement recommandé qu'elle appelle aussi parent::__construct() pour s'assurer que toutes les données disponibles ont été proprement assignées. La méthode __toString() peut être réécrite pour fournir un affichage personnalisé lorsque l'objet est présenté comme une chaîne.
Exemple #2 Étendre la classe Exception
<?php
/**
* Définition d'une classe d'exception personnalisée
*/
class MyException extends Exception
{
// Redéfinissez l'exception ainsi le message n'est pas facultatif
public function __construct($message, $code = 0) {
// traitement personnalisé que vous voulez réaliser ...
// assurez-vous que tout a été assigné proprement
parent::__construct($message, $code);
}
// chaîne personnalisé représentant l'objet
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Une fonction personnalisée pour ce type d'exception\n";
}
}
/**
* Création d'une classe pour tester l'exception
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// jette une exception personnalisé
throw new MyException('1 est un paramètre invalide', 5);
break;
case self::THROW_DEFAULT:
// jette l'exception par défaut.
throw new Exception('2 n\'est pas autorisé en tant que paramètre', 6);
break;
default:
// Aucune exception, l'objet sera créé.
$this->var = $avalue;
break;
}
}
}
// Exemple 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Devrait être attrapée
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Sauté
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o);
echo "\n\n";
//Exemple 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Ne correspond pas à ce type
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Devrait être attrapée
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o);
echo "\n\n";
// Exemple 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Devrait être attrapée
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o);
echo "\n\n";
// Exemple 4
try {
$o = new TestException();
} catch (Exception $e) { // sauté, aucune exception
echo "Capture l'exception par défaut\n", $e;
}
// Continue l'exécution
var_dump($o);
echo "\n\n";
?>
En PHP, les références sont destinées à appeler le contenu d'une variable avec un autre nom. Ce n'est pas comme en C ; à la place, les références sont des alias dans la table des symboles. Le nom de la variable et son contenu ont des noms différents, ce qui fait que l'on peut donner plusieurs noms au même contenu. On peut faire l'analogie avec les fichiers sous Unix, et leur nom de fichier : les noms des variables sont les entrées dans un répertoire, tandis que le contenu de la variable est le contenu même du fichier. Faire des références en PHP revient alors à faire des liens sous Unix.
Les références vous permettent de faire pointer deux variables sur le même contenu. Par exemple, lorsque vous faites :
Exemple #1 Les références
<?php
$a =& $b;
?>
cela signifie que $a et $b pointent sur le même contenu.
Note: $a et $b sont complètement égales ici : ce n'est pas $a qui pointe sur $b, ou vice-versa. C'est bien $a et $b qui pointent sur le même contenu.
Note: Si un tableau par référence est copié, ses valeurs ne sont pas déréférencées. Cela est valide également pour les tableaux passés par valeur aux fonctions.
Note: Si vous assignez, passez ou retournez une variable indéfinie par référence, elle sera créée automatiquement.
Exemple #2 Utilisation des références avec des variables indéfinies
<?php
function foo(&$var) { }
foo($a); // $a est "créée" et assignée à NULL
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
La même syntaxe peut être utilisée avec les fonctions qui retournent des références, et avec l'opérateur new (PHP 4.0.4 et plus récent) :
<?php
$bar =& new fooclass();
$foo =& find_var($bar);
?>
Depuis PHP 5, new retourne une référence automatiquement, donc, l'utilisation de =& dans ce contexte est obsolète et produit un message de niveau E_STRICT.
Note: Le fait de ne pas utiliser l'opérateur & produit une copie de l'objet. Si vous utilisez $this dans la classe, il fonctionnera dans l'instance courante de la classe. L'assignement sans l'opérateur & copiera l'instance (i.e. l'objet) et $this fonctionnera sur cette copie, ce qui n'est pas toujours le comportement désiré. Habituellement, vous voulez avoir une seule instance afin de préserver les performances et la consommation mémoire.
Même si vous pouvez utiliser l'opérateur @ pour supprimer les messages d'erreurs du constructeur avec la syntaxe @new, cela ne fonctionnera pas avec la syntaxe &new. C'est une limitation du moteur Zend, et cela conduit à une erreur d'analyse.
Si vous assignez une référence à une variable définie en tant que global dans une fonction, la référence sera visible uniquement à l'intérieure de la fonction. Vous pouvez éviter cela en utilisant le tableau $GLOBALS.
Exemple #3 Référencer une variable globale à l'intérieure d'une fonction
<?php
$var1 = "Variable Exemple";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible uniquement dans la fonction
} else {
$GLOBALS["var2"] =& $var1; // visible également dans un contexte global
}
}
global_references(false);
echo "var2 est défini à '$var2'\n"; // var2 est défini à ''
global_references(true);
echo "var2 est défini à '$var2'\n"; // var2 est défini à 'Variable Exemple'
?>
Voyez global $var; comme un raccourci pour $var =& $GLOBALS['var'];. De ce fait assignant d'autres références à $var changeant uniquement la référence locale de la variable.
Note: Si vous assignez des valeurs par références dans une structure foreach, les références seront également modifiées.
Exemple #4 Références et structure foreach
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// faites quelque chose
}
echo $ref; // 3 - le dernier élément du tableau itéré
?>
Le deuxième intérêt des références est de pouvoir passer des variables par référence. On réalise ceci en faisant pointer des variables locales vers le contenu des variables de fonction. Exemple :
Exemple #5 Passage de paramètre par référence
<?php
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
?>
$a vaut 6. Cela provient du fait que dans la fonction foo, la variable $var pointe sur le même contenu que $a. Voir aussi les explications détaillées dans passage par référence.
Le troisième intérêt des références est de retourner des valeurs par référence.
Comme précisé ci-dessus, les références ne sont pas des pointeurs. Cela signifie que le script suivant ne fera pas ce à quoi on peut s'attendre :
Exemple #1 Les références ne sont pas des pointeurs
<?php
function foo(&$var) {
$var =& $GLOBALS["baz"];
}
foo($bar);
?>
Il va se passer que $var dans foo sera lié à $bar, mais il sera aussi relié à $GLOBALS["baz"]. Il n'y a pas moyen de lier $bar à quelque chose d'autre en utilisant le mécanisme de référence, car $bar n'est pas accessible dans la fonction foo (certes, il est représenté par $var et $var possède la même valeur, mais n'est pas relié par la table des symboles). Vous pouvez utiliser les références arrières pour référencer les variables sélectionnées par la fonction.
Vous pouvez passer des variables par référence, de manière à ce que la fonction modifie ces variables. La syntaxe est la suivante :
Exemple #1 Passage par référence
<?php
function foo(&$var) {
$var++;
}
$a=5;
foo ($a);
// $a vaut 6 maintenant
?>
Notez qu'il n'y a pas de signe de référence dans l'appel de la fonction, uniquement sur sa définition. La définition de la fonction est suffisante pour passer correctement des arguments par référence. Dans les versions récentes de PHP, vous devriez recevoir une alerte disant que "Call-time pass-by-reference" est obsolète lorsque vous utilisez un & dans foo(&$a);.
Les objets suivants peuvent être passés par référence :
Une référence, retournée par une fonction :
Exemple #2 Retour d'une référence par une fonction
<?php
function &bar() {
$a = 5;
return $a;
}
foo(bar());
?>
Voir aussi des détails dans retourner des références.
Toutes les autres expressions ne doivent pas être passées par référence, car le résultat sera indéfini. Par exemple, les passages par référence suivants sont invalides :
Exemple #3 Passage par référence invalide
<?php
function bar() // Notez l'absence de &
{
$a = 5;
return $a;
}
foo(bar()); // Produit une erreur fatale depuis PHP 5.0.5
foo($a = 5); // Expression, pas une variable
foo(5); // Produit une erreur fatale
?>
Ces fonctionnalités sont valables à partir de PHP 4.0.4.
Retourner des références est toujours utile lorsque vous voulez utiliser une fonction pour savoir à quoi est liée une variable. N'utilisez pas le retour par référence pour améliorer les performances, le moteur est suffisamment robuste pour optimiser cela en interne. Retournez uniquement des références lorsque vous avez techniquement une bonne raison de le faire ! Pour retourner des références, utilisez cette syntaxe :
Exemple #1 Retourner des références
<?php
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue est une référence de $obj->value, qui vaut 42.
$obj->value = 2;
echo $myValue; // affiche la nouvelle valeur de $obj->value, i.e. 2.
?>
Dans cet exemple, on affecte une valeur à la propriété de l'objet retourné par la fonction getValue, et non à sa copie, comme ce serait le cas si on n'avait pas utilisé la syntaxe de référence.
Note: Contrairement au passage de paramètre, vous devez utiliser & aux deux endroits, à la fois pour indiquer que vous retournez par référence (pas une copie habituelle), et pour indiquer que vous assignez aussi par référence (pas la copie habituelle) pour la variable $myValue.
Note: Si vous tentez de retourner une référence depuis une fonction avec la syntaxe :return ($this->value);, cela ne fonctionnera pas comme vous l'attendez et retournera le résultat de l'expression, mais pas de la variable, par référence. Vous ne pouvez retourner des variables par référence que depuis une fonction - rien d'autre. Depuis PHP 4.4.0 et PHP 5.1.0, une alerte E_NOTICE est envoyée si le code tente de retourner une expression dynamique ou un résultat de l'opérateur new.
Lorsque vous détruisez une référence, vous ne faites que casser le lien entre le nom de la variable et son contenu. Cela ne signifie pas que le contenu est détruit. Par exemple :
Exemple #1 Détruire une référence
<?php
$a = 1;
$b =& $a;
unset($a);
?>
Cet exemple ne détruira pas $b, mais juste $a.
Encore une fois, on peut comparer cette action avec la fonction unlink d'Unix.
De nombreuses syntaxes de PHP sont implémentées via le mécanisme de référence, et tout ce qui a été vu concernant les liaisons entre variables s'applique à ces syntaxes. Par exemple, le passage et le retour d'arguments par référence. Quelques autres exemples de syntaxes :
Lorsque vous déclarez une variable global $var, vous créez en fait une référence sur une variable globale. Ce qui signifie que
Exemple #1 Références sur les variables globales
<?php
$var =& $GLOBALS["var"];
?>
Et que, si vous détruisez la variable $var, la variable globale ne sera pas détruite.
Dans une méthode d'objet, $this est toujours une référence sur l'objet courant.
PHP fournit un très grand nombre de variables prédéfinies accessible à tous vos scripts. Ces variables représentent à peu près tout, allant des variables externes aux variables d'environnement intégrées à PHP, en passant par les derniers messages d'erreur ou les en-têtes récupérés.
Voir la FAQ intitulée "Comment la directive register_globals affecte-t-elle mes scripts ?"
Les Superglobales — Les Superglobales sont des variables internes qui sont toujours disponibles, quelque soit le contexte
Énormément de variables prédéfinies en PHP sont "superglobales", ce qui signifie qu'elles sont disponibles quelque soit le contexte du script. Il est inutile de faire global $variable; avant d'y accéder dans les fonctions ou les méthodes.
Les variables superglobales sont :
| Version | Description |
|---|---|
| 4.1.0 | Les superglobales sont introduites en PHP. |
Note: Disponibilité des variables
Par défaut, toutes les superglobales sont disponibles, et seules les directives de configuration peuvent les rendre indisponibles. Pour plus d'informations, reportez-vous à la documentation sur l'ordre des variables.
Note: Gérer la directive register_globals
Si la directive obsolète register_globals est définit à on, alors les simples variables seront également disponibles dans le contexte global du script. Par exemple, $_POST['foo'] existera également sous la forme $foo.
Pour plus d'informations, voir la FAQ intitulée "Comment la directive register_globals affecte-t-elle mes scripts ?"
Note: Variable variables
Les superglobales ne peuvent pas être utilisées comme variable variables dans une fonction ou une méthode d'une classe.
$GLOBALS — Référence toutes les variables disponibles dans un contexte global
Un tableau associatif contenant les références sur toutes les variables globales actuellement définies dans le contexte d'exécution global du script. Les noms des variables sont les index du tableau.
Exemple #1 Exemple avec $GLOBALS
<?php
function test() {
$foo = "variable locale";
echo '$foo dans le contexte global : ' . $GLOBALS["foo"] . "\n";
echo '$foo dans le contexte courant : ' . $foo . "\n";
}
$foo = "Exemple de contenu";
test();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
$foo dans le contexte global : Exemple de contenu $foo dans le contexte courant : variable locale
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
Note: Disponibilité des variables
Contrairement à toutes les autres superglobales, $GLOBALS a toujours été disponible en PHP.
$_SERVER -- $HTTP_SERVER_VARS [Obsolète] — Variables de serveur et d'exécution
$_SERVER est un tableau contenant des informations comme les en-têtes, dossiers et chemins du script. Les entrées de ce tableau sont créées par le serveur web. Il n'y a aucune garantie que tous les serveurs les rempliront tous ; certains en oublieront quelques-unes et en rajouteront de nouvelles non mentionnées ici. Cependant, un grand nombre de ces variables fait partie des » spécifications CGI 1.1, et vous pouvez donc vous attendre à les retrouver.
$HTTP_SERVER_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_SERVER_VARS et $_SERVER sont des variables différentes et que PHP les traite en tant que telles.)
Vous pouvez éventuellement trouver les éléments suivants dans la variable $_SERVER. Notez que certains, n'auront pas de sens si vous utilisez PHP en ligne de commande.
Note: Le script PHP se termine après avoir envoyé les en-têtes (après avoir produit n'importe quelle sortie sans avoir affiché le buffer) si la méthode de la requête était HEAD.
Note: Noter que lors de l'utilisation de ISAPI avec IIS, la valeur sera off si la demande n'a pas été faite via le protocole HTTPS.
Note: Votre serveur web doit être configuré pour créer cette variable. Par exemple, pour Apache, vous devez ajouter la directive HostnameLookups On dans le fichier httpd.conf, pour que cette variable existe. Voyez aussi gethostbyaddr().
Le chemin absolu vers le fichier contenant le script en cours d'exécution.
Note: Si un script est exécuté avec le CLI, avec un chemin relatif, comme file.php ou ../file.php, $_SERVER['SCRIPT_FILENAME'] contiendra le chemin relatif spécifié par l'utilisateur.
Note: Depuis PHP 4.3.2, la variable PATH_TRANSLATED n'est plus seulement définie implicitement sous Apache 2 SAPI contrairement à la situation sous Apache 1 où elle est définie avec la même valeur que la variable serveur SCRIPT_FILENAME lorsqu'elle n'est pas fournie par Apache. Ce changement a été effectué pour être conforme aux spécifications CGI qui fait que la variable PATH_TRANSLATED doit exister seulement si la variable PATH_INFO est définie. Les utilisateurs d'Apache 2 devraient utiliser AcceptPathInfo = On dans leur httpd.conf pour définir PATH_INFO.
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_SERVER, rendant obsolète $HTTP_SERVER_VARS. |
Exemple #1 Exemple avec $_SERVER
<?php
echo $_SERVER['SERVER_NAME'];
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
www.example.com
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$_GET -- $HTTP_GET_VARS [Obsolète] — Variables HTTP GET
Un tableau associatif des valeurs passées au script courant via les paramètres d'URL.
$HTTP_GET_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_GET_VARS et $_GET sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_GET, rendant obsolète $HTTP_GET_VARS. |
Exemple #1 Exemple avec $_GET
<?php
echo 'Bonjour ' . htmlspecialchars($_GET["name"]) . '!';
?>
En assumant que l'utilisateur a entré http://example.com/?name=Yannick
L'exemple ci-dessus va afficher quelque chose de similaire à :
Bonjour Yannick !
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$_POST -- $HTTP_POST_VARS [Obsolète] — Variables HTTP POST
Un tableau associatif des valeurs passées au script courant via le protocole HTTP et la méthode POST.
$HTTP_POST_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_POST_VARS et $_POST sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_POST, rendant obsolète $HTTP_POST_VARS. |
Exemple #1 Exemple avec $_POST
<?php
echo 'Bonjour ' . htmlspecialchars($_POST["name"]) . '!';
?>
En assumant que l'utilisateur a POSTé name=Yannick
L'exemple ci-dessus va afficher quelque chose de similaire à :
Bonjour Yannick !
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$_FILES -- $HTTP_POST_FILES [Obsolète] — Variable de téléchargement de fichier via HTTP
Un tableau associatif des valeurs téléchargées au script courant via le protocole HTTP et la méthode POST.
$HTTP_POST_FILES contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_POST_FILES et $_FILES sont des variables différentes et que PHP les traite comme telles)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_FILES, rendant obsolète $HTTP_POST_FILES. |
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$_REQUEST — Variables de requête HTTP
Un tableau associatif qui contient par défaut le contenu des variables $_GET, $_POST et $_COOKIE.
| Version | Description |
|---|---|
| 5.3.0 | Introduction de request_order. Cette directive affecte le contenu de la variable $_REQUEST. |
| 4.3.0 | Les informations de $_FILES ont été supprimées de la variable $_REQUEST. |
| 4.1.0 | Introduction de $_REQUEST. |
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
Note: En ligne de commande, cette variable n'inclut pas les variables argv et argc : elles sont stockées dans le tableau $_SERVER.
Note: Les variables contenues dans $_REQUEST sont fournies au script via les méchanismes d'entrée GET, POST, et COOKIE et donc, peuvent être modifiées par l'utilisateur final ; aussi, vous ne pouvons faire confiance à leurs contenues. La présence ainsi que l'ordre de ces variables dans ce tableau sont définis suivant la directive de configuration variables_order.
$_SESSION -- $HTTP_SESSION_VARS [obsolète] — Variables de session
Un tableau associatif des valeurs stockées dans les sessions, et accessible au script courant. Elle est automatiquement globale dans tous les contextes d'exécution. Voyez l'extension Sessions pour plus de détails sur comment est utilisée cette variable.
$HTTP_SESSION_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_SESSION_VARS et $_SESSION sont des variables différentes et que PHP les traite comme telles)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_SESSION, rendant obsolète $HTTP_SESSION_VARS. |
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$_ENV -- $HTTP_ENV_VARS [Obsolète] — Variables d'environnement
Un tableau associatif de variable passé au script courant, via la méthode d'environnement.
Cette variable est importée dans l'espace de nom global de PHP, depuis l'environnement dans lequel l'exécutable PHP fonctionne. De nombreuses valeurs sont fournies par le shell qui exécute PHP, et différents systèmes pouvant disposer de différents shell, même un début de liste serait ici impossible. Reportez-vous à la documentation de votre shell pour connaître une liste de variables pré-définies.
Les autres variables d'environnement incluent les variables CGI, placées ici, indépendemment du fait que PHP fonctionne en tant que CGI ou bien que module du serveur.
$HTTP_ENV_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_ENV_VARS et $_ENV sont des variables différentes et que PHP les traite comme telles.)
| Version | Description |
|---|---|
| 4.1.0 | Introduction de $_ENV, rendant obsolète $HTTP_ENV_VARS. |
Exemple #1 Exemple avec $_ENV
<?php
echo 'Mon nom d\'utilisateur est ' .$_ENV["USER"] . '!';
?>
En assumant que "yannick" exécute ce script
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon nom d'utilisateur est yannick !
Note: Ceci est une 'superglobale', ou variable globale automatique. Cela signifie simplement que cette variable est disponible dans tous les contextes du script. Il n'est pas nécessaire de faire global $variable; pour y accéder dans les fonctions ou les méthodes.
$php_errormsg — Le dernier message d'erreur
$php_errormsg est une variable qui contient le texte de la dernière erreur générée par PHP. Cette variable sera uniquement accessible dans le même contexte d'exécution que celui de la ligne qui a généré l'erreur, et uniquement si la directive de configuration track_errors est activée (elle est désactivée par défaut).
Note: Cette variable n'est disponible que lorsque track_errors a été activé dans le fichier php.ini.
Si un gestionnaire d'erreurs définit par l'utilisateur est actif (set_error_handler()), $php_errormsg ne sera définit que si le gestionnaire d'erreur retourne FALSE.
Exemple #1 Exemple avec $php_errormsg
<?php
@strpos();
echo $php_errormsg;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Wrong parameter count for strpos()
$HTTP_RAW_POST_DATA — Données POST brutes
$HTTP_RAW_POST_DATA contient les données POST brutes. Voir always_populate_raw_post_data.
$http_response_header — En-têtes de réponse HTTP
Le tableau $http_response_header est similaire à la fonction get_headers(). Lors de l'utilisation du gestionnaire HTTP, $http_response_header sera peuplé des en-têtes de réponse HTTP.
Exemple #1 Exemple avec $http_response_header
<?php
file_get_contents("http://example.com");
var_dump($http_response_header);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
$argc — Le nombre d'arguments passé au script
Contient le nombre d'arguments passé au script courant lorsqu'il est exécuté depuis la ligne de commande.
Note: Le nom du fichier contenant le script est toujours passé en tant qu'argument au script, toutefois, la valeur minimale de $argc est 1.
Note: Cette variable n'est disponible que lorsque register_argc_argv est activé.
Exemple #1 Exemple avec $argc
<?php
var_dump($argc);
?>
Lorsque l'on exécute l'exemple avec la commande : php script.php arg1 arg2 arg3
L'exemple ci-dessus va afficher quelque chose de similaire à :
int(4)
$argv — Tableau d'arguments passé au script
Contient un tableau de tous les arguments passés au script lorsqu'il est passé depuis la ligne de commande.
Note: Le premier argument est toujours le nom du fichier contenant le script, toutefois, $argv[0] correspond au nom du script.
Note: Cette variable n'est disponible que lorsque register_argc_argv est activé.
Exemple #1 Exemple avec $argv
<?php
var_dump($argv);
?>
Lorsque l'on exécute l'exemple avec la commande : php script.php arg1 arg2 arg3
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(4) {
[0]=>
string(10) "script.php"
[1]=>
string(4) "arg1"
[2]=>
string(4) "arg2"
[3]=>
string(4) "arg3"
}
Voir aussi les exceptions SPL.
Exception est la classe de base pour toutes les exceptions.
Le message de l'exception
Nom interne de l'exception
Le code de l'exception
Le nom du fichier dans lequel l'exception a été lancée
La ligne où l'exception a été lancée
La trace dans la pile
(PHP 5 >= 5.1.0)
Exception::__construct — Construit l'exception
Construit l'exception.
Le message de l'exception à lancer.
Le code de l'exception.
L'exception précédente, utilisée pour le chaînage d'exception.
| Version | Description |
|---|---|
| 5.3.0 | Le paramètre previous a été ajouté. |
(PHP 5 >= 5.1.0)
Exception::getMessage — Récupère le message de l'exception
Retourne le message de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne le message de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::getMessage()
<?php
try {
throw new Exception("Un message d'erreur");
} catch(Exception $e) {
echo $e->getMessage();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Un message d'erreur
(PHP 5 >= 5.3.0)
Exception::getPrevious — Retourne l'exception précédente
Retourne l'exception précédente (le troisième paramètre de la méthode Exception::__construct).
Cette fonction ne contient aucun paramètre.
Retourne la précédente Exception si disponible, NULL sinon.
Exemple #1 Exemple avec Exception::getPrevious
Une boucle, on affiche et on capture les exceptions.
<?php
class MyCustomException extends Exception {}
function doStuff() {
try {
throw new InvalidArgumentException("Vous avez fais une erreur !", 112);
} catch(Exception $e) {
throw new MyCustomException("Un problème est survenu", 911, $e);
}
}
try {
doStuff();
} catch(Exception $e) {
do {
printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
/home/bjori/ex.php:8 Un problème est survenu (911) [MyCustomException] /home/bjori/ex.php:6 Vous avez fais une erreur ! (112) [InvalidArgumentException]
(PHP 5 >= 5.1.0)
Exception::getCode — Récupère le code de l'exception
Retourne le code de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne le code de l'exception, sous la forme d'un entier.
Exemple #1 Exemple avec Exception::getCode()
<?php
try {
throw new Exception("Un message d'erreur", 30);
} catch(Exception $e) {
echo "Le code de l'exception est : " . $e->getCode();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Le code de l'exception est : 30
(PHP 5 >= 5.1.0)
Exception::getFile — Récupère le fichier dans lequel l'exception est survenue
Récupère le nom du fichier dans lequel l'exception a été lancée.
Cette fonction ne contient aucun paramètre.
Retourne le nom du fichier dans lequel l'exception a été lancée.
Exemple #1 Exemple avec Exception::getFile()
<?php
try {
throw new Exception;
} catch(Exception $e) {
echo $e->getFile();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
/home/bjori/tmp/ex.php
(PHP 5 >= 5.1.0)
Exception::getLine — Récupère la ligne dans laquelle l'exception est survenue
Retourne le numéro de la ligne où l'exception a été lancée.
Cette fonction ne contient aucun paramètre.
Retourne le numéro de la ligne où l'exception a été lancée.
Exemple #1 Exemple avec Exception::getLine()
<?php
try {
throw new Exception("Un message d'erreur");
} catch(Exception $e) {
echo "L'exception a été lancée depuis la ligne : " . $e->getLine();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
L'exception a été lancée depuis la ligne : 3
(PHP 5 >= 5.1.0)
Exception::getTrace — Récupère la trace de la pile
Retourne la trace de la pile de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne la trace de la pile de l'exception sous la forme d'un tableau.
Exemple #1 Exemple avec Exception::getTrace()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
var_dump($e->getTrace());
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
array(1) {
[0]=>
array(4) {
["file"]=>
string(22) "/home/bjori/tmp/ex.php"
["line"]=>
int(7)
["function"]=>
string(4) "test"
["args"]=>
array(0) {
}
}
}
(PHP 5 >= 5.1.0)
Exception::getTraceAsString — Récupère la trace de la pile en tant que chaîne
Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.
Cette fonction ne contient aucun paramètre.
Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::getTraceAsString()
<?php
function test() {
throw new Exception;
}
try {
test();
} catch(Exception $e) {
echo $e->getTraceAsString();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
#0 /home/bjori/tmp/ex.php(7): test()
#1 {main}
(PHP 5 >= 5.1.0)
Exception::__toString — Représente l'exception sous la forme d'une chaîne
Retourne une représentation de l'exception sous forme d'une chaîne de caractères.
Cette fonction ne contient aucun paramètre.
Retourne la représentation de l'exception, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec Exception::__toString()
<?php
try {
throw new Exception("Message d'erreur");
} catch(Exception $e) {
echo $e;
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
exception 'Exception' with message 'Message d'erreur' in /home/bjori/tmp/ex.php:3
Stack trace:
#0 {main}
(PHP 5 >= 5.1.0)
Exception::__clone — Clone l'exception
Tenter de cloner l'exception, qui résulte en une erreur fatale.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
Les exceptions ne sont pas clonables.
Une exception pour les erreurs.
La sévérité de l'exception
Exemple #1 Utilisation de set_error_handler() pour changer tous les messages d'erreurs en ErrorException
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* Lance l'exception */
strpos();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Fatal error: Uncaught exception 'ErrorException' with message 'Wrong parameter count for strpos()' in /home/bjori/tmp/ex.php:8
Stack trace:
#0 [internal function]: exception_error_handler(2, 'Wrong parameter...', '/home/bjori/php...', 8, Array)
#1 /home/bjori/php/cleandocs/test.php(8): strpos()
#2 {main}
thrown in /home/bjori/tmp/ex.php on line 8
(PHP 5 >= 5.1.0)
ErrorException::__construct — Construit l'exception
Construit l'exception.
Le message de l'exception à lancer.
Le code de l'exception.
Le degré de sévérité de l'exception.
Le fichier depuis lequel l'exception est lancée.
Le numéro de ligne depuis laquelle l'exception est lancée.
(PHP 5 >= 5.1.0)
ErrorException::getSeverity — Récupère la sévérité de l'exception
Retourne la sévérité de l'exception.
Cette fonction ne contient aucun paramètre.
Retourne le degré de sévérité de l'exception.
Exemple #1 Exemple avec ErrorException::ErrorException()
<?php
try {
throw new ErrorException("Exception message", 0, 75);
} catch(ErrorException $e) {
echo "La sévérité de l'exception est : " . $e->getSeverity();
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
La sévérité de l'exception est : 75
Voir aussi les interfaces SPL.
Interface permettant de détecter si une classe peut être parcourue en utilisant foreach.
L'interface de base est abstraite et ne peut être implémentée seule. Elle doit être implémentée par soit IteratorAggregate, soit Iterator.
Note: Les classes internes qui implémentent cette interface peuvent être utilisées dans une constructeur foreach et n'ont pas besoin d'implémenter IteratorAggregate ou Iterator.
Note: Ceci est une interface du moteur interne qui ne peut être implémentée dans des scripts PHP. Vous devez utiliser à la place IteratorAggregate ou Iterator.
Cette interface n'a pas de méthode ; son seul but est d'être l'interface de base pour toutes les classes permettant de parcourir des objets.
Interface pour les itérateurs ou les objets externes qui peuvent être itérés eux-mêmes en interne.
Exemple #1 Exemple simple
Cet exemple montre l'ordre d'appel des méthodes lors d'un appel à l'instruction foreach sur un itérateur.
<?php
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"premierelement",
"secondelement",
"dernierelement",
);
public function __construct() {
$this->position = 0;
}
function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}
function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}
function key() {
var_dump(__METHOD__);
return $this->position;
}
function next() {
var_dump(__METHOD__);
++$this->position;
}
function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}
$it = new myIterator;
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(18) "myIterator::rewind" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(0) string(12) "premierelement" string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(1) string(13) "secondelement" string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" int(2) string(11) "dernierelement" string(16) "myIterator::next" string(17) "myIterator::valid"
(PHP 5 >= 5.1.0)
Iterator::current — Retourne l'élément courant
Cette fonction ne contient aucun paramètre.
Peut retourner tout type.
(PHP 5 >= 5.1.0)
Iterator::key — Retourne la clé de l'élément courant
Retourne la clé de l'élément courant.
Cette fonction ne contient aucun paramètre.
Retourne un scalaire en cas de succès, un entier 0 si une erreur survient.
Émet une alerte de type E_WARNING si une erreur survient.
(PHP 5 >= 5.1.0)
Iterator::next — Se déplace sur l'élément suivant
Se déplace de la position courant à l'élément suivant.
Note: Cette méthode est appelée après chaque boucle foreach.
Cette fonction ne contient aucun paramètre.
Les valeurs retournées seront ignorées.
(PHP 5 >= 5.1.0)
Iterator::rewind — Replace l'itérateur sur le premier élément
Replace l'itérateur sur le premier élément.
Note: C'est la première méthode appelée lors du départ d'une boucle foreach. Elle ne sera pas exécutée après la boucle foreach.
Cette fonction ne contient aucun paramètre.
Toutes les valeurs retournées sont ignorées.
(PHP 5 >= 5.1.0)
Iterator::valid — Vérifie si la position courante est valide
Cette méthode est appelée après Iterator::rewind et Iterator::next pour vérifier si la position courante est valide.
Cette fonction ne contient aucun paramètre.
La valeur retournée sera transtypée en booléen, puis, évaluée. Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Interface pour créer un itérateur externe.
Exemple #1 Exemple simple
<?php
class myData implements IteratorAggregate {
public $property1 = "Propriété publique numéro un";
public $property2 = "Propriété publique numéro deux";
public $property3 = "Propriété publique numéro trois";
public function __construct() {
$this->property4 = "dernière propriété";
}
public function getIterator() {
return new ArrayIterator($this);
}
}
$obj = new myData;
foreach($obj as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(9) "property1" string(19) "Propriété publique numéro un" string(9) "property2" string(19) "Propriété publique numéro deux" string(9) "property3" string(21) "Propriété publique numéro trois" string(9) "property4" string(13) "dernière propriété"
(PHP 5 >= 5.1.0)
IteratorAggregate::getIterator — Retourne un itérateur externe
Retourne un itérateur externe.
Cette fonction ne contient aucun paramètre.
Une instance d'un objet qui implémente un Iterator ou l'interface Traversable.
Émet une Exception en cas d'échec.
Interface permettant d'accéder aux objets de la même façon que pour les tableaux.
Exemple #1 Exemple simple
<?php
class obj implements arrayaccess {
private $container = array();
public function __construct() {
$this->container = array(
"un" => 1,
"deux" => 2,
"trois" => 3,
);
}
public function offsetSet($offset, $value) {
$this->container[$offset] = $value;
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
$obj = new obj;
var_dump(isset($obj["deux"]));
var_dump($obj["deux"]);
unset($obj["deux"]);
var_dump(isset($obj["deux"]));
$obj["deux"] = "Une valeur";
var_dump($obj["deux"]);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
bool(true) int(2) bool(false) string(7) "A value"
(PHP 5 >= 5.1.0)
ArrayAccess::offsetExists — Indique si une position existe dans un tableau
Indique si une position existe.
Cette méthode est exécutée lorsque la fonction isset() ou empty() est appliquée à un objet qui implémente l'interface ArrayAccess.
Note: Lors de l'utilisation de empty(), ArrayAccess::offsetGet() est appelé et vérifie si la valeur est vide, uniquement si ArrayAccess::offsetExists() retourne TRUE.
Une position à vérifier.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Note: La valeur retournée sera transtypée en booléen si une valeur non booléenne est retournée.
Exemple #1 Exemple avec ArrayAccess::offsetExists()
<?php
class obj implements arrayaccess {
public function offsetSet($offset, $value) {
var_dump(__METHOD__);
}
public function offsetExists($var) {
var_dump(__METHOD__);
if ($var == "foobar") {
return true;
}
return false;
}
public function offsetUnset($var) {
var_dump(__METHOD__);
}
public function offsetGet($var) {
var_dump(__METHOD__);
return "value";
}
}
$obj = new obj;
echo "Exécute obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));
echo "\nExécute obj::offsetExists() et obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));
echo "\nExécute obj::offsetExists(), *et non pas* obj:offsetGet() car il n'y a rien à lire\n";
var_dump(empty($obj["foobaz"]));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Exécute obj::offsetExists() string(17) "obj::offsetExists" bool(true) Exécute obj::offsetExists() et obj::offsetGet() string(17) "obj::offsetExists" string(14) "obj::offsetGet" bool(false) Exécute obj::offsetExists(), *et non pas* obj:offsetGet() car il n'y a rien à lire string(17) "obj::offsetExists" bool(true)
(PHP 5 >= 5.1.0)
ArrayAccess::offsetGet — Position à lire
Retourne la valeur à la position donnée.
Cette méthode est exécutée lorsque l'on vérifie si une position est empty().
La position à lire.
Peut retourner n'importe quel type de valeur.
(PHP 5 >= 5.1.0)
ArrayAccess::offsetSet — Position à assigner
Assigne une valeur à une position donnée.
La position à laquelle assigner une valeur.
La valeur à assigner.
Aucune valeur n'est retournée.
(PHP 5 >= 5.1.0)
ArrayAccess::offsetUnset — Position à supprimer
Supprime une position.
Note: Cette méthode ne sera pas appelée lors du transtypage en (unset).
La position à supprimer.
Aucune valeur n'est retournée.
Interface permettant de personnaliser la linéarisation.
Les classes implémentant cette interface ne supportent plus __sleep() et __wakeup(). La méthode de linéarisation est appelée chaque fois qu'une instance doit être linéarisée. Elle n'appelle pas la méthode __destruct() et n'a aucun effet sur le contenu de cette méthode. Lorsque les données sont linéarisées, la classe est connue et la méthode unserialize() appropriée est appelée comme constructeur au lieu d'appeler __construct(). Si vous devez appeler le constructeur standard, vous pouvez le faire dans la méthode.
Exemple #1 Exemple simple
<?php
class obj implements Serializable {
private $data;
public function __construct() {
$this->data = "Mes données privées";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
$this->data = unserialize($data);
}
public function getData() {
return $this->data;
}
}
$obj = new obj;
$ser = serialize($obj);
$newobj = unserialize($ser);
var_dump($newobj->getData());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
string(15) "Mes données privées"
(PHP 5 >= 5.1.0)
Serializable::serialize — Représentation linéaire de l'objet
Retourne la représentation en chaîne de caractères de l'objet.
Note: Cette méthode se comporte comme un destructeur de l'objet. La méthode __destruct() ne sera pas appelée après cette méthode.
Cette fonction ne contient aucun paramètre.
Retourne la représentation de l'objet en chaîne de caractères, ou bien NULL
Émet une Exception si un autre type que chaîne de caractères ou NULL est retourné.
(PHP 5 >= 5.1.0)
Serializable::unserialize — Construit un objet
Called during unserialization of the object.
Note: Cette méthode se comporte comme un constructeur d'objet. La méthode __construct() ne sera pas appelée après cette méthode.
La représentation en chaîne de l'objet.
Retourne la valeur originale délinéarisée.
PHP offre divers options et paramètres de contexte, qui peuvent être utilisés avec tous les systèmes de fichiers et gestionnaires de flux. Le contexte est créé avec la fonction stream_context_create(). Les options sont définies avec la fonction stream_context_set_option() et les paramètres, avec la fonction stream_context_set_params().
Options de contexte des sockets — Liste des options de contexte des sockets
Les options de contexte des sockets sont disponibles pour tous les gestionnaires fonctionnant via les sockets, comme tcp, http et ftp.
| Version | Description |
|---|---|
| 5.1.0 | Ajout du paramètre bindto. |
Exemple #1 Exemple d'utilisation du paramètre bindto
<?php
// Connexion à Internet en utilisant l'IP '192.168.0.100'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);
// Connexion à Internet en utilisant l'IP '192.168.0.100' et le port '7000'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);
// Connexion à Internet en utilisant le port '7000'
$opts = array(
'socket' => array(
'bindto' => '0:7000',
),
);
// Création du contexte...
$context = stream_context_create($opts);
// ...et l'utilise pour récupérer les données
echo file_get_contents('http://www.example.com', false, $context);
?>
Options de contexte HTTP — Liste des options de contexte HTTP
Options de contexte pour les protocoles http:// et https://.
| Version | Description |
|---|---|
| 5.3.0 | Le paramètre protocol_version support les transfert chunked lorsqu'on lui assigne la valeur 1.1. |
| 5.2.10 | Ajout du paramètre ignore_errors . |
| 5.2.1 | Ajout du paramètre timeout . |
| 5.2.10 | Le paramètre header peut désormais être un tableau indexé numériquement. |
| 5.1.0 | Ajout la possibilité d'utiliser des proxy HTTPS via des proxy HTTP. |
| 5.1.0 | Ajout du paramètre max_redirects . |
| 5.1.0 | Ajout du paramètre protocol_version . |
Exemple #1 Récupération d'une page et envoi de données POST
<?php
$postdata = http_build_query(
array(
'var1' => 'du contenu',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Note: Options de contexte du flux sous-jacent
Des options de contexte supplémentaires peuvent être supportées par le transport sous-jacent. Pour les flux http://, référez-vous aux options de contexte du transport tcp://. Pour les flux https://, référez-vous aux options de contexte du transport ssl://.
Options de contexte FTP — Liste des options de contexte FTP
Options de contexte pour les protocoles ftp:// et ftps://.
| Version | Description |
|---|---|
| 5.1.0 | Ajout du paramètre proxy . |
| 5.0.0 | Ajout des paramètres overwrite et resume_pos . |
Note: Options de contexte du flux sous-jacent
Des options de contexte supplémentaires peuvent être supportées par le transport sous-jacent. Pour les flux ftp://, référez-vous aux options de contexte du transport tcp://. Pour les flux ftps://, référez-vous aux options de contexte du transport ssl://.
Options de contexte SSL — Liste des options de contexte SSL
Options de contexte pour les protocoles ssl:// et tls://.
| Version | Description |
|---|---|
| 5.0.0 | Ajout des paramètres capture_peer_cert , capture_peer_chain et ciphers . |
Note: Vu que ssl:// est un protocole sous-jacent pour les gestionnaires https:// et ftps://, toutes les options de contexte appliquées à ssl:// seront également appliquées à https:// et ftps://.
Options de contexte CURL — Liste des options de contexte CURL
Les options de contexte CURL sont disponibles lorsque l'extension CURL a été compilée en utilisant l'option de configuration --with-curlwrappers.
Exemple #1 Récupère une page et envoie des données avec la méthode POST
<?php
$postdata = http_build_query(
array(
'var1' => 'du contenu',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>
Les options du contexte Phar — Liste des options du contexte Phar
Les options de contexte pour le gestionnaire phar://.
Paramètres de contexte — Liste des paramètres de contexte
Ces paramètres peuvent être définis sur un contexte, en utilisant la fonction stream_context_set_params().
PHP est un langage puissant et l'interpréteur, qu'il soit inclus dans le serveur web ou bien compilé en version CGI, est capable d'accéder aux fichiers, d'exécuter des commandes et d'ouvrir des connexions réseaux. Toutes ces propriétés rendent fragile la sécurité d'un serveur web. Le langage PHP a été pensé afin d'être un langage beaucoup plus sécurisé pour écrire des CGI que le Perl ou le langage C. De plus, une sélection rigoureuse des options de compilation et d'exécution vous permettra d'obtenir un équilibre parfait entre liberté et sécurité.
Étant donné qu'il y a de nombreux moyens d'utiliser le langage PHP, il y a de nombreuses directives de configuration afin d'en contrôler le comportement. Un grand nombre d'options permettent d'utiliser PHP dans de nombreuses situations, mais cela signifie aussi qu'il y a certaines combinaisons d'options de compilation et d'exécution qui fragilisent la sécurité du serveur. Ce chapitre explique comment les différentes options de configuration peuvent être combinées, tout en conservant une sécurité maximum.
La flexibilité de configuration de PHP est épaulée par la flexibilité du code. PHP peut être compilé pour constituer une application serveur complète, avec toutes les fonctionnalités d'un shell, ou il peut encore être utilisé comme simple SSI (server side include) avec peu de risque, dans un environnement à sécurité renforcée. La création de cet environnement et sa sécurité est largement à la charge du développeur PHP.
Ce chapitre commence par expliquer les différentes options de configuration et les situations dans lesquelles elles peuvent être utilisées en toute sécurité. Puis, viennent les considérations de niveaux de sécurité, et les conseils généraux.
Un système complètement sûr est une impossibilité virtuelle. L'approche souvent utilisée par les professionnels de la sécurité est d'équilibrer les risques et l'ergonomie. Si chaque variable fournie par l'utilisateur demandait deux formes de validation biométrique (un scan de la rétine et une empreinte digitale), on obtiendrait un système avec un niveau de sécurité d'un bon niveau. Il faudrait aussi une bonne heure pour remplir un formulaire simple, ce qui encouragerait les utilisateurs à trouver un moyen de contourner cette sécurité.
La meilleure sécurité est suffisamment discrète pour assurer un maximum de sécurité sans ajouter de contraintes insurmontables pour l'utilisateur ou de systèmes complexes de programmation. Souvent, les attaques sur un script sont des exploitations des systèmes de sécurité trop complexes, qui s'érodent au cour du temps.
Un principe qu'il est bon de retenir : Un système est aussi sur que son maillon le plus faible. Si toutes les transactions sont bien notées dans une base, avec confirmation mais que l'utilisateur est identifié uniquement par un cookie, la robustesse de votre système est sévèrement réduite.
Lorsque vous testez votre site, gardez en tête que vous ne pourrez jamais tester toutes les situations, même pour les pages les plus simples. Les valeurs que vous attendez seront toujours complètement différentes des valeurs entrées par un employé négligent, un hacker qui a toute la nuit devant lui ou encore le chat de la maison qui marche sur le clavier. C'est pourquoi il est préférable de regarder le code d'un point de vue logique, pour repérer les points d'entrée des données inattendues, puis de voir comment elles pourront être modifiées, amplifiées ou réduites.
L'Internet est rempli d'individus qui tentent de se faire une renommée en piratant vos programmes, en bloquant votre site, en envoyant des contenus inappropriés, qui rendent vos journées si "spéciales". Peu importe que vous ayez un grand portail ou un petit web, vous pouvez être la cible pour tout quidam avec une connexion. Vous êtes une cible potentielle dès que vous êtes connecté vous-même. Certains programmes de piratage ne font pas dans la demi-mesure, et testent systématiquement des millions d'IP, à la recherche de victimes : ne soyez pas la prochaine.
Utiliser PHP comme un CGI exécutable vient la majorité du temps du fait que l'on ne veut pas l'utiliser comme un module du serveur web, (comme Apache), ou bien que l'on souhaite l'utiliser en combinaison d'un CGI complémentaire, afin de créer un environnement de script sécurisé (en utilisant des techniques de chroot ou setuid). Une telle décision signifie habituellement que vous installez votre exécutable dans le répertoire cgi-bin de votre serveur web. » CERT CA-96.11 recommande effectivement de ne placer aucun interpréteur à l'intérieur du répertoire cgi-bin. Même si le programme PHP peut être utilisé comme interpréteur indépendant, PHP a été pensé afin de rendre impossible les attaques que ce type d'installation induit.
Si votre serveur n'a aucun document dont l'accès est restreint par un mot de passe ou un système de vérification de l'adresse IP, vous n'avez aucun besoin de ce type de configuration. Si votre serveur web ne permet pas les redirections, ou si votre serveur web n'a aucun besoin de communiquer avec le binaire PHP de manière sécurisée, vous pouvez utiliser l'option de compilation --disable-force-cgi-redirect. Vous devez quand même vérifier qu'aucun script ne fait appel au PHP, de manière directe, http://my.host/cgi-bin/php/dir/script.php ou bien de manière indirecte, par redirection, http://my.host/dir/script.php.
Les redirections peuvent être configurées dans les fichiers de configuration d'Apache en utilisant les directives "AddHandler" et "Action" (voir ci-dessous).
Cette option de compilation prévient quiconque d'appeler directement un script avec l'url http://my.host/cgi-bin/php/secretdir/script.php. Dans ce cas-là, PHP analysera le fichier uniquement s'il y a eu redirection.
Habituellement, le serveur web Apache réalise une redirection grâce aux directives suivantes :
Action php-script /cgi-bin/php AddHandler php-script .php
Cette option a uniquement été testée avec Apache et compte sur Apache pour affecter la variable d'environnement non-standard REDIRECT_STATUS pour les requêtes redirigées. Dans le cas où votre serveur web ne supporte pas le renseignement de PHP, pour savoir si la requête a été redirigée ou non, vous ne pouvez pas utiliser cette option de compilation. Vous devez alors utiliser une des autres méthodes d'exploitation de la version binaire CGI de PHP, comme exposé ci-dessous.
Ajouter un contenu interactif dans votre serveur web, comme des scripts ou des exécutables, est souvent considéré comme une pratique non-sécurisée. Si, par erreur, le script n'est pas exécuté mais affiché comme une page HTML classique, il peut en résulter un vol de propriété intellectuelle ou des problèmes de sécurité à propos des mots de passe notamment. Donc, la majorité des administrateurs préfèrent mettre en place un répertoire spécial pour les scripts qui soit uniquement accessible par le biais du binaire CGI de PHP, et donc, tous les fichiers de ce répertoire seront interprétés et non affichés tels quels.
Aussi, si vous ne pouvez pas utiliser la méthode présentée ci-dessus, il est nécessaire de mettre en place un répertoire "doc_root" différent de votre répertoire "document root" de votre serveur web.
Vous pouvez utiliser la directive doc_root dans le fichier de configuration, ou vous pouvez affecter la variable d'environnement PHP_DOCUMENT_ROOT. Si cette variable d'environnement est affectée, le binaire CGI de PHP construira toujours le nom de fichier à ouvrir avec doc_root et le "path information" de la requête, et donc vous serez sûr qu'aucun script n'est exécuté en dehors du répertoire prédéfini (à l'exception du répertoire désigné par la directive user_dir Voir ci-dessous).
Une autre option possible ici est la directive user_dir. Lorsque la directive n'est pas activée, seuls les fichiers contenus dans le répertoire doc_root peuvent être ouverts. Ouvrir un fichier possédant l'url http://my.host/~user/doc.php ne correspond pas à l'ouverture d'un fichier sous le répertoire racine de l'utilisateur mais à l'ouverture du fichier ~user/doc.php sous le répertoire "doc_root" (oui, un répertoire commence par un tilde [~]).
Si la directive "user_dir" est activée à la valeur public_php par exemple, une requête du type http://my.host/~user/doc.php ouvrira un fichier appelé doc.php sous le répertoire appelé public_php sous le répertoire racine de l'utilisateur. Si le répertoire racine des utilisateurs est /home/user, le fichier exécuté sera /home/user/public_php/doc.php.
user_dir et doc_root sont deux directives totalement indépendantes et donc vous pouvez contrôler l'accès au répertoire "document root" séparément des répertoires "user directory".
Une solution extrêmement sécurisée consiste à mettre l'exécutable PHP à l'extérieur de l'arborescence du serveur web. Dans le répertoire /usr/local/bin, par exemple. Le problème de cette méthode est que vous aurez à rajouter la ligne suivante :
Exemple #1 Ligne d'invocation de PHP
#!/usr/local/bin/php
dans tous les fichiers contenant des balises PHP. Vous devrez aussi rendre le binaire PHP exécutable. Dans ce cas-là, traitez le fichier exactement comme si vous aviez un autre script écrit en Perl ou en sh ou en un autre langage de script qui utilise #! comme mécanisme pour lancer l'interpréteur lui-même.
Pour que l'exécutable PHP prenne en compte les variables d'environnement PATH_INFO et PATH_TRANSLATED correctement avec cette configuration, vous devez utiliser l'option de compilation --enable-discard-path.
Lorsque PHP est compilé en tant que module Apache, ce module hérite des permissions accordées à l'utilisateur faisant tourner Apache (par défaut, l'utilisateur "nobody"). Cela à plusieurs impacts sur la sécurité et les autorisations. Par exemple, si vous utilisez PHP pour accéder à une base de données, à moins que la base n'ait un système de droits d'accès interne, vous devrez rendre la base accessible à l'utilisateur "nobody". Cela signifie qu'un script mal intentionné peut accéder à la base, la modifier sans identification. Il est aussi possible qu'un robot accède à la page d'administration, et détruise toutes les pages. Vous devez aussi protéger vos bases de données avec les autorisations Apache, ou définir votre propre modèle d'accès avec LDAP, .htaccess, etc. et inclure ce code dans tous vos scripts : PHP.
Souvent, lorsqu'on a établi les droits de l'utilisateur PHP (ici, l'utilisateur Apache) pour minimiser les risques, on s'aperçoit que PHP ne peut plus écrire de virus dans les fichiers des utilisateurs. Ou encore, modifier une base de données privée. Il est aussi incapable de modifier des fichiers qu'il devrait pouvoir modifier, ou effectuer certaines transactions.
Une erreur fréquente de sécurité est de donner à l'utilisateur Apache les droits de superadministrateur ou d'améliorer les possibilités d'Apache d'une autre façon.
Donner de telles permissions à l'utilisateur Apache est extrêmement dangereux, et peut compromettre tout le système, telle que l'utilisation des sudo ou du chroot. Pour les novices de la sécurité, une telle utilisation est à exclure d'office.
Il existe des solutions plus simples. En utilisant open_basedir vous pouvez contrôler et restreindre l'accès à certains dossiers qui pourront être utilisés par PHP. Vous pouvez aussi créer des aires de restrictionsApache, pour restreindre les activités anonymes liées aux internautes.
PHP est soumis aux règles de sécurité intrinsèques de la plupart des systèmes serveurs : il respecte notamment les droits des fichiers et des dossiers. Une attention particulière doit être portée aux fichiers ou dossiers qui sont accessibles à tout le monde, afin de s'assurer qu'ils ne divulguent pas d'informations critiques.
Puisque PHP a été fait pour permettre aux utilisateurs d'accéder aux fichiers, il est possible de créer un script qui vous permet de lire des fichiers tels que /etc/password, de modifier les connexions ethernet, lancer des impressions de documents, etc. Cela implique notamment que vous devez vous assurer que les fichiers manipulés par les scripts sont bien ceux qu'il faut.
Considérez le script suivant, où l'utilisateur indique qu'il souhaite effacer un fichier dans son dossier racine. Nous supposons que PHP est utilisé comme interface web pour gérer les fichiers, et que l'utilisateur Apache est autorisé à effacer les fichiers dans le dossier racine des utilisateurs.
Exemple #1 Une erreur de vérification de variable conduit à un gros problème
<?php
// Efface un fichier dans un dossier racine
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
unlink("$homedir/$userfile");
echo "Ce fichier a été effacé !";
?>
Étant donné que le nom de l'utilisateur et le nom du fichier sont fournis, des intrus peuvent envoyer un nom d'utilisateur et un nom de fichier autres que les leurs, et effacer des documents dans les comptes des autres utilisateurs. Dans ce cas, vous souhaiterez utiliser une autre forme d'identification. Considérez ce qui pourrait se passer si les utilisateurs passent ../etc/ et passwd comme arguments! Le code serait exécuté tel que :
Exemple #2 Une attaque du système de fichiers!
<?php
// efface un fichier n'importe où sur le disque dur,
// où l'utilisateur PHP a accès. Si PHP a un accès root :
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
$homedir = "/home/$username"; // "/home/../etc"
unlink("$homedir/$userfile"); // "/home/../etc/passwd"
echo "Ce fichier a été effacé !";
?>
Il y a deux mesures primordiales à prendre pour éviter ces manoeuvres :
Voici un script renforcé :
Exemple #3 Une vérification renforcée
<?php
// Efface un fichier sur le disque où l'utilisateur a le droit d'aller
$username = $_SERVER['REMOTE_USER']; // utilisation d'un méchanisme d'identification
$userfile = basename($_POST['user_submitted_filename']);
$homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (file_exists($filepath) && unlink($filepath)) {
$logstring = "$filepath effacé\n";
} else {
$logstring = "Échec lors de l'effacement de $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);
echo htmlentities($logstring, ENT_QUOTES);
?>
Cependant, même cette technique n'est pas sans faille. Si votre système d'identification permet aux utilisateurs de créer leur propre login, et qu'un utilisateur choisi le login ../etc/, le système est de nouveau exposé. Pour cette raison, vous pouvez essayez d'écrire un script renforcé :
Exemple #4 Vérification renforcée de noms de fichiers
<?php
$username = $_SERVER['REMOTE_USER']; // utilisation d'un méchanisme d'identification
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {
die("Mauvais utilisateur/nom de fichier");
}
//etc...
?>
Suivant votre système d'exploitation, vous devrez protéger un grand nombre de fichiers, notamment les entrées de périphériques, (/dev/ ou COM1), les fichiers de configuration (fichiers /etc/ et .ini), les lieux de stockage d'informations (/home/, My Documents), etc. Pour cette raison, il est généralement plus sûr d'établir une politique qui interdit TOUT sauf ce que vous autorisez.
Comme PHP utilise des fonctions C pour les opérations sous-jacentes, notamment au niveau du système de fichier, il peut gérer les octets nuls d'une façon inattendue. Sachant que les octets nuls dénotent la fin d'une chaîne de caractères en C, certaines fonctions vont donc considérer ces chaînes jusqu'à la première occurrence d'un octet nul. L'exemple suivant présente un code vulnérable qui montre ce problème :
Exemple #1 Script vulnérable aux octets nuls
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
// file_exists retournera true sachant que le fichier /home/wwwrun/../../etc/passwd existe
include '/home/wwwrun/'.$file.'.php';
// le fichier /etc/passwd sera inclu
}
?>
Ainsi, toute chaîne utilisée dans des opérations sur le système de fichiers doit toujours être validée proprement. Voici une meilleure solution de l'exemple précédent :
Exemple #2 Validation correcte de l'entrée
<?php
$file = $_GET['file'];
// Whitelisting possible values
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/'.$file.'.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>
De nos jours, les bases de données sont des composants incontournables des serveurs web et des applications en ligne, qui fournissent du contenu dynamique. Des données secrètes ou critiques peuvent être stockées dans les bases de données : il est donc important de les protéger efficacement.
Pour lire ou stocker des informations, vous devez vous connecter au serveur de bases de données, envoyer une requête valide, lire le résultat et refermer la connexion. De nos jours, le langage le plus courant pour ce type de communication est le langage SQL (Structured Query Language). Voyez comment un pirate peut s'introduire dans une requête SQL.
Comme vous pouvez le réaliser, PHP ne peut pas protéger vos bases de données pour vous. La section suivante vous introduira aux notions de base pour protéger vos bases de données, lors de la programmation de vos scripts.
Gardez bien cette règle simple en tête : la défense se fait par couches. Plus vous ajouterez de tests pour protéger votre base, plus faible sera la probabilité de réussite d'un pirate. Ajoutez à cela un bon schéma de base de données, et vous aurez une application réussie.
La première étape est de créer une base de données, à moins que vous ne souhaitiez utiliser une base de données déjà créée. Lorsque la base de données est créée, un utilisateur propriétaire en est responsable. Généralement, seul le propriétaire et le super utilisateur peuvent intervenir avec les tables de cette base, et il faut que ce dernier donne des droits à tous les intervenants qui auront à travailler sur cette base.
Les applications ne doivent jamais se connecter au serveur de bases de données sous le nom du propriétaire ou de l'administrateur, car ces utilisateurs ont des droits très importants, et pourront exécuter n'importe quelle requête, comme la modification de tables, l'effacement de lignes ou même encore, la destruction de la base.
Vous pouvez créer différents utilisateurs de bases de données pour chaque aspect de votre application, avec des droits limités aux seules actions planifiées. Il faut alors éviter que le même utilisateur dispose des droits de plusieurs cas d'utilisation. Cela permet que si des intrus obtiennent l'accès à la base avec l'un de ces jeux de droits, ils ne puissent pas affecter toute l'application.
Il est recommandé de ne pas implémenter toute la logique fonctionnelle dans l'application web (c'est-à-dire dans vos scripts), mais d'en reporter une partie dans la base en utilisant les déclencheurs, vues et règles. Si le système évolue, les nouvelles versions vous feront réécrire toute la logique et donc tous vos scripts. De plus, l'utilisation de déclencheurs permet de gérer de manière transparente des données, et fournit des indications pour déboguer votre application.
Il est recommandé d'établir des connexions au serveur avec le protocole SSL, pour chiffrer les échanges clients/serveur, afin d'améliorer la sécurité. Vous pouvez aussi utiliser un client SSH pour chiffrer la connexion entre les clients et le serveur de bases de données. Si l'une de ces deux protections est mise en place, il sera difficile de surveiller votre trafic et de comprendre les informations échangées.
Les protocoles SSL/SSH protègent les données qui circulent entre le serveur et le client, mais SSL/SSH ne protège pas les données une fois dans la base. SSL est un protocole en ligne.
Une fois que le pirate a obtenu l'accès direct à votre base de données (en contournant le serveur web), les données sensibles, stockées dans votre base sont accessibles directement, à moins que les données de la base ne soient protégées par la base. Chiffrer les données est une bonne solution pour réduire cette menace, mais très peu de bases de données offrent ce type de chiffrement.
Le moyen le plus simple pour contourner ce problème est de créer votre propre logiciel de chiffrement, et de l'utiliser dans vos scripts PHP. PHP peut vous aider dans cette tâche grâce aux nombreuses extensions dont il dispose, comme Mcrypt et Mhash, qui connaissent un large éventail de méthodes de chiffrement. Le script PHP va chiffrer les données qui seront stockées, et les déchiffrer lorsqu'elles seront relues. Voyez la suite pour des exemples d'utilisation de ce chiffrement.
Dans le cas de données vraiment sensibles, si la représentation originale n'est pas nécessaire (pour affichage, ou comparaison), utiliser un hash est une bonne solution. L'exemple classique est le stockage de mots de passe dans les bases de données, après les avoir passés au MD5. Voyez les fonctions crypt() et md5().
Exemple #1 Utiliser un mot de passe et MD5
<?php
// Stockage du mot de passe hashé
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);
// interroger le serveur pour comparer le mot de passe soumis
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo "Bienvenue, $username!";
} else {
echo "Identification échouée pour $username.";
}
?>
De nombreux développeurs web ne sont pas conscients des possibilités de manipulation des requêtes SQL, et supposent que les requêtes SQL sont des commandes sûres. Cela signifie qu'une requête SQL est capable de contourner les contrôles et vérifications, comme les identifications, et parfois, les requêtes SQL ont accès aux commandes d'administration.
L'injection SQL directe est une technique où un pirate modifie une requête SQL existante pour afficher des données cachées, ou pour écraser des valeurs importantes, ou encore exécuter des commandes dangereuses pour la base. Cela se fait lorsque l'application prend les données envoyées par l'internaute, et l'utilise directement pour construire une requête SQL. Les exemples ci-dessous sont basés sur une histoire vraie, malheureusement.
Avec le manque de vérification des données de l'internaute et la connexion au serveur avec des droits de super utilisateur, le pirate peut créer des utilisateurs, et créer un autre super utilisateur.
Exemple #1 Séparation des résultats en pages, et créer des administrateurs (PostgreSQL et MySQL)
<?php
$offset = $argv[0]; // Attention, aucune validation!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// avec PostgreSQL
$result = pg_query($conn, $query);
// avec MySQL
$result = mysql_query($query);
?>
Un utilisateur normal clique sur les boutons 'suivant' et 'précédent', qui sont alors placés dans la variable $offset, encodée dans l'URL. Le script s'attend à ce que la variable $offset soit alors un nombre décimal. Cependant, il est possible de modifier l'URL en ajoutant une nouvelle valeur, au format URL, comme ceci :
Exemple #2 Exemple d'injection SQL
<?php
// cas de PostgreSQL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
// cas de MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;
?>
Si cela arrive, le script va créer un nouveau super utilisateur. Notez que la valeur 0; sert à terminer la requête originale et la terminer correctement.
Note: C'est une technique répandue que de forcer l'analyseur SQL à ignorer le reste de la requête, en utilisant les symboles -- pour mettre en commentaires.
Un moyen disponible pour accéder aux mots de passe est de contourner la recherche de page. Ce que le pirate doit faire, c'est simplement voir si une variable du formulaire est utilisée dans la requête, et si elle est mal gérée. Ces variables peuvent avoir été configurées dans une page précédente pour être utilisées dans les clauses WHERE, ORDER BY, LIMIT et OFFSET des requêtes SELECT. Si votre base de données supporte les commandes UNION, le pirate peut essayer d'ajouter une requête entière pour lister les mots de passe dans n'importe quelle table. Utiliser la technique des mots de passe chiffrés est fortement recommandé.
Exemple #3 Liste d'articles ... et ajout de mot de passe
<?php
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
La partie statique de la requête, combinée avec une autre requête SELECT, va révéler les mots de passe :
Exemple #4 Révélation des mots de passe
<?php ' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; -- ?>
Si cette requête, exploitant les ' et -- est affectée à une variable utilisée dans $query, une injection SQL va se produire.
Les commandes UPDATE sont aussi sujettes à des attaques de votre base de données. Ces requêtes peuvent aussi introduire toute une nouvelle requête dans votre commande initiale. Mais en plus, le pirate peut jouer sur la commande SET. Dans ce cas, il doit connaître un peu votre base de données. Cela peut se deviner en examinant les noms de variables dans les formulaires, ou simplement, en testant les cas les plus classiques. Il n'y a pas beaucoup de conventions de noms pour stocker des noms d'utilisateurs et des mots de passe.
Exemple #5 Modifier un mot de passe ... et gain de droits!
<?php
$query= "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
Mais un internaute fourbe peut envoyer une valeur telle que ' or uid like '%admin%'; -- dans $uid pour modifier le mot de passe utilisateur, ou simplement, utiliser la variable $pwd avec la valeur "hehehe', admin='yes', trusted=100 " (avec l'espace final) pour obtenir des droits supplémentaires. La requête devient alors :
Exemple #6 Une requête et son injection
<?php
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"
?>
C'est un exemple terrible d'acquisition de droits d'administrateur sur un serveur de base de données.
Exemple #7 Attaque d'un serveur de bases de données (MSSQL Server)
<?php
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
Si le pirate injecte la valeur a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- dans la variable $prod, alors la requête $query devient :
Exemple #8 Attaque d'un serveur de base de données (MSSQL Server) - 2
<?php
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>
MSSQL Server exécute les requêtes SQL en lot, y compris la commande d'ajout d'un nouvel utilisateur à la base de données locale. Si cette application fonctionnait en tant que sa et que le service MSSQLSERVER disposait de niveau de droits suffisant, le pirate dispose désormais d'un compte avec accès au serveur.
Note: Certains des exemples ci-dessus sont spécifiques à certains serveurs de bases de données. Cela n'empêche pas des attaques similaires d'être possibles sur d'autres produits. Votre base de données sera alors vulnérable d'une autre manière.
Vous pouvez prétendre que le pirate doit d'abord obtenir des informations sur le schéma de la base de données, dans la plupart des cas d'injections. C'est vrai, mais vous ne saurez jamais comment ni quand ces informations auront filtré, et si cela arrive, votre base de données sera en grand danger. Si vous utilisez une base de données Open Source, ou une base qui est du domaine public, ou encore un schéma qui appartient à un système de gestion de contenu ou d'un forum, le pirate peut facilement se procurer une copie du code que vous utilisez. Cela peut être un risque potentiel si la base a été mal conçue.
Ces attaques sont généralement basées sur l'exploitation de code qui n'est pas écrit de manière sécuritaire. N'ayez aucune confiance dans les données qui proviennent de l'utilisateur, même si cela provient d'un menu déroulant, d'un champ caché ou d'un cookie. Le premier exemple montre comment une requête peut causer un désastre.
Si l'application attend une entrée numérique, vérifiez vos données avec la fonction is_numeric(), ou bien modifiez automatiquement le type avec la fonction settype(), ou encore avec sprintf().
Exemple #9 Une navigation de fiches plus sécuritaire
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// notez que %d dans la chaîne de format : %s serait inutile
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
?>
À côté de ces conseils, il est recommandé d'enregistrer vos requêtes, soit dans vos scripts, soit dans la base elle-même, si elle le supporte. Évidemment, cet enregistrement ne sera pas capable d'empêcher une attaque, mais vous permettra de retrouver la requête qui a fauté. L'historique n'est pas très utile par lui-même, mais au niveau des informations qu'il contient. Plus vous avez de détails, mieux c'est.
En termes de sécurité, il y a deux conséquences au rapport d'erreur. D'un coté, cela améliore la sécurité, mais d'un autre, cela la réduit aussi.
Une tactique d'attaque standard consiste à faire faire des erreurs au système, et lire les variables d'environnement et de contexte qui sont retournées. Cela permet au pirate de lire de nombreuses informations sur le serveur, et de détecter des faiblesses du serveur. Par exemple, si un intrus a glané des informations sur votre page, avec une première utilisation de votre site, il peut essayer de remplacer les variables par ses propres valeurs :
Exemple #1 Attaque de site avec une page HTML personnalisée
<form method="post" action="http://www.site.cible.com/?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo">
<input type="hidden" name="password" value="badfoo">
</form>
Les erreurs PHP qui sont normalement retournées peuvent être très pratiques pour un développeur qui essaie de déboguer un script, car elles donnent de précieux renseignements tels que quelle fonction a échoué, quel fichier n'a pas été trouvé, quel script PHP a un bug, et quelle ligne est en faute. Toutes ces informations sont exploitables. Il est commun aux développeurs PHP d'utiliser les fonctions show_source(), highlight_string(), ou highlight_file() comme outils de déboguage, mais sur un site en production, cela expose des variables cachées, des syntaxes non vérifiées ou d'autres informations critiques. Il est particulièrement dangereux d'exécuter du code de sources connues, avec les gestionnaires de débogage. Si l'intrus peut comprendre votre technique habituelle d'utilisation, il peut tenter une attaque frontale sur une page, en envoyant des chaînes de débogage :
Exemple #2 Exploiter des variables classiques de débogage
<form method="post" action="http://www.site.cible.com/?errors=Y&showerrors=1"&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>
Indépendamment de la gestion des erreurs, la possibilité de tester la gestion des erreurs d'un système conduit à un trou de sécurité, et la diffusion de plus d'informations sur votre système.
Si un pirate affiche une page html, et essaye de la tester (pour rechercher des faiblesses du système), il peut déterminer sur quel système PHP a été compilé.
Une erreur de fonction indique si un système supporte une base de données spécifique, ou bien indique comment la page a été générée. Cela peut orienter l'intrus vers les ports de cette base de données ou bien vers une attaque liée à cette application. En envoyant des données erronées, par exemple, un pirate peut déterminer l'ordre d'identification dans un script, à partir des lignes d'erreurs, et essayer de les exploiter ailleurs, dans le script.
Une erreur de fichier, ou une erreur générale PHP peut indiquer quelles sont les permissions du serveur web, ainsi que la structure et l'organisation des fichiers. Les gestionnaires d'erreurs utilisateurs peuvent aussi aggraver ce problème, en permettant l'exploitation facile d'informations préalablement cachées.
Il y a trois solutions majeures à ces problèmes : la première est de scruter toutes les fonctions, et d'essayer de traiter toutes les erreurs. La deuxième est de désactiver le rapport d'erreur, dès que le script est en production. La troisième est d'utiliser les fonctions de gestion des erreurs. Suivant votre politique de sécurité, vous pouvez utiliser un panachage savant des trois méthodes.
Une méthode pour gagner du temps est d'utiliser la fonction error_reporting(), pour vous aider à sécuriser le code, et détecter les utilisations dangereuses de variables. Vous testez votre code en béta test avec la valeur E_ALL, et vous pouvez rapidement repérer les variables qui ne sont pas protégées. Une fois que le code est prêt à être déployé, vous devez soit désactiver complètement le rapport d'erreur en affectant 0 à la fonction error_reporting(), soit en désactivant l'affichage des erreurs en utilisant l'option de configuration display_errors du php.ini. Si vous choisissez la dernière solution, vous devez également définir le chemin de votre fichier de log en utilisant la directive de configuration error_log, et en activant la directive log_errors.
Exemple #3 Détecter des variables non protégées avec E_ALL
<?php
if ($username) {
// Non initialisée, ou vérifée avant utilisation
$good_login = 1;
}
if ($good_login == 1) {
// Si le test ci-dessus échoue, les valeurs n'ont pas été testées
fpassthru ("/données/très/très/sensibles/index.html");
}
?>
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
L'une des évolutions les plus controversées de PHP a été le changement de valeur par défaut de la directive PHP register_globals, qui est passée de On à Off en PHP » 4.2.0. Beaucoup d'applications dépendaient de cette directive, et de nombreux programmeurs ne savaient même pas qu'elle existait, et supposait que c'était le fonctionnement normal de PHP. Cette page explique comment on peut écrire du code peu sécuritaire en utilisant cette directive. Gardez bien en tête que cette directive, par elle-même, n'est pas un trou de sécurité, mais qu'elle facilite leur création.
Lorsqu'elle est activée, register_globals va injecter vos scripts avec toutes sortes de variables, comme les variables issues des formulaires HTML. Ceci, couplé au fait que PHP ne requiert pas d'initialisation de variable signifie que la programmation de script peu sûr est possible. Ce fut une décision difficile de la communauté PHP, mais finalement, il a été décidé de désactiver par défaut cette variable. Lorsqu'elle est active, le programmeur ne sait pas exactement d'où provient le contenu de la variable, et ne peut que faire des suppositions. Les variables internes définies dans le script sont mélangées avec les données envoyées par les utilisateurs, et en désactivant register_globals, on empêche cela. Voyons avec un exemple le fonctionnement de register_globals :
Exemple #1 Exemple de mauvaise utilisation de register_globals
<?php
// $authorized = true uniquement si l'utilisateur est identifié
if (authenticated_user()) {
$authorized = true;
}
// Comme nous n'avons pas initialisé $authorized avec false, cette dernière
// peut être définie via register_globals, comme avec l'URL GET auth.php?authorized=1
// Tout le monde peut facilement être reconnu comme identifié!
if ($authorized) {
include "/donnees/critiques/data.php";
}
?>
Lorsque register_globals est activé, la logique ci-dessus peut être prise en défaut. Lorsque register_globals est désactivée $authorized ne peut plus être assignée via la requête, et le script est maintenant sûr, même s'il reste recommandé de toujours initialiser ses variables. Par exemple, dans notre programme ci-dessus, nous pourrions ajouter $authorized = false. En faisant cela, le script peut fonctionner avec register_globals on ou off, car les utilisateurs seront par défaut non-identifiés.
Un autre exemple implique les sessions. Lorsque register_globals est activé, on peut aussi utiliser $username dans notre exemple, mais, encore une fois, vous devez garder en tête que $username peut aussi provenir d'autres biais, tels que GET (via l'URL).
Exemple #2 Exemple d'abus de sessions avec register_globals on ou off
<?php
// Nous ne savons pas d'où provient $username mais nous savons que
// $_SESSION contient les données de session
if (isset($_SESSION['username'])) {
echo "Bonjour <strong>{$_SESSION['username']}</strong>";
} else {
echo "Bonjour <strong>visiteur</strong><br />";
echo "Voulez-vous vous identifier?";
}
?>
Il est même possible de prendre des mesures préventives, pour être alerté lorsqu'une tentative d'usurpation est faite. Si vous savez à l'avance de quelle variable le nom d'utilisateur doit provenir, vous pouvez vérifier si les données que vous manipulez sont d'une origine contrôlée. Même si cela ne garantit pas que les données ne puissent être falsifiées, cela complique la tache du faussaire. Si vous ne vous préoccupez pas de l'origine des données, vous pouvez utiliser la variable $_REQUEST qui contient un mélange de données GET, POST et COOKIE. Voyez aussi la section du manuel concernant les variables de sources externes à PHP.
Exemple #3 Détection simple de fausses variables
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE provient d'un cookie.
// Assurez-vous de valider les données du cookie!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Tentative possible d'attaque", $_SERVER['REMOTE_ADDR']);
echo "Alerte sécurité, l'admin a été prévenu.";
exit;
} else {
// MAGIC_COOKIE ne provient pas de REQUEST
}
?>
Bien sur, désactiver l'option register_globals ne signifie pas que votre code est sécuritaire. Pour chaque donnée reçu, vous devez appliquer un maximum de validations. Vérifiez toujours les données de votre visiteur, et initialisez vos variables! Pour vérifier les variables non-initialisées, voyez la fonction error_reporting(), qui peut afficher les erreurs de niveau E_NOTICE.
Pour des informations sur l'émulation de register_globals On ou Off, voyez la FAQ.
Note: Superglobales : disponibilité
Depuis PHP 4.1.0, les tableaux superglobaux tels que $_GET, $_POST et $_SERVER, etc. sont disponibles. Pour plus d'informations, lisez la section superglobals
Les plus grandes faiblesses de nombreux programmes PHP ne viennent pas du langage lui-même, mais de son utilisation en omettant les caractéristiques de sécurité. Pour cette raison, vous devez toujours prendre le temps de prendre en compte les implications d'une fonction, et de cerner toutes les applications d'une utilisation exotiques des paramètres.
Exemple #1 Utilisation dangereuse de variables
<?php
// efface un fichier à la racine d'un utilisateur... ou peut être
// de quelqu'un d'autre?
unlink($evil_var);
// Note l'accès de ce fichier ... ou pas?
fputs($fp, $evil_var);
// Exécute une commande triviale... ou ajoute une entrée dans /etc/password ?
system($evil_var);
exec($evil_var);
?>
Il est vivement recommandé d'examiner minutieusement votre code pour vous assurer qu'il n'y a pas de variables envoyées par le client web, et qui ne sont pas suffisamment vérifiées avant utilisation.
En répondant de manière adéquate à ces questions lors de l'écriture de vos scripts (plutôt qu'après), vous éviterez une réécriture inopportune pour raison de sécurité. En commençant vos projets avec ces recommandations en tête, vous ne garantirez pas la sécurité de votre système, mais vous contribuerez à l'améliorer.
Vous pouvez aussi envisager de supprimer l'acquisition automatique des variables d'environnement, les guillemets magiques (magic_quotes), ou encore toute option qui pourrait vous conduire à vous tromper sur la validité, la source ou la valeur d'une variable. En travaillant avec error_reporting(E_ALL), vous pouvez être averti que certaines variables sont utilisées avant d'être exploitées, ou vérifiées (et donc, vous pourrez traiter des valeurs exotiques à la source).
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
Les guillemets magiques (littéralement, les Magic Quotes) est un processus qui protège automagiquement les données introduites dans un script PHP. Il est recommandé de développer les applications sans l'aide des guillemets magiques, et de protéger manuellement les données.
Lorsque cette directive est active, les guillemets simples ', les guillemets doubles ", les antislashs \ et les caractères nul NULL sont protégés automatiquement avec un antislash. C'est le même résultat que celui de la fonction addslashes().
Il y a trois directives de guillemets magiques différentes :
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
La directive magic_quotes_gpc ne peut être désactivée qu'au niveau du système, et non pas à l'exécution. En d'autres termes, utiliser ini_set() n'est pas possible.
Exemple #1 Désactiver les guillemets magiques du coté du serveur
Voici un exemple qui donne la valeur de Off à ces directives dans le fichier php.ini. Pour plus de détails, voyez la section Comment changer la configuration.
; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off
Si vous n'avez pas accès au serveur, utilisez le fichier .htaccess. Par exemple :
php_flag magic_quotes_gpc Off
Afin d'écrire du code portable sur tous les environnement, et où vous ne pourrez pas forcément modifier la configuration du serveur, voici un exemple de désactivation de magic_quotes_gpc à l'exécution. Cette méthode est inefficace, et il est recommandé d'utiliser les autres solutions si possible.
Exemple #2 Désactivation des guillemets magiques à l'exécution
<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>
En général, la sécurité par l'obscurité est une des formes de sécurité les plus faibles. Mais dans certains cas, chaque action, aussi faible soit elle, concernant la sécurité, est souhaitable.
Quelques astuces permettent de masquer PHP, et cela entrave les pirates qui recherchent des faiblesses dans votre système. En l'option expose_php à off dans votre fichier php.ini, vous pouvez réduire la quantité d'informations disponible.
Une autre astuce est de configurer le serveur web, comme Apache, pour qu'il utilise plusieurs types de fichiers différents avec PHP, soit localement avec le fichier .htaccess, soit dans le fichier de configuration lui-même. Vous pouvez utiliser des informations déroutantes comme ceci :
Exemple #1 Masquer PHP avec un autre langage
# Faire que le code PHP ressemble à un autre langage AddType application/x-httpd-php .asp .py .pl
Ou masquez le complètement :
Exemple #2 Masquer PHP avec des types inconnus
# Faire que le code PHP ressemble à un autre langage qui n'existe pas AddType application/x-httpd-php .bop .foo .133t
Ou encore, cachez-le sous forme de html. Cela a un léger impact négatif sur les performances générales, car tous les fichiers HTML seront aussi analysés et traités par le moteur PHP :
Exemple #3 Utiliser le type html pour les extensions PHP
# Faire que le code PHP ressemble à du html AddType application/x-httpd-php .htm .html
Pour que cela fonctionne efficacement, pensez à renommer tous vos fichiers avec les extensions ci-dessus. Même si c'est une forme de sécurité du non-dit, c'est une mesure de prévention mineure, avec peu d'inconvénients.
PHP, comme de nombreux systèmes de grande taille, est constamment testé et amélioré. Chaque nouvelle version rassemble des modifications majeures et mineures, aussi bien pour renforcer la sécurité, que pour réparer les problèmes de conceptions de configuration, et d'autres points qui peuvent affecter la sécurité globale et la stabilité de votre système.
Comme les autres langages de scripts systèmes, la meilleure approche est de mettre à jour souvent PHP, et de rester à l'écoute des dernières versions et des modifications qu'elles apportent.
Les fonctions d'identification HTTP de PHP ne sont disponibles que si PHP est exécuté comme module Apache, et non pas sous la forme d'un CGI. Sous cette forme, il est possible d'utiliser la fonction header() pour demander une identification ("Authentication Required") au client, générant ainsi l'apparition d'une fenêtre de demande d'utilisateur et de mot de passe. Une fois que les champs ont été remplis, l'URL sera de nouveau appelée, avec les variables prédéfinies PHP_AUTH_USER, PHP_AUTH_PW et AUTH_TYPE contenant respectivement le nom d'utilisateur, le mot de passe et le type d'identification. Ces variables prédéfinies sont trouvées dans les tableaux $_SERVER et $HTTP_SERVER_VARS. Les méthodes d'identification simple ("Basic") et de type "Digest" (depuis PHP 5.1.0) sont supportées. Reportez-vous à la fonction header() pour plus d'informations.
Note: Note sur les versions de PHP
Les superglobales, telles que $_SERVER, ont été ajoutées en PHP à partir de la version » 4.1.0.
Voici un exemple de script qui force l'identification du client pour accéder à une page :
Exemple #1 Exemple d'identification HTTP simple
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation';
exit;
} else {
echo "<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>";
}
?>
Exemple #2 Exemple d'identification HTTP Digest
Cet exemple montre comment appliquer l'utilisation d'un script d'identification HTTP de type "Digest". Pour plus d'informations, lisez la documentation » RFC 2617.
<?php
$realm = 'Restricted area';
//utilisateur => mot de passe
$users = array('admin' => 'mypass', 'guest' => 'guest');
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
die('Texte utilisé si le visiteur utilise le bouton d\'annulation');
}
// analyse la variable PHP_AUTH_DIGEST
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($users[$data['username']]))
die('Mauvaise Pièce d\'identité!');
// Génération de réponse valide
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response)
die('Mauvaise Pièce d\'identitée!');
// ok, utilisateur & mot de passe valide
echo 'Vous êtes identifié en tant que : ' . $data['username'];
// fonction pour analyser l'en-tête http auth
function http_digest_parse($txt)
{
// protection contre les données manquantes
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));
preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}
return $needed_parts ? false : $data;
}
?>
Note: Note de compatibilité
Soyez bien prudent lorsque vous utilisez des en-têtes HTTP avec PHP. Afin de garantir un maximum de compatibilité entre les navigateurs, le mot clé "Basic" doit être écrit avec un B majuscule, et le texte de présentation doit être placé entre guillemets simples, et exactement un espace doit précéder le code 401 dans l'en-tête HTTP/1.0 401. Les paramètres d'authentification doivent être séparés par des virgules comme montré dans l'exemple ci-haut.
Au lieu d'afficher simplement les variables globales PHP_AUTH_USER et PHP_AUTH_PW, vous préférerez sûrement vérifier la validité du nom d'utilisateur et du mot de passe. Par exemple, en envoyant ces informations à une base de données, ou en recherchant dans un fichier dbm.
Méfiez-vous des navigateurs bogués, tels qu'Internet Explorer. Ils semblent très susceptibles en ce qui concerne l'ordre des en-têtes. Envoyer l'en-tête d'identification (WWW-Authenticate) avant le code de HTTP/1.0 401 semble lui convenir jusqu'à présent.
Pour éviter que quelqu'un écrive un script qui révèle les mots de passe d'une page, à laquelle on a accédé par une identification traditionnelle, les variables globales PHP_AUTH ne seront pas assignées si l'identification externe a été activée pour cette page et que le safe mode est activé. Dans ce cas, la variable REMOTE_USER peut être utilisée pour identifier l'utilisateur à l'extérieur. De même que $_SERVER['REMOTE_USER'].
Note: Note de configuration
PHP utilise la présence de la directive AuthType pour déterminer si une identification externe est activée. Évitez donc cette directive de contexte si vous voulez utiliser l'identification de PHP (sinon, les deux identifications se contrediront, et échoueront).
Notez cependant que les manipulations ci-dessus n'empêchent pas quiconque possède une page non identifiée de voler les mots de passe des pages protégées, sur le même serveur.
Netscape et Internet Explorer effaceront le cache d'identification client s'ils reçoivent une réponse 401. Cela permet de déconnecter un utilisateur, pour le forcer à saisir à nouveau son nom de compte et son mot de passe. Certains programmeurs l'utilisent pour donner un délai d'expiration ou, alors, fournissent un bouton de déconnexion.
Exemple #3 Identification HTTP avec nom d'utilisateur/mot de passe forcé
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Vous devez entrer un identifiant et un mot de passe valides pour accéder
à cette ressource.\n";
exit;
}
if ( !isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Bienvenue : {$_SERVER['PHP_AUTH_USER']}<br />";
echo "Ancien : {$_REQUEST['OldAuth']}";
echo "<form action='{$_SERVER['PHP_SELF']}' METHOD='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}' />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
Ce comportement n'est pas nécessaire par le standard d'identification HTTP Basic. Les tests avec Lynx ont montré qu'il n'affectait pas les informations de session lors de la réception d'un message de type 401. Ce qui fait que presser la touche "retour" à un client Lynx précédemment identifié donnera l'accès direct à la ressource. Cependant, l'utilisateur peut utiliser la touche '_' pour détruire les anciennes identifications.
Notez également qu'avant PHP 4.3.3, l'identification HTTP ne fonctionne pas sous le serveur Microsoft IIS avec la version CGI de PHP à cause d'une limitation de IIS. Pour que cela fonctionne en PHP 4.3.3+, vous devez éditer votre configuration de IIS "Directory Security". Cliquez sur "Edit" et activez uniquement "Anonymous Access", tous les autres champs doivent être laissés non actifs.
Une autre limitation si vous utilisez le module IIS (ISAPI) et PHP 4, vous ne devez pas utiliser les variables PHP_AUTH_* mais à la place, la variable HTTP_AUTHORIZATION est disponible. Par exemple, utilisez le code suivant : list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Note: Note pour les utilisateurs de IIS :
Pour que l'identification HTTP fonctionne avec IIS, la directive PHP cgi.rfc2616_headers doit être définie à 0 (la valeur par défaut).
Note: Si le safe mode est activé, le uid de ce script est ajouté à la partie realm des en-têtes WWW-Authenticate.
PHP supporte les cookies HTTP de manière transparente. Les cookies sont un mécanisme d'enregistrement d'informations sur le client, et de lecture de ces informations. Ce système permet d'identifier et de suivre les visiteurs. Vous pouvez envoyer un cookie avec la fonction setcookie() ou setrawcookie(). Les cookies font partie des en-têtes HTTP, ce qui impose que setcookie() soit appelée avant tout affichage de texte. Ce sont les mêmes limitations que pour header(). Vous pouvez utiliser les fonctions de bufferisation de sortie pour retarder l'affichage de votre script tant que vous n'avez pas décidé d'envoyer un cookie ou des en-têtes.
Tous les cookies qui sont envoyés au client seront automatiquement inclus dans un tableau auto-global $_COOKIE si variables_order contient "C". Si vous souhaitez affecter plusieurs valeurs à un seul cookie, ajoutez [] au nom du cookie.
Selon la configuration de register_globals, des variables PHP peuvent être créées à partir des cookies. Cependant, il n'est pas recommandé de se fier à elles, puisque cette fonctionnalité est souvent désactivée pour des raisons de sécurité. $HTTP_COOKIE_VARS est aussi prédéfinie dans les versions de PHP plus anciennes, lorsque la directive track_vars est activée. (Cette option est activée par défaut depuis PHP 4.0.3.)
Pour plus de détails, y compris des notes sur les bogues des navigateurs, voir les fonctions setcookie() et setrawcookie().
Le support des sessions de PHP est un mécanisme pour conserver des données entre différents accès. Cela vous permet de personnaliser les applications, et d'augmenter l'attrait de votre site. Toutes les informations sur les sessions sont disponibles dans la section sessions.
» XForms est une variation des formulaires web traditionnels, qui permet leur utilisation sur diverses plates-formes et navigateurs, et même sur des médias moins traditionnels comme les documents PDF.
La première différence des XForms est leur présentation au client. » XForms for HTML Authors contient une description détaillée de la création des XForms, complémentaire de notre tutoriel : nous allons nous consacrer à un exemple simple.
Exemple #1 Un simple formulaire XForms de recherche
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Search</h:title>
<model>
<submission action="http://example.com/search"
method="post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Find</label></input>
<submit submission="s"><label>Go</label></submit>
</h:p>
</h:body>
</h:html>
Le formulaire ci-dessus affiche une boîte de texte (appelée q ), et un bouton de soumission. Lorsque ce bouton est utilisé, le formulaire est envoyé à la page d'action.
C'est là que la différence se fait sentir, du point de vue de l'application web. Dans un formulaire HTML, les données sont envoyées au format application/x-www-form-urlencoded. Pour un XForm, c'est en fait un format XML qui est utilisé.
Si vous avez décidé d'utiliser des XForms, vous attendez peut être des données au format XML, et dans ce cas, regardez dans la variable $HTTP_RAW_POST_DATA, où vous trouverez le document XML généré par le navigateur, que vous pourrez passer à votre moteur XSLT favori.
Si vous n'êtes pas intéressé par ce format, et que vous voulez simplement exploiter vos données avec la variable $_POST, vous pouvez demander au navigateur de les envoyer au format application/x-www-form-urlencoded, en modifiant l'attribut de méthode method et en lui donnant la valeur de urlencoded-post.
Exemple #2 Utiliser des XForms pour remplir $_POST
<h:html xmlns:h="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2002/xforms">
<h:head>
<h:title>Search</h:title>
<model>
<submission action="http://example.com/search"
method="urlencoded-post" id="s"/>
</model>
</h:head>
<h:body>
<h:p>
<input ref="q"><label>Find</label></input>
<submit submission="s"><label>Go</label></submit>
</h:p>
</h:body>
</h:html>
Note: Au moment de la rédaction de cet article, de nombreux navigateurs ne supportent pas les XForms. Vérifiez la version de votre navigateur si les exemples de ce tutoriel ne fonctionnent pas.
Cette fonctionnalité permet aux personnes de télécharger à la fois du texte et des fichiers binaires. Avec les fonctions d'identification et de manipulation de fichiers de PHP, vous avez le contrôle total pour définir qui a le droit de télécharger mais aussi ce qui sera fait du fichier une fois qu'il sera téléchargé.
PHP est capable de recevoir des fichiers émis par un navigateur conforme à la norme RFC-1867 (c'est-à-dire Netscape Navigator 3 ou supérieur, Microsoft Internet Explorer 3 avec un patch de Microsoft, ou supérieur sans le patch).
Note: Notes de configuration
Voir aussi les directives file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size et max_input_time dans php.ini
PHP supporte aussi le chargement par la méthode PUT comme dans le navigateur Netscape Composer et Amaya du W3C. Reportez-vous au chapitre sur le support de la méthode PUT.
Exemple #1 Formulaire de chargement de fichier
Un formulaire de téléchargement de fichiers peut être construit en créant un formulaire spécifique comme ceci :
<!-- Le type d'encodage des données, enctype, DOIT être spécifié comme ce qui suit --> <form enctype="multipart/form-data" action="_URL_" method="post"> <!-- MAX_FILE_SIZE doit précéder le champs input de type file --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES --> Envoyez ce fichier : <input name="userfile" type="file" /> <input type="submit" value="Envoyer le fichier" /> </form>
_URL_ dans l'exemple précédent doit être remplacé et pointé vers un fichier PHP.
Le champ caché MAX_FILE_SIZE (mesuré en octets) doit précéder le champ input de type file et sa valeur représente la taille maximale acceptée du fichier par PHP. Il est très facile de contourner cette restriction. Ne comptez pas sur le respect de cette configuration par le navigateur ! La configuration de PHP sur la taille maximale à respecter ne peut être contournée, elle. Vous devez toujours ajouter cet élément de formulaire, car il prévient le chargement de gros fichiers qui demanderait un long délai d'attente au client et ainsi ferait échouer le script.
Note: Assurez-vous que votre formulaire de téléchargement de fichier contienne enctype="multipart/form-data", sinon, le fichier se sera pas téléchargé.
La variable globale $_FILES existe depuis PHP 4.1.0 (Utilisez $HTTP_POST_FILES si vous utilisez une version plus ancienne). Ce tableau devrait contenir toutes les informations du fichier téléchargé.
Le contenu du tableau $_FILES est détaillé dans notre exemple ci-dessous. Notez que l'on suppose que le nom de la variable du fichier téléchargé est userfile, tel que défini dans le formulaire ci-dessus, mais peut être n'importe quel nom.
Le nom original du fichier, tel que sur la machine du client web.
Le type MIME du fichier, si le navigateur a fourni cette information. Par exemple, cela pourra être "image/gif". Ce type mime n'est cependant pas vérifié du côté de PHP et, donc, ne prend pas sa valeur pour se synchroniser.
La taille, en octets, du fichier téléchargé.
Le nom temporaire du fichier qui sera chargé sur la machine serveur.
Le code d'erreur associé au téléchargement de fichier. Cet élément a été introduit en PHP 4.2.0.
Le fichier téléchargé sera stocké temporairement dans le dossier temporaire du système, à moins qu'un autre dossier soit fourni avec la directive upload_tmp_dir du php.ini. Le dossier par défaut du serveur peut être changé dans l'environnement via la variable TMPDIR. Modifier la valeur de cette variable avec la fonction putenv() dans un script PHP sera sans effet. Cette variable d'environnement peut aussi être utilisée pour s'assurer que d'autres opérations fonctionnent aussi sur les fichiers téléchargés.
Exemple #2 Validation de téléchargement de fichiers
Voyez aussi les fonctions is_uploaded_file() et move_uploaded_file() pour plus d'informations. L'exemple suivant va télécharger un fichier venant d'un formulaire.
<?php
// En PHP < 4.1.0, $HTTP_POST_FILES doit être utilisé
// à la place de $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Le fichier est valide, et a été téléchargé
avec succès. Voici plus d'informations :\n";
} else {
echo "Attaque potentielle par téléchargement de fichiers.
Voici plus d'informations :\n";
}
echo 'Voici quelques informations de débogage :';
print_r($_FILES);
echo '</pre>';
?>
Le script PHP qui reçoit le fichier chargé doit pouvoir gérer le fichier de manière appropriée. Vous pouvez utiliser la variable $_FILES['userfile']['size'] pour recaler tous les fichiers qui sont trop gros ou trop petits. Vous pouvez utiliser la variable $_FILES['userfile']['type'] pour écarter les fichiers qui n'ont pas le bon type, mais l'utiliser uniquement pour une série de vérifications, car cette valeur est complètement sous le contrôle du client et n'est pas vérifiée du côté de PHP. Depuis PHP 4.2.0, vous pouvez utiliser l'information dans $_FILES['userfile']['error'] et adapter votre politique en fonction des codes d'erreur. Quelque soit votre politique, vous devriez soit effacer le fichier du dossier temporaire, soit le déplacer.
Si aucun fichier n'est sélectionné dans le formulaire, PHP retournera 0 dans $_FILES['userfile']['size'] et rien du tout dans $_FILES['userfile']['tmp_name'].
Le fichier sera automatiquement effacé du fichier temporaire à la fin du script, s'il n'a pas été déplacé ou renommé.
Exemple #3 Envoi d'un tableau de fichiers
PHP supporte les tableaux en HTML ainsi qu'avec les fichiers.
<form action="" method="post" enctype="multipart/form-data"> <p>Images: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
$name = $_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
La barre de progression de téléchargement peut être implémentée par apc.rfc1867.
Depuis PHP 4.2.0, PHP retourne un code d'erreur approprié dans le tableau de fichiers. Ce code d'erreur est accessible à l'index ['error'] du tableau, qui est créé durant le téléchargement, par PHP. En d'autres termes, le message d'erreur est accessible dans la variable $_FILES['userfile']['error'].
Valeur : 0. Aucune erreur, le téléchargement est correct.
Valeur : 1. Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.
Valeur : 2. Le fichier téléchargé excède la taille de MAX_FILE_SIZE, qui a été spécifiée dans le formulaire HTML.
Valeur : 3. Le fichier n'a été que partiellement téléchargé.
Valeur : 4. Aucun fichier n'a été téléchargé.
Valeur : 6. Un dossier temporaire est manquant. Introduit en PHP 4.3.10 et PHP 5.0.3.
Valeur : 7. Échec de l'écriture du fichier sur le disque. Introduit en PHP 5.1.0.
Valeur : 8. L'envoi de fichier est arrêté par l'extension. Introduit en PHP 5.2.0.
Note: Ces constantes sont apparues en PHP 4.3.0.
La variable MAX_FILE_SIZE ne peut pas spécifier une taille de fichier plus grande que la taille qui a été fixée par upload_max_filesize, dans le php.ini. La valeur par défaut est 2 megaoctets.
Si une limite de mémoire est activée, une plus grande valeur de memory_limit peut être nécessaire. Assurez-vous d'avoir défini une valeur pour memory_limit assez grande.
Si la valeur de max_execution_time est trop petite, le temps d'exécution du script peut excéder cette valeur. Assurez-vous d'avoir défini une valeur pour max_execution_time assez grande.
Note: max_execution_time affecte uniquement le temps d'exécution du script. Le temps passé sur l'activité qui apparaît en dehors de l'exécution du script comme les appels systèmes avec la fonction system(), la fonction sleep(), les requêtes sur les bases de données, le temps mis pour effectuer le téléchargement du fichier, etc. n'est pas inclus lors du calcul du temps maximal de l'exécution du script.
max_input_time définit le temps maximal, en secondes, au script pour recevoir les données ; cela inclut le téléchargement du fichier. Pour les fichiers multiples, ou les gros fichiers, ou encore pour les utilisateurs sur des connexions lentes, la valeur par défaut de 60 secondes peut être dépassée.
Si post_max_size est définit de façon trop faible, les gros fichiers ne pourront pas être téléchargés. Assurez-vous de définir post_max_size avec une taille suffisante.
Ne pas valider les fichiers que vous manipulez peut donner l'accès aux utilisateurs à des fichiers sensibles dans d'autres dossiers !
Attention : il semble que CERN httpd supprime tout ce qui est après le premier caractère dans l'entête MIME. Tant que c'est le cas, CERN httpd ne pourra pas effectuer de chargements de fichiers.
Du fait de la grande diversité des systèmes, nous ne pouvons garantir que les fichiers avec des noms exotiques (par exemple, ceux contenant des espaces) seront traités correctement.
Le développeur ne doit pas mixer les champs input normaux et les champs de téléchargement dans une même variable (en utilisant un nom d'input comme foo[]).
Le téléchargement de plusieurs fichiers est possible en utilisant des noms différents dans l'attribut name de la balise input.
Il est aussi possible de télécharger plusieurs fichiers simultanément et d'obtenir les informations sous forme de tableau. Pour cela, vous devez utiliser la syntaxe de tableau dans les noms de balises HTML, comme vous l'avez fait avec les sélections multiples et les boîtes à cocher.
Exemple #1 Télécharger plusieurs fichiers simultanément
<form action="file-upload.php" method="post" enctype="multipart/form-data"> Envoyez plusieurs fichiers : <br /> <input name="userfile[]" type="file" /><br /> <input name="userfile[]" type="file" /><br /> <input type="submit" value="Envoyer les fichiers" /> </form>
Lorsque le formulaire ci-dessus a été envoyé, les tableaux $_FILES['userfile'], $_FILES['userfile']['name'], et $_FILES['userfile']['size'] seront initialisés (tout comme $HTTP_POST_FILES pour les versions de PHP antérieures à la 4.1.0). Lorsque register_globals est activé, les variables globales concernant les fichiers téléchargés sont aussi initialisées. Chacune d'entre elles contiendra un tableau numériquement indexé, avec les valeurs décrivant les fichiers téléchargés.
Par exemple, supposons que les fichiers /home/test/review.html et /home/test/xwp.out ont été téléchargés. Dans ce cas, $_FILES['userfile']['name'][0] contient review.html et $_FILES['userfile']['name'][1] contient xwp.out. Similairement, $_FILES['userfile']['size'][0] va contenir la taille du fichier review.html, etc.
$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] et $_FILES['userfile']['type'][0] sont aussi créées.
PHP supporte la méthode HTTP PUT utilisée par les navigateurs pour y stocker des fichiers sur un serveur. Les requêtes de type PUT sont beaucoup plus simples que les chargements de fichiers en utilisant le type POST, et elles ressemblent à :
Exemple #1 Méthode PUT pour les chargements de fichiers
PUT /path/filename.html HTTP/1.1
Normalement, cela signifie que le client distant va sauver les données qui suivent dans le fichier : /path/filename.html de votre disque. Ce n'est évidemment pas très sécurisé de laisser Apache ou PHP écraser n'importe quel fichier de l'arborescence. Pour éviter ceci, il faut d'abord dire au serveur que vous voulez qu'un script PHP donné gère la requête. Avec Apache, il y a une directive pour cela : Script. Elle peut être placée n'importe où dans le fichier de configuration d'Apache. En général, les webmestres la placent dans le bloc <Directory>, ou peut-être dans le bloc <VirtualHost>. La ligne suivante fera très bien l'affaire :
Exemple #2 Directive Apache pour le chargement par méthode PUT
Script PUT /put.php
Elle indique à Apache qu'il doit envoyer les requêtes de chargement par méthode PUT au script put.php. Bien entendu, cela présuppose que vous avez activé PHP pour qu'il prenne en charge les fichiers de type .php, et que PHP est actif. La ressource de destination pour toutes les requêtes PUT de ce script doit être le script lui-même, et non le nom du fichier que le fichier téléchargé doit avoir.
Avec PHP, vous voudriez faire quelque chose comme ce qui suit dans votre put.php. Ceci va copier le contenu du fichier téléchargé dans le fichier myputfile.ext sur le serveur. Vous devez probablement vouloir effectuer quelques vérifications et/ou identifier l'utilisateur avant d'effectuer cette copie de fichier.
Exemple #3 Sauvegarde de fichiers HTTP PUT
<?php
/* Les données PUT arrivent du flux */
$putdata = fopen("php://input", "r");
/* Ouvre un fichier pour écriture */
$fp = fopen("myputfile.ext", "w");
/* Lecture des données, 1 Ko à la fois
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Fermeture du flux */
fclose($fp);
fclose($putdata);
?>
Aussi longtemps que le support des gestionnaires d'URL ("URL fopen wrapper") est activé dans le php.ini, avec l'option allow_url_fopen, vous pouvez utiliser des URL (HTTP et FTP) avec la majorité des fonctions qui utilisent un nom de fichier comme paramètre. Cela inclut notamment include(), include_once(), require() et require_once() (depuis PHP 5.2.0,allow_url_include doit être actif pour les utiliser). Reportez-vous à Liste des protocoles supportés pour plus d'informations sur les protocoles supportés par PHP.
Note: En PHP 4.0.3 et plus récent, pour pouvoir utiliser les gestionnaires d'URL, vous devez configurer PHP avec l'option --enable-url-fopen-wrapper.
Note: Les versions de PHP pour Windows plus anciennes que 4.3 de supportaient pas les gestionnaires d'URL avec les fonctions suivantes : include(), include_once(), require(), require_once(), et les fonctions de création d'images de l'extension Fonctions GD et images.
Par exemple, vous pouvez suivre l'exemple suivant pour ouvrir un fichier sur un serveur web distant, analyser les résultats pour extraire les informations dont vous avez besoin, et ensuite l'utiliser dans une requête de base de données, ou simplement éditer les informations dans le style de votre site.
Exemple #1 Connaître le titre d'une page distante
<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
echo "<p>Impossible de lire la page.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
/* Cela ne fonctionne que si les balises Title sont correctement utilisées */
if (preg_match ("@\<title\>(.*)\</title\>@i", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
Vous pouvez aussi écrire des fichiers sur un serveur FTP aussi longtemps que vous êtes connecté avec un utilisateur ayant les bons droits d'accès, alors que le fichier n'existait pas encore.
Pour vous connecter avec un utilisateur autre qu'anonyme, vous devez spécifier un nom d'utilisateur (et certainement le mot de passe) dans l'URL, comme ftp://user:password@ftp.example.com/path/to/file. (Vous pouvez utiliser le même type de syntaxe pour accéder aux fichiers via HTTP lorsqu'ils nécessitent une identification simple).
Exemple #2 Stocker des données sur un serveur distant
<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
echo "<p>Impossible d'ouvrir le fichier distant pour écriture.\n";
exit;
}
/* Ecriture des données. */
fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");
fclose ($file);
?>
Note: Remarque : vous pouvez avoir l'idée, à partir de l'exemple ci-dessus, d'utiliser la même technique pour écrire sur un log distant, mais comme mentionné ci-dessus vous ne pouvez qu'écrire sur un nouveau fichier en utilisant les fonctions fopen() avec une URL. Pour faire des log distribués, nous vous conseillons de regarder la partie syslog().
Le statut des connexions est conservé en interne par PHP. Il y a trois états possibles :
Lorsqu'un script PHP est en cours d'exécution, son état est NORMAL. Si le client distant se déconnecte, le statut devient ABORTED. En général, une telle déconnexion provient d'un arrêt temporaire. Si la durée maximale d'exécution de PHP est dépassée, (voir set_time_limit()), le script prend le statut TIMEOUT.
Vous pouvez en outre décider si vous voulez que la déconnexion d'un client provoque l'arrêt de votre script. Il est parfois pratique que vos scripts continuent à s'exécuter jusqu'à la fin, même si le client n'est plus là pour recevoir les informations. Cependant, par défaut, le script s'arrêtera dès que le client se déconnecte. Ce comportement peut être modifié avec la directive ignore_user_abort dans le fichier php.ini ou bien avec la directive Apache php_value ignore_user_abort du fichier Apache httpd.conf ou avec la fonction ignore_user_abort(). Si vous ne demandez pas à PHP d'ignorer la déconnexion, et que l'utilisateur se déconnecte, le script sera terminé. La seule exception est si vous avez enregistré une fonction de fermeture, avec register_shutdown_function(). Avec une telle fonction, lorsque l'utilisateur interrompt sa requête, à la prochaine exécution du script, PHP va s'apercevoir que le dernier script n'a pas été terminé, et il va déclencher la fonction de fermeture. Cette fonction sera aussi appelée à la fin du script, si celui-ci se termine normalement. Pour pouvoir avoir un comportement différent suivant l'état du script lors de sa finalisation, vous pouvez exécutez des commandes spécifiques à la déconnexion grâce à la commande connection_aborted(). Cette fonction retournera TRUE si la connexion a été annulée.
Votre script peut aussi être automatiquement interrompu après une certaine durée. Par défaut, le délai est de 30 secondes. Cette valeur peut être changée en utilisant la directive PHP max_execution_time dans le fichier php.ini ou avec la directive php_value max_execution_time, dans le fichier Apache httpd.conf ou encore avec la fonction set_time_limit(). Lorsque le délai expire, le script est terminé, et comme pour la déconnexion du client, une fonction de terminaison sera appelée. Dans cette fonction, vous pouvez savoir si c'est le délai d'expiration qui a causé la fin du script, en appelant la fonction connection_status(). Cette fonction retournera 2 si le délai d'expiration a été dépassé.
Une chose à noter est que les deux cas ABORTED et TIMEOUT peuvent être appelés en même temps. Ceci est possible si vous demandez à PHP d'ignorer les déconnexions des utilisateurs. PHP va quand même noter le fait que l'utilisateur s'est déconnecté, mais le script va continuer. Puis, lorsqu'il atteint la limite de temps, le script va expirer. À ce moment-là, la fonction connection_status() retournera 3.
Les connexions persistantes aux bases de données SQL sont des connexions qui ne se referment pas à la fin du script. Lorsqu'une connexion persistante est demandée, PHP s'assure qu'il n'y a pas une autre connexion identique (qui serait ouverte précédemment, avec le même nom d'hôte, d'utilisateur et le même mot de passe), et si une telle connexion existe, elle est utilisée ; sinon, elle est créée. Une connexion identique est une connexion qui a ouvert le même hôte, avec le même nom et le même mot de passe (s'ils sont nécessaires).
Ceux qui ne sont pas rompus aux techniques des serveurs web et leur distribution de la charge de travail se font parfois une fausse idée de ces connexions persistantes. En particulier, les connexions persistantes ne permettent pas l'ouverture de plusieurs sessions avec le même lien ; elles ne permettent pas la réalisation de transactions efficaces et ne font pas le café. En fait, pour être extrêmement clair sur le sujet, les connexions persistantes ne vous donnent aucune fonctionnalité de plus que les connexions non persistantes.
Alors pourquoi les connexions persistantes ?
Cela s'explique par la manière avec laquelle les serveurs web fonctionnent. Il y a trois manières d'utiliser PHP pour générer des pages.
La première est d'utiliser PHP comme un CGI (Common Interface Gateway). Lorsque PHP fonctionne de cette manière, une instance de l'interpréteur PHP est créée puis détruite pour chaque page demandée. Étant donné que cet interpréteur est détruit après chaque requête, toutes les ressources acquises (comme une connexion à une base SQL), sont purement et simplement détruites.
La deuxième méthode, de loin la plus prisée, est d'exécuter PHP sous la forme d'un module sur un serveur multi-processus, ce qui revient à dire : Apache. Un tel serveur a typiquement un processus parent qui coordonne un ensemble de processus fils, qui servent les fichiers. Lorsque les requêtes parviennent depuis un client, elles sont transmises à un fils disponible. Cela signifie que si un client fait une deuxième requête, il peut être servi par un processus client différent du premier. Les connexions persistantes vous permettent alors de ne vous connecter à une base SQL que la première fois. Lors des connexions ultérieures, les processus fils pourront réutiliser la connexion ouverte précédemment.
La dernière méthode est d'utiliser PHP sous la forme d'un module de serveur multithread. Actuellement, PHP 4 supporte ISAPI, WSAPI, et NSAPI (sous Windows), qui permettent tous d'utiliser PHP comme un module sur un serveur multithread tel que Netscape FastTrack (iPlanet), Microsoft Internet Information Server (IIS), et O'Reilly's WebSite Pro. Le comportement est essentiellement le même que pour les serveurs multi-processus décrits précédemment.
Si les connexions persistantes n'ont aucune fonctionnalité de plus, à quoi servent-elles ?
La réponse est extrêmement simple : efficacité. Les connexions persistantes sont un bon moyen d'accélérer les accès à une base SQL si le traitement de connexion à la base est long. Ce temps dépend de nombreux facteurs : le type de base de données, cette base est-elle sur le même serveur ou pas, quelle est la charge du serveur de base de données, etc. Si le temps de connexion est long, les connexions persistantes seront bien utiles, car une fois ouverte par un processus fils, la connexion est réutilisable sans avoir à se reconnecter. Si vous avez 20 processus fils, il suffit d'avoir 20 connexions persistantes ouvertes, une par fils.
Notez que les connexions persistantes ont quelques inconvénients si vous hébergez une base de données dont le nombre maximal de connexion risque d'être atteint par les connexions persistantes. Si votre base de données accepte jusqu'à 16 connexions simultanées et que 17 processus essaient de se connecter, le dernier restera sur la touche. S'il y a des erreurs dans les scripts qui ne permettent pas de fermer la connexion (par exemple, une boucle infinie), votre serveur sera rapidement engorgé. Vérifiez la documentation de votre base de données pour savoir comment elle traite les connexions inactives ou abandonnées.
Il y a quelques autres limitations à bien garder en tête lorsque vous utilisez les connexions persistantes. L'une est que lorsque vous posez un verrou avec une connexion persistante, si le script ne peut libérer le verrou pour une raison quelconque, alors les autres scripts qui réutiliseront la connexion seront bloqués indéfiniment, et vous imposeront le redémarrage du serveur ou de la base de données. Une autre limitation est, lors de l'utilisation des transactions, un bloc de transaction non fermé sera prolongé au script suivant, s'il n'est pas fermé par le script initiateur. Dans les deux cas, vous pouvez utiliser la fonction register_shutdown_function() pour enregistrer une fonction simple de nettoyage, pour déverrouiller les tables, et annuler les transactions en cours. Mieux encore, évitez le problème entièrement en n'utilisant pas les connexions persistantes dans les scripts qui ont besoin de verrous ou de transactions. Vous pourrez toujours les utiliser ailleurs.
Résumons-nous : les connexions persistantes ont été définies pour avoir les mêmes fonctionnalités que les connexions non persistantes. Les deux types de connexions sont parfaitement interchangeables, et n'affecteront pas le comportement de votre script : uniquement son efficacité.
Voir aussi fbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), oci_pconnect(), pfsockopen(), pg_pconnect() et sybase_pconnect().
Le "Safe Mode" est le mode de sécurité de PHP : une solution au problème de partage de PHP sur un serveur. Ce système pêche au niveau de l'architecture car il n'est pas correct de tenter de résoudre ce problème au niveau de PHP, mais les solutions alternatives basées sur le serveur web et l'OS ne sont pas réalistes. De nombreux intervenants, notamment les fournisseurs d'hébergement, utilisent le "Safe Mode".
Le "Safe Mode" est supprimé dans PHP 6.0.0.
| Nom | Par défaut | Modifiable | Historique |
|---|---|---|---|
| safe_mode | "0" | PHP_INI_SYSTEM | Supprimé en PHP 6.0.0. |
| safe_mode_gid | "0" | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0. Supprimé en PHP 6.0.0. |
| safe_mode_include_dir | NULL | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0.Supprimé en PHP 6.0.0. |
| safe_mode_exec_dir | "" | PHP_INI_SYSTEM | Supprimé en PHP 6.0.0. |
| safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | Supprimé en PHP 6.0.0. |
| safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | Supprimé en PHP 6.0.0. |
| open_basedir | NULL | PHP_INI_ALL | PHP_INI_SYSTEM en PHP < 5.3.0. |
| disable_functions | "" | php.ini seulement | Disponible depuis PHP 4.0.1. |
| disable_classes | "" | php.ini seulement | Disponible depuis PHP 4.3.2. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Active ou non le mode de sécurité de PHP. Si PHP est compilé avec --enable-safe-mode, la valeur par défaut sera On, sinon Off.
Par défaut, le safe mode fait une comparaison des propriétaires, avant d'ouvrir un fichier. Si vous voulez alléger un peu ce niveau de sécurité, vous pouvez réaliser une comparaison de groupe, et activer cette directive. Si cette directive vaut FALSE (sa valeur par défaut), c'est une comparaison sur les UID, et, si elle vaut TRUE c'est une comparaison sur les GID.
Les vérifications basées sur le UID ou GID sont ignorées lorsque les fichiers inclus sont placés dans le dossier indiqué par cette directive, ainsi que ses sous-dossiers. Les dossiers peuvent être aussi dans l'include_path ou bien il faut inclure le chemin complet.
Depuis PHP 4.2.0, cette directive utilise le point virgule de la même façon que le fait include_path, pour permettre de configurer plusieurs dossiers. La restriction spécifiée est en fait un préfixe, plus qu'un nom de dossier. Cela signifie que "safe_mode_include_dir = /dir/incl" autorise aussi bien "/dir/include" que "/dir/incls", s'ils existent. Lorsque vous souhaitez restreindre l'accès à un dossier spécifique, il faut terminer cette directive avec un slash. Par exemple "safe_mode_include_dir = /dir/incl/". Si la valeur de cette directive est vide, aucun fichier avec le UID/GID différent ne peut être inclus dans PHP 4.2.3 et dans les versions PHP 4.3.3 et plus récentes. Dans les versions antérieures, tous les fichiers pouvaient être inclus.Si PHP est utilisé en safe mode, les fonctions comme system() et toutes celles qui permettent l'exécution en ligne de commande refuseront d'exécuter des programmes qui ne sont pas dans ce dossier. Vous devez utiliser / en tant que séparateur de dossier sous tous les environnements, y compris Windows.
Modifier certaines variables d'environnement est un trou de sécurité potentiel. Cette directive contient une liste de noms de variables d'environnement séparées par des virgules, ou de préfixes. En Safe mode, l'utilisateur ne pourra modifier que les variables d'environnement dont le nom commence par l'un des préfixes fourni ici. Par défaut, les utilisateurs ne peuvent modifier que les variables d'environnement qui commencent par PHP_ (e.g. PHP_FOO=BAR).
Note: Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement.
Cette directive contient une liste de variables d'environnement que le programmeur ne pourra pas modifier en utilisant la fonction putenv(). Ces variables seront protégées, même si la directive safe_mode_allowed_env_vars autorise leur modification.
Limite les fichiers accessibles par PHP dans l'arborescence. Cette directive n'est pas affectée par le safe mode.
Lorsqu'un script tente d'ouvrir un fichier, avec les fonctions fopen() ou gzopen(), la situation du fichier est vérifiée. Si le fichier se situe hors du dossier spécifié dans cette directive, PHP refusera de l'ouvrir. Les liens symboliques sont résolus, ce qui fait que cette restriction ne peut être contournée par un lien symbolique. Si le fichier n'existe pas, le lien symbolique ne pourra pas être résolu et le nom de fichier sera comparé à open_basedir.
La valeur spéciale .
indique que le dossier dans lequel le script est stocké servira de
dossier de base. Cela est cependant un peu dangereux car le dossier
courant du script peut facilement être modifié avec la fonction
chdir().
Dans httpd.conf, open_basedir peut être désactivée (i.e. pour certains hôtes virtuels) de la même manière que toute autre directive de configuration avec la syntaxe "php_admin_value open_basedir none".
Sous Windows, séparez les dossiers par des points virgules. Sur les autres systèmes, séparez les dossiers avec des deux-points. Lorsque PHP est utilisé comme module Apache, les chemins de la directive open_basedir des dossiers parents sont automatiques transmis.
La restriction spécifiée par open_basedir est en fait un préfixe et non un dossier. Cela signifie que "open_basedir = /dir/incl" donne accès au dossier "/dir/include" et aussi au dossier "/dir/incls" s'il existe. Lorsque vous souhaitez restreindre l'accès à un dossier spécifique, ajoutez un slash final. Par exemple : open_basedir = /dir/incl/.
La valeur par défaut permet l'ouverture de tous les fichiers.
Note: Depuis PHP 5.3.0, open_basedir peut être modifié au moment de l'exécution. Cela signifie que si open_basedir est défini à /www/ dans votre fichier php.ini, un script peut le modifier en /www/tmp/ au moment de l'exécution via la fonction ini_set().
Note: Disponibilité
Cette directive est disponible depuis PHP 4.3.2
Voir aussi register_globals, display_errors et log_errors.
Lorsque Safe Mode est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire des fichiers ou dossiers qui seront manipulés par ce script. Par exemple, dans la situation suivante :
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
exécuter le script script.php :
<?php
readfile('/etc/passwd');
?>
générera cette erreur, si le Safe Mode est activé :
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
Cependant, il arrive que la vérification faite avec le nom du propriétaire (UID) du fichier soit trop restrictive, et qu'une vérification sur le nom du groupe (GID) soit suffisante. C'est une autre fonctionnalité supportée par la directive safe_mode_gid. En lui donnant la valeur de On, les vérifications seront faites sur le GID, alors qu'en lui laissant sa valeur par défaut de Off, les vérifications seront faites sur le UID.
Si au lieu d'utiliser le Safe Mode, vous utilisez la directive open_basedir, alors les manipulations seront limitées aux fichiers situés dans les dossiers spécifiés. Par exemple (Apache httpd.conf) :
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Si vous exécutez le script script.php ci-dessus avec la configuration d'open_basedir, le résultat sera l'affichage suivant :
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
Vous pouvez également désactiver les fonctions particulières. Notez que la directive disable_functions ne peut être utilisée en dehors du fichier php.ini, ce qui signifie que vous ne pouvez pas désactiver des fonctions par virtualhost ou par dossiers, dans votre fichier httpd.conf. Si nous ajoutons ceci à notre fichier php.ini :
disable_functions = readfile,system
toute utilisation des fonctions readfile() et system() générera l'affichage suivant :
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
Ces restrictions de PHP sont bien sûr invalides en exécution binaire.
Voici une liste non-exhaustive des fonctions désactivées par le Safe Mode.
| Fonction | Limitations |
|---|---|
| dbmopen() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| dbase_open() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro_rowcount() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| filepro_retrieve() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| Fonctions ifx_* | restrictions sql_safe_mode, (!= Safe Mode) |
| Fonctions ingres_* | restrictions sql_safe_mode, (!= Safe Mode) |
| Fonctions mysql_* | restrictions sql_safe_mode, (!= Safe Mode) |
| pg_lo_import() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| posix_mkfifo() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| putenv() | Obéit aux directives safe_mode_protected_env_vars et safe_mode_allowed_env_vars. Voir aussi la documentation de putenv() |
| move_uploaded_file() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| dl() | Cette fonction est désactivée par le safe-mode |
| opérateur guillemets obliques | Cette fonction est désactivée par le safe-mode |
| shell_exec() (équivalent fonctionnel des guillemets obliques) | Cette fonction est désactivée par le safe-mode |
| exec() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| system() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| passthru() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| popen() | Vous ne pouvez exécuter que les programmes qui sont dans le dossier safe_mode_exec_dir. Pour des raisons pratiques, il n'est pas possible d'utiliser des jokers comme .. dans le chemin de ce dossier. escapeshellcmd() est exécuté sur les arguments de cette fonction. |
| fopen() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| mkdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| rmdir() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| rename() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| unlink() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| copy() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (sur source et target ) |
| chgrp() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chown() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| chmod() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. De plus, vous ne pouvez pas modifier les SUID, SGID et le bit sticky |
| touch() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. |
| symlink() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : seule l'hôte cible est vérifié) |
| link() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : seul le fichier de destination est vérifié.) |
| apache_request_headers() | En Safe Mode, les en-têtes commençant par authorization (sensible à la casse) ne seront pas retournés. |
| header() | Avec le safe mode, le uid du script est ajouté à la partie realm de l'en-tête WWW-Authenticate si vous utilisez cet en-tête pour l'identification. |
| variables PHP_AUTH | Avec le safe mode, les variables PHP_AUTH_USER, PHP_AUTH_PW et PHP_AUTH_TYPE ne sont pas disponibles dans la variable $_SERVER. Indépendamment, vous pouvez utiliser la variable REMOTE_USER pour connaître l'utilisateur. (note : affectée uniquement depuis PHP 4.3.0) |
| highlight_file(), show_source() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : affectée uniquement depuis PHP 4.2.1) |
| parse_ini_file() | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (note : affectée uniquement depuis PHP 4.2.1) |
| set_time_limit() | N'a aucun effet lorsque PHP fonctionne avec le safe mode. |
| max_execution_time | N'a aucun effet lorsque PHP fonctionne avec le safe mode. |
| mail() | Si le Safe Mode est actif, le 5ème paramètre est désactivé (note : uniquement affecté depuis PHP 4.2.3) |
| session_start() | Le propriétaire d'un script doit être le même que celui que celui du répertoire session.save_path si le répertoire par défaut session.save_handler est utilisé. |
| Toutes les fonctions sur les flux et sur le système de fichiers. | Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. Vérifie que le fichier/dossier que vous allez utiliser a le même UID que le script qui est actuellement exécuté. (Voir l'option safe_mode_include_dir du php.ini. |
Depuis la version 4.3.0, PHP supporte un nouveau type de SAPI (Server Application Programming Interface, c'est-à-dire Interface de Programmation d'Applications Serveur) appelé CLI, ce qui signifie Command Line Interface et se traduit par "Interface de Ligne de Commande". Comme son nom l'indique, ce type SAPI cible les applications Shell (ou desktop), écrites en PHP. Il y a un certain nombre de différences entre le type CLI SAPI et les autres SAPI expliqués dans ce chapitre. Il convient de préciser que CLI et CGI sont des SAPI différentes, bien qu'ils partagent des comportements similaires.
Le CLI SAPI a été publié pour la première fois avec la version PHP 4.2.0, mais il était expérimental, et devait être explicitement activé avec l'option --enable-cli lorsque vous exécutez le script ./configure. Depuis PHP 4.3.0, le CLI SAPI n'est plus expérimental, et l'option --enable-cli est activée par défaut. Vous pouvez utiliser l'option --disable-cli pour le désactiver.
Depuis PHP 4.3.0, le nom, l'emplacement et l'existence des binaires CLI/CGI vont dépendre de la façon dont PHP est installé sur votre système. Par défaut, en exécutant make, les deux binaires CGI et CLI sont compilés et nommés respectivement sapi/cgi/php et sapi/cli/php dans votre répertoire source PHP. Vous remarquerez que les deux se nomment php. Ce qui se passe ensuite pendant le make install dépend de votre ligne de configuration. Si un module SAPI, apxs par exemple, a été choisi pendant la configuration, ou que l'option --disable-cgi a été activée, le CLI est copié dans {PREFIX}/bin/php pendant le make install. Si, par exemple, --with--apxs figure dans votre ligne de configuration, le CLI est copié dans {PREFIX}/bin/php pendant le make install, sinon c'est le CGI qui y est placé. Si vous voulez forcer l'installation du binaire CGI, lancez make install-cli après le make install. Sinon, vous pouvez aussi spécifier --disable-cgi dans votre ligne de configuration.
Note: Du fait que les deux options --enable-cli et --enable-cgi sont activées par défaut, avoir simplement --enable-cli dans votre ligne de configuration n'implique pas nécessairement que le CLI soit renommé en {PREFIX}/bin/php pendant le make install.
Les paquets Windows entre PHP 4.2.0 et PHP 4.2.3 installaient le CLI en tant que php-cli.exe et laissaient le CGI en tant que php-cli.exe dans le même répertoire. Depuis PHP 4.3.0, le paquet Windows installe le CLI en tant que php.exe dans un répertoire à part nommé cli, donc cli/php.exe. Depuis PHP 5, le CLI est installé dans le répertoire principal en tant que php.exe. La version CGI est nommée quand à elle php-cgi.exe.
Depuis PHP 5, un nouveau fichier php-win.exe est installé. C'est l'équivalent de la version CLI à ceci près qu'il n'affiche rien et ainsi ne fait pas apparaître de console (aucune fenêtre "dos" n'apparaît à l'écran). Ce comportement est similaire à celui de php-gtk. Vous pouvez l'activer avec l'option --enable-cli-win32.
Note: Quel SAPI est installé ?
À partir d'un terminal, lancer php -v vous dira si php est en version CGI ou CLI. Vous pouvez aussi consulter la fonction php_sapi_name() et la constante PHP_SAPI.
Note: Une page man de manuel Unix a été ajoutée avec PHP 4.3.2. Vous pouvez la consulter en tapant man php dans votre interpréteur de commande.
Les différences les plus notables entre le CLI SAPI et les SAPI sont :
Contrairement au CGI SAPI, aucun en-tête HTTP n'est écrit dans le résultat.
Bien que le CGI SAPI fournisse un moyen de supprimer les en-têtes HTTP, il n'y a pas moyen d'activer les en-têtes HTTP dans le CLI SAPI.
CLI est lancé en mode silencieux par défaut, bien que les options -q et --no-header soient gardées pour rester compatible avec les anciennes versions CGI.
Il ne change pas le répertoire courant en celui du script. (les options -C et --no-chdir sont gardées par souci de compatibilité)
Messages d'erreurs en texte brut (pas de formatage HTML).
Il y a plusieurs directives du php.ini qui sont ignorées par le CLI SAPI, car elles n'ont pas de sens en environnement shell :
| Directive | Valeur par défaut pour CLI SAPI | Commentaire |
|---|---|---|
| html_errors | FALSE | Il peut être bien difficile de lire les messages d'erreur sur un terminal lorsqu'ils sont noyés dans des balises HTML sans grand intérêt. Par conséquent, cette directive est forcée à FALSE. |
| implicit_flush | TRUE | Il est souhaitable que tout affichage en provenance de print(), echo() et consorts, soit immédiatement affiché dans le terminal, et non pas placé dans un buffer quelconque. Vous pouvez toujours utiliser la bufferisation de sortie si vous voulez retarder un affichage, ou bien en manipuler le contenu une dernière fois. |
| max_execution_time | 0 (sans limite) | Étant données les possibilités infinies de PHP en environnement shell, le temps d'exécution maximal d'un script PHP a été rendu illimité. Alors que les scripts destinés au web doivent s'accomplir en une fraction de seconde, il arrive que les scripts shell requièrent bien plus de temps. |
| register_argc_argv | TRUE |
En donnant la valeur de TRUE à cette directive, vous aurez toujours accès à la variable argc (représentant le nombre d'arguments passés à l'application) et argv (le tableau contenant les arguments passés) dans le CLI SAPI. Depuis PHP 4.3.0, les variables $argc et $argv sont définies et remplies avec les valeurs appropriées, en utilisant CLI SAPI. Avant cette version, la création de ces variables était liée au comportement des versions CGI et MODULE, qui requièrent l'activation de la directive register_globals. Indépendamment de la version ou de la valeur de register_globals, vous pouvez toujours accéder à $_SERVER et $HTTP_SERVER_VARS. Par exemple : $_SERVER['argv'] |
Note: Ces directives ne peuvent pas être initialisées avec d'autres valeurs dans le fichier php.ini ou par une autre méthode. C'est une limitation, car ces valeurs par défaut s'appliquent une fois que tous les autres fichiers de configuration ont été analysés. Cependant, ces valeurs peuvent être modifiées durant l'exécution (ce qui n'est pas logique pour certaines directives, comme register_argc_argv).
Pour faciliter le travail en environnement shell, les constantes suivantes sont définies :
| Constante | Description |
|---|---|
| STDIN | Un pointeur de fichier déjà disponible vers stdin. Cela évite de l'ouvrir avec
<?phpSi vous voulez lire une seule ligne depuis stdin, vous pouvez utiliser :
<?php
|
| STDOUT | Un descripteur de fichier déjà disponible vers stdout. Cela évite de l'ouvrir avec
<?php
|
| STDERR | Un descripteur de fichier déjà disponible vers stderr. Cela évite de l'ouvrir avec
<?php
|
Étant donné ce qui précède, vous n'avez pas besoin d'ouvrir un flux vers stderr par vous-même, mais vous pouvez utiliser cette constante directement, comme un descripteur de fichier :
php -r 'fwrite(STDERR, "stderr\n");'
Vous n'avez pas non plus à fermer explicitement ces fichiers, PHP s'en chargera automatiquement à la fin du script.
Note: Ces constantes ne sont pas disponibles si le script PHP est lu depuis stdin.
Le CLI SAPI ne transforme pas le dossier courant en dossier d'exécution du script !
Exemple montrant la différence avec le CGI SAPI :
<?php
// Un test simple : affiche le dossier d'exécution */
echo getcwd(), "\n";
?>
Lorsque vous utilisez la version CGI, l'affichage sera :
$ pwd /tmp $ php-cgi -f autre_dossier/test.php /tmp/autre_dossier
Cela montre clairement que PHP modifie le dossier courant, et utilise le dossier du script exécuté.
En utilisant le CLI SAPI, on obtient :
$ pwd /tmp $ php -f autre_dossier/test.php /tmp
Cela donne beaucoup plus de souplesse lorsque vous rédigez des scripts shell avec PHP.
Note: Le CGI SAPI se comporte de la même façon que le CLI SAPI, en lui passant l'option -C, lorsque vous l'invoquez en ligne de commande.
La liste des options de ligne de commande fournies par PHP est disponible à n'importe quel moment en exécutant PHP avec l'option -h :
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse and execute <file>.
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r <code> Run PHP <code> without using script tags <?..?>
-B <begin_code> Run PHP <begin_code> before processing input lines
-R <code> Run PHP <code> for every input line
-F <file> Parse and execute <file> for every input line
-E <end_code> Run PHP <end_code> after processing all input lines
-H Hide any passed arguments from external tools.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--ri <name> Show configuration for extension <name>.
Le CLI SAPI dispose de trois moyens pour lire le code du script PHP que vous voulez exécuter :
Indiquer à PHP d'exécuter un fichier donné :
php mon_script.php php -f mon_script.php
Les deux méthodes (en utilisant -f ou pas) exécutent le script contenu dans le fichier mon_script.php. Vous pouvez choisir n'importe quel fichier, et ces fichiers ne sont pas tenus d'utiliser l'extension .php. N'importe quelle extension peut faire l'affaire.
Note: Si vous devez passer des arguments à votre script, vous devez passer -- comme premier argument lorsque vous utilisez -f.
Donner du code PHP à exécuter directement en ligne de commande.
php -r 'print_r(get_defined_constants());'
Une attention particulière doit alors être apportée aux variables d'environnement, qui seront remplacées, et aux guillemets, qui ont des significations spéciales en ligne de commande.
Note: Lisez l'exemple attentivement, il n'y a ni balise d'ouverture, ni balise de fermeture ! L'option -r rend caduque l'utilisation de celles-ci, et les ajouter conduirait alors à une erreur d'analyse syntaxique.
Alimenter l'entrée standard en code PHP (stdin).
Cela donne la possibilité de créer dynamiquement du code PHP, puis de le fournir à PHP, et enfin, de le traiter à nouveau en shell. Voici un exemple fictif :
$ some_application | some_filter | php | sort -u >final_output.txt
Il n'est pas possible de combiner ces trois modes d'exécution.
Comme toute application shell, l'exécutable PHP accepte des arguments, et votre script PHP peut aussi les recevoir. Le nombre d'arguments n'est pas limité par PHP (le shell a une limite en terme de nombre de caractères qui peuvent être passés. Généralement, vous n'atteindrez pas cette limite). Les arguments passés au script seront transmis via la variable tableau $argv. L'index zéro contiendra toujours le nom du script appelé (qui sera - dans le cas où le code PHP arrive de l'entrée standard ou depuis la ligne de commande, passé -r). L'autre variable globale fournie est $argc qui contient le nombre d'éléments dans le tableau $argv (ce nombre est différent du nombre d'arguments passés au script).
Tant que les arguments que vous passez à votre script ne commencent pas par le caractère -, il n'y a rien de spécial à surveiller. Si vous passez des arguments à votre script qui commencent par -, cela posera des problèmes car PHP va penser qu'il doit les interpréter. Pour éviter cela, utilisez le séparateur --. Après cet argument, tous les arguments suivants seront passés à votre script sans être modifiés ou analysés par PHP.
# Cela ne va pas exécuter le code, mais afficher l'aide de PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Cela va passer l'argument '-h' à votre script, et éviter que PHP ne le traite
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
Cependant, il y a une autre méthode pour utiliser PHP en script shell. Vous pouvez aussi utiliser la ligne #!/usr/bin/php en tout début de votre script, suivie de code PHP compris entre balise ouvrantes/fermantes. Après avoir mis les droits d'exécution sur votre script (chmod +x test), il peut être exécuté comme un script shell ou perl habituel :
Exemple #1 Exécute un script PHP en tant que script shell
<?php
var_dump($argv);
?>
En supposant que ce fichier s'appelle test, dans le dossier courant, nous pouvons alors faire ceci :
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Comme vous le voyez, aucune précaution n'est nécessaire pour passer des paramètres qui commencent par - à votre script.
Les options longues sont disponibles depuis PHP 4.3.3.
| Option | Option longue | Description |
|---|---|---|
| -a | --interactive |
Lance PHP de façon interactive. Si vous compilez PHP avec l'extension Readline (qui n'est pas disponible sous Windows), vous aurez un shell joli, incluant la fonctionnalité de complétion (e.g. vous pouvez commencer à taper un nom de variable, taper la touche TABULATION et PHP complètera son nom) et un historique de ce que vous entrez au clavier qui peut être consulté en utilisant les touches fléchées. Cet historique est sauvegardé dans le fichier ~/.php_history.
|
| -c | --php-ini |
Cette option permet de spécifier le nom du dossier dans lequel se trouve le fichier php.ini, ou encore de spécifier un fichier de configuration (INI) directement (qui ne s'appelle pas obligatoirement php.ini) :
$ php -c /custom/directory/ mon_script.php $ php -c /custom/directory/custom-file.ini mon_script.php Si vous ne spécifiez pas cette option, le fichier est recherché dans les endroits par défaut. |
| -n | --no-php-ini |
Ignore complètement php.ini. Cette option est disponible depuis PHP 4.3.0. |
| -d | --define |
Cette option permet de modifier n'importe quelle directive de configuration du fichier php.ini. La syntaxe est : -d configuration_directive[=value] Exemples :
# L'omission de la valeur conduit à donner la valeur de "1"
$ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Passer une valeur vide conduit à donner la valeur de ""
php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# La directive de configuration sera n'importe quelle valeur passée après le caractère '='
$ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"
|
| -e | --profile-info |
Génère des informations étendues pour le profilage et le débogage. |
| -f | --file |
Analyse et exécute le fichier donné après l'option -f. Cette option est facultative, et peut être omise. Le seul nom du fichier est suffisant.
|
| -h et -? | --help | Avec cette option, vous pouvez obtenir des informations sur la liste courante des options de la ligne de commande, ainsi que leur description. |
| -i | --info | Cette option appelle la fonction phpinfo(), et affiche le résultat. Si PHP ne fonctionne pas correctement, il est recommandé d'utiliser la commande php -i et de voir s'il n'y a pas d'erreurs affichées avant ou après la table d'information. N'oubliez pas que le résultat de cette option, si vous utilisez le mode CGI, est au format HTML, et donc de taille conséquente. |
| -l | --syntax-check |
Cette option permet de faire une vérification syntaxique sur le code PHP fourni. En cas de réussite, le message No syntax errors detected in <filename> (Littéralement, aucune erreur de syntaxe n'a été détectée dans le fichier) est affiché sur la sortie standard, et le script shell retourne 0. En cas d'erreur, le message Errors parsing <filename> (Littéralement, erreur d'analyse dans le fichier filename) est affiché, en plus des messages d'erreurs détectés par l'analyseur lui-même. Le script Shell retourne le code -1. Cette option ne détecte pas les erreurs fatales (par exemple les fonctions non définies). Utilisez -f si vous voulez tester aussi ces erreurs.
|
| -m | --modules |
Cette option liste les extensions PHP et Zend compilées (et chargées) : $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules]
|
| -r | --run |
Cette option permet l'exécution de PHP directement dans la ligne de commande. Les balises de PHP (<?php et ?>) ne sont pas nécessaires, et causeront une erreur d'analyse si elles sont présentes.
|
| -B | --process-begin |
PHP code à exécuter avant le traitement de stdin. Ajouté en PHP 5. |
| -R | --process-code |
Code PHP à exécuter pour chaque ligne en entrée. Ajouté en PHP 5. Il y a deux variables spéciales de disponibles dans ce mode : $argn et $argi. $argn doit contenir la ligne PHP traitée à ce moment donné, tandis que $argi doit contenir le numéro de la ligne. |
| -F | --process-file |
Fichier PHP à exécuter pour chaque ligne en entrée. Ajouté en PHP 5. |
| -E | --process-end |
Code PHP à exécuter après avoir effectué l'entrée. Ajouté en PHP 5.
Exemple #2 Exemple d'utilisation des options -B, -R et -E pour compter le nombre de lignes d'un projet. $ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";' Total Lines: 37328
|
| -s | --syntax-highlight et --syntax-highlighting |
Affiche le code avec la colorisation syntaxique. Cette option utilise le mécanisme interne pour analyser le fichier, et produire une version colorisée du code source, au format HTML. Notez que cette option ne fait que générer un bloc HTML, avec les balises HTML <code> [...] </code>, sans en-têtes HTML.
|
| -v | --version |
Affiche les versions de PHP, PHP SAPI, et Zend sur la sortie standard. Par exemple : $ php -v PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies
|
| -w | --strip |
Affiche la source sans les commentaires et les espaces.
|
| -z | --zend-extension |
Charge une extension Zend. Si et seulement si un fichier est fourni, PHP essaie de charger cette extension dans le dossier courant par défaut des bibliothèque sur votre système (généralement spécifié avec /etc/ld.so.conf sous Linux). Passer un nom de fichier avec le chemin complet fera que PHP utilisera ce fichier, sans recherche dans les dossiers classiques. Un chemin de dossier relatif indiquera à PHP qu'il doit chercher les extensions uniquement dans ce dossier. |
| --ini |
Affiche les noms des fichiers de configuration et des dossiers analysés. Disponible depuis PHP 5.2.3. Exemple #3 Exemple avec --ini $ php --ini Configuration File (php.ini) Path: /usr/dev/php/5.2/lib Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none)
|
|
| --rf | --rfunction |
Affiche des informations sur la fonction donnée ou la méthode d'une classe (i.e. nombre et nom des paramètres). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #4 Exemple avec --rf $ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <required> $var ]
Parameter #1 [ <optional> $... ]
}
}
|
| --rc | --rclass |
Affiche des informations sur la classe donnée (liste des constantes, propriétés et méthodes). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #5 Exemple avec --rc $ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
|
| --re | --rextension |
Affiche les informations sur l'extension donné (liste les options du php.ini, les fonctions définies, les constantes et les classes). Disponible depuis PHP 5.1.2. Cette option n'est disponible que si PHP a été compilé avec le support Reflection.
Exemple #6 Exemple avec --re $ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
|
| --ri | --rextinfo |
Affiche les informations de configuration pour l'extension donnée (les mêmes informations retournées par la fonction phpinfo()). Disponible depuis PHP 5.2.2. Les informations de configurations internes sont disponibles en utilisant le nom d'extension "main".
Exemple #7 Exemple avec --ri $ php --ri date date date/time support => enabled "Olson" Timezone Database Version => 2007.5 Timezone Database => internal Default timezone => Europe/Oslo Directive => Local Value => Master Value date.timezone => Europe/Oslo => Europe/Oslo date.default_latitude => 59.22482 => 59.22482 date.default_longitude => 11.018084 => 11.018084 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333
|
L'exécutable PHP peut être utilisé pour exécuter des scripts indépendants du serveur web. Si vous êtes sur un système Unix, il est recommandé d'ajouter la ligne spéciale en début de script, de le rendre exécutable de manière à ce que le système sache quel programme doit exécuter le script. Sous Windows, vous pouvez associer l'exécutable php.exe avec le double-clic sur les fichiers d'extension .php, ou bien vous pouvez faire un fichier batch pour exécuter le script grâce à PHP. La première ligne utilisée dans le monde Unix ne perturbera pas l'exécution sous Windows, ce qui rend les scripts facilement portables. Un exemple complet est disponible ci-dessous :
Exemple #8 Script prévu pour être exécuté en ligne de commande (script.php)
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
C'est une ligne de commande à une option.
Utilisation :
<?php echo $argv[0]; ?> <option>
<option> peut être un mot que vous souhaitez afficher.
Avec les options --help, -help, -h,
et -?, vous obtiendrez cette aide.
<?php
} else {
echo $argv[1];
}
?>
Dans le script ci-dessus, nous utilisons la première ligne pour indiquer que le fichier doit être exécuté par PHP. Nous travaillons avec une version CLI, donc aucun en-tête HTTP n'est affiché. Il y a deux variables que vous pouvez utiliser avec les applications de ligne de commande : $argc et $argv. La première est le nombre d'arguments plus un (le nom du script qui est exécuté). La seconde est un tableau contenant les arguments, commençant avec le nom du script en élément 0 ($argv[0]).
Dans notre exemple, nous avons vérifié qu'il y a plus ou moins d'un argument. De plus, si cet argument est --help, -help, -h ou -?, nous affichons un message d'aide, ainsi que le nom du script. Si nous recevons un autre argument, celui-ci est affiché dans le terminal.
Pour exécuter le script ci-dessus sous Unix, vous devez le rendre exécutable, puis l'appeler avec une commande comme : script.php echothis ou script.php -h. Sous Windows, vous pouvez faire un fichier batch pour cela :
Exemple #9 Fichier batch pour exécuter un script PHP en ligne de commande (script.bat)
@echo OFF "C:\php\php.exe" script.php %*
Si vous avez nommé le programme ci-dessus script.php, et que vous avez votre exécutable php.exe situé à C:\php\php.exe, ce fichier batch l'exécutera avec les options que vous lui passez : script.bat echothis ou script.bat -h.
Voir aussi l'extension Readline, qui dispose de nombreuses fonctions pour améliorer la convivialité de vos applications en ligne de commande.
Voir aussi Catégorie/Liste des extensions.
Le "Alternative PHP Cache" (APC) est un cache d'opcode libre et ouvert pour PHP. Son objectif est de fournir un framework libre, ouvert et robuste pour la mise en cache et l'optimisation de code intermédiaire PHP.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/apc.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Note: Sous Windows, APC a besoin d'un chemin temporaire pour exister devant être accessible en écriture par le serveur Web. Il vérifie la valeur des variables d'environnement TMP, TEMP et USERPROFILE dans cet ordre, et tente finalement le dossier WINDOWS si aucune de ces variables n'est définie.
Note: Pour des détails techniques sur l'implémentation de ce framework, lisez le » fichier TECHNOTES fourni par les développeurs .
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Bien que la configuration par défaut d'APC soit suffisante pour la plupart des installations, les utilisateurs avancés devraient affiner certains paramètres.
Il y a deux décisions importantes que vous devez prendre. D'abord, la quantité de mémoire partagée que vous voulez allouer à APC et ensuite, si vous voulez qu'APC vérifie si un fichier a été modifié à chaque requête. Les deux directives de configuration concernées sont apc.shm_size et apc.stat. Lisez avec attention la section suivante sur ces deux directives de configuration.
Une fois que vous avez un serveur qui fonctionne, vous devez copier le script apc.php fourni avec l'extension dans un endroit accessible par le serveur web, puis, appelez-le depuis votre navigateur. Il vous fournit tous les détails de votre cache. Si GD est actif sur votre configuration PHP, il y aura aussi de jolis graphiques. La première chose à vérifier est s'il y a actuellement des fichiers en cache. En supposant que cela fonctionne, vous devez donc faire attention au nombre Cache full count sur la gauche. Il indique le temps depuis lequel le cache a été créé et qui doit effacer les entrées non utilisées depuis apc.ttl secondes. Vous devriez configurer votre cache pour minimiser ce nombre. Si vous remplissez constamment votre cache, la génération du cache résultant va prendre beaucoup de ressources. Vous devriez soit allouer plus de mémoire pour APC, soit utiliser apc.filters pour mettre en cache moins de scripts.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| apc.enabled | "1" | PHP_INI_SYSTEM | PHP_INI_SYSTEM avec APC 2. PHP_INI_ALL avec APC <= 3.0.12p2 |
| apc.shm_segments | "1" | PHP_INI_SYSTEM | |
| apc.shm_size | "30" | PHP_INI_SYSTEM | |
| apc.optimization | "0" | PHP_INI_ALL | PHP_INI_SYSTEM avec APC 2. Supprimé depuis APC 3.0.13. |
| apc.num_files_hint | "1000" | PHP_INI_SYSTEM | |
| apc.user_entries_hint | "4096" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.ttl | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.user_ttl | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
| apc.cache_by_default | "1" | PHP_INI_ALL | PHP_INI_SYSTEM avec APC <= 3.0.12p2. Disponible depuis APC 3.0.0. |
| apc.filters | NULL | PHP_INI_SYSTEM | |
| apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
| apc.slam_defense | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.0. |
| apc.file_update_protection | "2" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.6. |
| apc.enable_cli | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.7. |
| apc.max_file_size | "1M" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.7. |
| apc.stat | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.10. |
| apc.write_lock | "1" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.11. |
| apc.report_autofilter | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.11. |
| apc.include_once_override | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.12. |
| apc.rfc1867 | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.13. |
| apc.rfc1867_prefix | "upload_" | PHP_INI_SYSTEM | |
| apc.rfc1867_name | "APC_UPLOAD_PROGRESS" | PHP_INI_SYSTEM | |
| apc.rfc1867_freq | "0" | PHP_INI_SYSTEM | |
| apc.localcache | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.14. |
| apc.localcache.size | "512" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.14. |
| apc.coredump_unmap | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.16. |
| apc.stat_ctime | "0" | PHP_INI_SYSTEM | Disponible depuis APC 3.0.13. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
apc.enabled peut être défini à 0 pour désactiver APC. Ceci est utile lorsque APC est compilé statiquement dans PHP, et qu'il n'y a donc aucun autre moyen de le désactiver (lorsque compilé en tant que DSO, la ligne extension dans le php.ini peut juste être commentée).
Le nombre de segments mémoire à allouer pour le cache compilé. Si APC fonctionne en dehors de la mémoire partagée, mais que vous avez déjà défini apc.shm_size aussi élevé que votre système le permet, vous pouvez tenter de relever cette valeur.
La taille de chaque segment de mémoire partagé en MB. Par défaut, quelques systèmes (incluant la plupart des BSD) ont une limite basse de la taille d'un segment mémoire partagé.
Le degré d'optimisation. Zéro désactive l'optimiseur, et de hautes valeurs utilisent des optimisations agressives. Attendez-vous à des améliorations très modestes de vitesse. Ceci est expérimental.
Un "conseil" au sujet du nombre de fichiers sources distincts qui seront inclus ou demandés sur votre serveur web. Placez à zéro ou omettez-le si vous n'êtes pas sûr ; cet arrangement est principalement utile pour les sites qui ont des milliers de fichiers sources.
Tout comme apc.num_files_hint, un "conseil" à propos du nombre de variables de cache utilisateur distinctes à stocker. Définissez le à 0 ou ne le définissez pas si vous n'êtes pas sûr.
Le nombre de secondes qu'une entrée de cache est autorisée à stagner dans un slot dans le cas où ce slot d'entrée de cache est nécessaire pour une autre entrée. Laisser à zéro signifie que votre cache pourrait potentiellement remplir d'autres entrées tant que d'autres entrées ne seront pas mises en cache.
Le nombre de secondes qu'une entrée utilisateur du cache est autorisée à résider dans un slot dans le cas où ce slot d'entrée de cache est demandé par une autre entrée. Laisser cette option à zéro signifie que votre cache peut potentiellement être rempli avec des entrées obsolètes lorsqu'il n'y a eu jamais d'entrées mises en cache. Dans le cas où le cache est à court d'espace, ce dernier sera totalement vidé si ttl vaut 0. Sinon, et si le ttl est supérieur à 0, APC va tenter de supprimer les entrées qui ont dépassé leur date d'expiration.
Le nombre de secondes qu'une entrée de cache est autorisée à rester sans utilisation, au cas où cet espace pourrait être nécessaires à une autre entrée. La valeur de zéro fait que votre cache pourrait se remplir avec des entrées oisives, et que les nouvelles entrées ne soient pas mises en cache. Dans le cas où le cache est à court de mémoire, le cache sera totalement vidé si ttl vaut 0. Sinon, et si ttl est supérieur à 0, APC va tenter de supprimer les entrées qui ont dépassé leur date d'expiration.
Actif par défaut, mais peut être désactivé et utilisé en conjonction avec un apc.filters positif donc ces fichiers seront uniquement mis en cache s'ils correspondent à un filtre positif.
Une liste séparée par des virgules d'expressions rationnelles POSIX. Si un seul masque correspond à un nom de fichier source, le fichier ne sera pas mis en cache. Notez que le nom du fichier utilisé pour le masque est celui passé aux instructions include() require(), et non un chemin absolu. Si le premier caractère de l'expression est un + alors l'expression sera additive dans le sens que chaque fichier correspondant à l'expression sera mis en cache, et si le premier caractère est un - alors tout ce qui correspond ne sera pas mis en cache. Le cas du - est celui par défaut, donc, il peut être omis.
Si compilé avec le support MMAP en utilisant --enable-mmap, ce sera le style mktemp de masque de fichier à passer au module MMAP pour déterminer si votre région de mémoire MMAP va être mise dans un fichier ou en mémoire partagée. Dans le cas de la mise en cache dans un fichier MMAP, définissez ce paramètre comme /tmp/apc.XXXXXX (exactement 6 X). Pour utiliser le style POSIX shm_open/mmap, placez un .shm quelque part dans votre masque, e.g. /apc.shm.XXXXXX. Vous pouvez également définir ce paramètre à /dev/zero pour utiliser votre interface kernel /dev/zero pour la mémoire anonyme MMAP. Le laisser indéfini forcera un MMAP anonyme.
Sur les serveurs très surchargés lorsque vous démarrez le serveur ou modifiez des fichiers, vous pouvez créer une course de plusieurs processus pour mettre en cache le même fichier en même temps. Cette option définit le pourcentage de processus qui évitera de tenter de mettre en cache un fichier non mis en cache. Ou pensez à lui comme probabilité d'un processus simple pour éviter la mise en cache. Par exemple, définir apc.slam_defense à 75 signifie qu'il y a 75 % de chances que le processus ne mettra pas en cache un fichier qui ne s'y trouvera pas déjà. Définir à 0 pour désactiver cette fonctionnalité.
Obsolète avec apc.write_lock.
Lorsque vous modifiez un fichier sur un serveur web, vous devriez le faire d'une façon atomique. Écrivez-le dans un fichier temporaire et renommez-le (mv) vers sa position permanente lorsqu'il est prêt. La plupart des éditeurs de texte, cp, tar et les autres programmes de ce genre ne font pas cela. Cela signifie qu'il y a une chance pour que le fichier soit accédé (et donc, mis en cache) alors qu'il est encore en cours d'écriture. Ce paramètre apc.file_update_protection fait intervenir un délai pour la mise en cache des nouveaux fichiers. Par défaut, il vaut 2 secondes, ce qui signifie que si le timestamp de modification (mtime) d'un fichier montre qu'il vaut moins de 2 secondes, ce fichier ne sera pas mis en cache. La personne malheureuse qui a accédé à ce fichier à moitié écrit verra une ébauche, mais au moins celui-ci ne persistera pas en cache. Si vous êtes certain de mettre toujours et automatiquement à jour vos fichiers en utilisant quelque chose comme rsync qui fait cela correctement, vous pouvez désactiver cette protection en le définissant à 0. Si vous avez une application très intensive sur le disque, qui force les procédures de mise à jour à prendre plus de 2 secondes, vous pourriez vouloir augmenter la valeur de cette directive.
Pour tester et déboguer. Définir ceci active APC pour la version CLI de PHP. Normalement, vous ne devriez pas vouloir créer, peupler et démonter le cache APC à chaque requête CLI, mais pour divers scénarios de test, elle est maniable afin de pouvoir activer facilement APC pour la version CLI d'APC.
Permet d'éviter la mise en cache des fichiers dont la taille est supérieure à cette valeur. Par défaut, 1Mo.
Faites très attention si vous modifiez cette valeur. Par défaut, APC vérifie le script à chaque demande pour voir s'il a été modifié ou non. S'il a été modifié, il sera compilé à nouveau et la nouvelle version sera mise en cache. En désactivant cette option, aucune vérification n'aura lieu. Cela signifie que si vous voulez activer les modifications, vous devez redémarrer le serveur web. Sur un serveur de production où vous modifiez rarement le code, le fait de désactiver cette option permet de gagner en performances de manière significative.
Pour les fichiers inclus/requis, cette option est également appliquée, mais notez que si vous utilisez des chemins relatifs (n'importe quel chemin qui ne commence pas par un / sous Unix), APC doit identifier de manière unique le fichier à vérifier. Si vous utilisez des chemins absolus pour vos inclusions, APC peut éviter ces vérifications et utiliser ce chemin absolu en tant qu'identifiant unique du fichier.
Sur les serveurs très chargés, lorsque vous démarrez le serveur, ou lorsque beaucoup de fichiers sont modifiés, vous pouvez en finir avec les processus qui tentent de compiler et mettre en cache le même fichier. Lorsque apc.write_lock est activé, uniquement un seul processus à la fois tentera de compiler un script de mise en cache tandis que les autres processus exécuteront les fichiers non mis en cache au lieu d'attendre que le verrou se libère.
Logs tous les scripts qui sont automatiquement exclus de la mise en cache à cause de problèmes de liaison.
Optimise les appels aux fonctions include_once() et require_once() et évite ainsi de surcharger le système appelant.
Le gestionnaire de progression de téléchargement de fichier RFC1867 n'est disponible que si vous avez compilé APC avec PHP 5.2.0 ou supérieur. Lors le support est actif, les fichiers téléchargés qui incluent un champ appelé APC_UPLOAD_PROGRESS avant le champ "file" d'un formulaire de téléchargement fera qu'APC créera automatiquement une entrée de cache utilisateur nommée upload_key où key est la valeur de l'entrée de formulaire APC_UPLOAD_PROGRESS.
Notez que les champs cachés spécifié par APC_UPLOAD_PROGRESS doivent être placés avant le champ de type file, sinon le suivi de l'upload ne fonctionnera pas correctement.
Notez que la surveillance du téléchargement de fichier n'est pas compatible avec les threads pour le moment, ainsi, les nouveaux téléchargements survenant tandis qu'un précédent est toujours en cours désactivera la surveillance précédente.
Exemple #1 Exemple avec apc.rfc1867
<?php
print_r(apc_fetch("upload_$_POST[APC_UPLOAD_PROGRESS]"));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[total] => 1142543
[current] => 1142543
[rate] => 1828068.8
[filename] => test
[name] => file
[temp_filename] => /tmp/php8F
[cancel_upload] => 0
[done] => 1
)
Préfixe de la clé à utiliser pour l'entrée de cache utilisateur généré par la fonctionnalité de progression de téléchargement RFC1867.
Spécifie le nom du champ masqué du formulaire qui active la progression du téléchargement et spécifie le suffixe de la clé du cache utilisation.
La fréquence à laquelle la mise à jour doit être effectuée pour l'entrée du cache utilisateur pour la progression du téléchargement. Peut prendre la forme d'un pourcentage de la taille totale du fichier ou une taille, en octets, optionnellement suffixée par "k", "m", ou "g" pour kilo-octets, méga-octets ou giga-octets (insensible à la casse). Si vous définissez cette option à 0, la mise à jour intervient aussi souvent que possible, ce qui peut rendre le téléchargement plus lent.
Ceci active un processus d'interface locale libre de cache, ce qui réduit les controverses de verrous lorsque le cache est sur le point d'être écrit.
La taille du processus d'interface locale libre de cache, doit être définit à une valeur suffisamment élevée, soit approximativement la moitié de la valeur de apc.num_files_hint.
Active la gestion APC des signaux, comme SIGSEGV, qui écrit les fichiers internes lorsqu'il est émis. Lorsque ces signaux sont reçus, APC tentera de détacher les segments de la mémoire partagées afin de les exclure du fichier interne. Cette configuration devrait rendre plus stable le système lorsque des signaux fatales sont reçus et qu'un gros segment APC de mémoire partagée est configuré.
Cette fonctionnalité est potentiellement dangereuse. Le détachement d'un segment de mémoire partagée dans un gestionnaire de signaux fatals peut produire à un comportement indéterminé si une erreur fatale survient.
Note: Bien que quelques noyaux puissent ignorer divers types de mémoire partagée lors de la génération du fichier interne, ces implémentations peuvent également ignorer d'importants segments de mémoire partagée tel que le scoreboard d'Apache.
Une vérification avec ctime prévient les problèmes causés par des programmes comme svn ou rsync en s'assurant que les inodes n'ont pas été modifiés depuis le dernier appel à stat. APC, normalement, n'utilise que mtime pour cela.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
(PECL apc >= 3.0.13)
apc_add — Met en cache une variable dans le magasin de données
Met en cache une variable dans le magasin de données, uniquement si elle ne s'y trouve pas déjà.
Note: Contrairement aux autres mécanismes en PHP, les variables stockées en utilisant la fonction apc_add() seront persistantes entre les requêtes (jusqu'à ce que la valeur soit effacée du cache).
Stocke la variable en utilisant son nom. La clé key est unique dans le cache, donc utilisez la fonction apc_add() pour stocker une donnée avec une clé qui existe déjà n'efface pas la donnée existante, mais retournera FALSE. (C'est la seule différence entre la fonction apc_add() et la fonction apc_store().)
La variable à stocker
Durée de vie ; stocke la variable var dans le cache pendant ttl secondes. Après ce délai, la variable stockée sera effacée du cache (à la requête suivante). Si le paramètre ttl n'est pas fourni (ou s'il vaut 0), la valeur persistera tant qu'elle ne sera pas effacée manuellement du cache, ou si elle n'existe plus dans le cache (effacement, redémarrage, etc.).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apc_add()
<?php
$bar = 'BAR';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
$bar = 'NEVER GETS SET';
apc_add('foo', $bar);
var_dump(apc_fetch('foo'));
echo "\n";
?>
L'exemple ci-dessus va afficher :
string(3) "BAR" string(3) "BAR"
(PECL apc >= 2.0.0)
apc_cache_info — Récupère les informations du cache dans l'entrepôt APC
Récupère les informations du cache et les métadonnées depuis le magasin APC.
Un tableau de données mis en cache (et les métadonnées) ou FALSE en cas d'échec.
Note: apc_cache_info() émet une alerte s'il n'est pas capable de récupérer les données APC mises en cache. Ceci arrive typiquement lorsque APC n'est pas activé.
Si cache_type vaut "user", les informations sur le cache utilisateur seront retournées.
Si cache_type vaut "filehits", les informations sur les fichiers ayant été servis depuis le cache pour la requête courante seront retournées. Cette fonctionnalité doit être activé lors de la compilation, en utilisant l'option --enable-filehits.
Si cache_type est non spécifié ou invalide, l'information à propos du cache système (fichiers mis en cache) est retournée.
Si limited vaut TRUE, la valeur retournée exclue les entrées de la liste individuelle du cache. Ceci est utile lorsque l'on tente d'optimiser les appels pour la collecte de statistiques.
| Version | Description |
|---|---|
| 3.0.11 | Le paramètre limited a été introduit. |
| 3.0.16 | L'option "filehits" du paramètre cache_type a été introduite. |
Exemple #1 Exemple avec apc_cache_info()
<?php
print_r(apc_cache_info());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[num_slots] => 2000
[ttl] => 0
[num_hits] => 9
[num_misses] => 3
[start_time] => 1123958803
[cache_list] => Array
(
[0] => Array
(
[filename] => /chemin/vers/apc_test.php
[device] => 29954
[inode] => 1130511
[type] => file
[num_hits] => 1
[mtime] => 1123960686
[creation_time] => 1123960696
[deletion_time] => 0
[access_time] => 1123962864
[ref_count] => 1
[mem_size] => 677
)
[1] => Array (...itération pour chaque fichier mis en cache)
)
(PECL apc >= 2.0.0)
apc_clear_cache — Efface le cache APC
Efface le cache utilisateur/système.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Si cache_type vaut "user", le cache utilisateur sera nettoyé ; sinon, le cache système (les fichiers mis en cache) sera nettoyé.
(PECL apc >= 3.0.13)
apc_compile_file — Stocke un fichier dans le cache, en évitant tous les filtres
Stocke un fichier dans le cache, en évitant tous les filtres.
Chemin complet ou relatif vers un fichier PHP qui sera compilé et stocké dans le cache.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL apc >= 3.0.0)
apc_define_constants — Définit un jeu de constantes pour la récupération et la définition en masse
define() est notoirement lent. Vu que le principal bénéfice d'APC est d'augmenter les performances des applications/scripts, ce mécanisme est fourni pour améliorer le processus de la définition de constantes en masse. Cependant, cette fonction n'effectue aucune opération anticipée.
Pour une solution plus performante, essayez l'extension PECL » hidef.
Note: Pour effacer plusieurs constantes stockées (sans effacer tout le cache), un tableau vide peut être passé en tant que paramètre constants , ce qui effacera les valeurs stockées.
La clé key correspondant au nom du jeu de constantes stockées. Ce paramètre key est utilisé pour récupérer les constantes stockées avec la fonction apc_load_constants().
Un tableau associatif de paires constant_name => value. Le constant_name doit suivre les règles de nommage normales des constantes. value doit être évaluée comme une valeur scalaire.
Le comportement par défaut pour les constantes est d'être déclarées en tenant compte de la casse ; i.e. CONSTANT et Constant représentent des valeurs différentes. Si ce paramètre est évalué à FALSE, les constantes seront déclarées en tant que symboles insensibles à la casse.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apc_define_constants()
<?php
$constants = array(
'UN' => 1,
'DEUX' => 2,
'TROIS' => 3,
);
apc_define_constants('numbers', $constants);
echo UN, DEUX, TROIS;
?>
L'exemple ci-dessus va afficher :
123
(PECL apc >= 3.0.0)
apc_delete — Efface une variable stockée dans le cache
Efface une variable stockée dans le cache.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apc_delete()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
apc_delete('foo');
// c'est évidemment inutile sous cette forme
?>
(PECL apc >= 3.0.0)
apc_fetch — Récupère une variable stockée dans le cache
Récupère une variable stockée dans le cache.
La clé key utilisée pour stocker la valeur (avec apc_store()).
Vaut TRUE en cas de succès, et FALSE si une erreur survient.
La variable stockée en cas de succès, FALSE si une erreur survient.
Exemple #1 Exemple avec apc_fetch()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
L'exemple ci-dessus va afficher :
string(3) "BAR"
(PECL apc >= 3.0.0)
apc_load_constants — Charge un jeu de constantes depuis le cache
Charge un jeu de constantes depuis le cache.
Le nom du jeu de constantes (qui a été stocké avec la fonction apc_define_constants()) à récupérer.
Le comportement par défaut pour les constantes est d'être déclarées en tenant compte de la casse ; i.e. CONSTANT et Constant représentent des valeurs différentes. Si ce paramètre est évalué à FALSE, les constantes seront déclarées en tant que symboles insensibles à la casse.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apc_load_constants()
<?php
$constants = array(
'UN' => 1,
'DEUX' => 2,
'TROIS' => 3,
);
apc_define_constants('numbers', $constants);
apc_load_constants('numbers');
echo UN, DEUX, TROIS;
?>
L'exemple ci-dessus va afficher :
123
(PECL apc >= 2.0.0)
apc_sma_info — Récupère les informations d'allocation mémoire partagée d'APC
Récupère les informations d'allocation mémoire partagée d'APC.
Lorsque défini à FALSE (défaut) apc_sma_info() retournera une information détaillée de chaque segment.
Tableau de données d'allocation mémoire partagée ; FALSE si une erreur survient.
Exemple #1 Exemple avec apc_sma_info()
<?php
print_r(apc_sma_info());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[num_seg] => 1
[seg_size] => 31457280
[avail_mem] => 31448408
[block_lists] => Array
(
[0] => Array
(
[0] => Array
(
[size] => 31448408
[offset] => 8864
)
)
)
)
(PECL apc >= 3.0.0)
apc_store — Met en cache une variable dans le magasin
Met en cache une variable en magasin.
Note: Contrairement à tous les autres mécanismes de PHP, les variables stockées en utilisant la fonction apc_store() persistent entre les requêtes (tant que la valeur n'est pas effacée du cache).
Stocke la variable en utilisant ce nom. Les clés key sont uniques, donc, stocker une seconde valeur avec la même clé effacera la valeur originale.
La variable à stocker.
Temps de vie : stocke la variable var dans le cache pour ttl secondes. Après que ttl soit passé, la variable stockée sera supprimée du cache (à la requête suivante). Si aucun ttl n'est fourni (ou si le ttl vaut 0), la valeur persistera tant qu'elle ne sera pas effacée manuellement du cache, ou si elle n'existe plus dans le cache (effacement, redémarrage, etc.).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apc_store()
<?php
$bar = 'BAR';
apc_store('foo', $bar);
var_dump(apc_fetch('foo'));
?>
L'exemple ci-dessus va afficher :
string(3) "BAR"
APD est un débogueur PHP avancé. Il a été écrit afin de fournir des possibilités de profilage et de déboguage pour le code PHP, mais aussi la possibilité d'afficher une trace complète. APD supporte le déboguage interactif, mais, par défaut, il écrit les données dans des fichiers de traces. Il fournit également des événements lors de la journalisation à différents niveaux (incluant les appels aux fonctions, les arguments passés, le temps passé, etc...) pouvant être activés ou non pour des scripts particuliers.
APD est une extension Zend, modifiant la façon dont les appels aux fonctions, en interne, s'effectue, et donc, peut ne pas être compatible avec les autres extensions Zend (par exemple, Zend Optimizer).
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
APD est actuellement disponible en tant qu'extension PECL, sur » http://pecl.php.net/package/apd.
Exécutez la commande suivante pour télécharger, compiler et installer la dernière version stable de APD :
pear install apd
Cela installe automatiquement le module Zend APD dans votre dossier d'extensions PHP. Il n'est pas obligatoire de le conserver ici; vous pouvez stocker ce module dans n'importe quel dossier que PHP peut lire, du moment que vous adaptez la directive de configuration zend_extension.
Les utilisateurs Windows doivent activer la bibliothèque php_apd.dll dans le php.ini afin d'utiliser ces fonctions. Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
In your INI file, add the following lines:
zend_extension = /absolute/path/to/apd.so apd.dumpdir = /absolute/path/to/trace/directory apd.statement_tracing = 0
En fonction de votre compilation de PHP, la directive zend_extension peut prendre l'une des formes suivantes :
zend_extension (non ZTS, non debug build) zend_extension_ts ( ZTS, non debug build) zend_extension_debug (non ZTS, debug build) zend_extension_debug_ts ( ZTS, debug build)
Pour compiler APD sous Windows, vous devez installer un environnement de compilation PHP, tel que décrit sur http://php.net/ : en fait, vous avez besoin de Microsoft Visual C++, win32build.zip, bison/flex, et d'un peu de savoir-faire pour le faire fonctionner. De plus, assurez-vous que adp.dsp utilise les nouvelles lignes de format DOS; si c'est le format Unix, Microsoft Visual C++ va s'en plaindre.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| apd.dumpdir | NULL | PHP_INI_ALL | |
| apd.statement_tracing | "0" | PHP_INI_ALL | Disponible depuis apd 0.9. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Spécifie le dossier dans lequel APD écrit les fichiers de profilage. Vous pouvez spécifier un chemin absolu ou relatif.
Vous pouvez spécifier un dossier différent comme argument de apd_set_pprof_trace().
Active ou désactive les traces à la ligne. En activant cette option (valeur de 1), l'application sera considérablement ralentie.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Valeur | Description |
|---|---|---|
| FUNCTION_TRACE (entier) | 1 | |
| ARGS_TRACE (entier) | 2 | |
| ASSIGNMENT_TRACE (entier) | 4 | |
| STATEMENT_TRACE (entier) | 8 | |
| MEMORY_TRACE (entier) | 16 | |
| TIMING_TRACE (entier) | 32 | |
| SUMMARY_TRACE (entier) | 64 | |
| ERROR_TRACE (entier) | 128 | |
| PROF_TRACE (entier) | 256 | |
| APD_VERSION (chaîne de caractères) | exemple : 1.0.2-dev |
À la première ligne de votre script PHP, appelez la fonction apd_set_pprof_trace() afin de commencer à enregistrer la trace :
apd_set_pprof_trace();
Vous pouvez insérer la ligne n'importe où dans votre script, mais si vous ne commencez pas à enregistrer la trace au début de votre script, vous désactiverez les données du profile qui pourraient vous mener à trouver un goulot d'étranglement.
Maintenant, exécutez votre script. L'affichage sera écrit dans le fichier apd.dumpdir/pprof_pid.ext.
Si vous utilisez la version CGI de PHP, vous devrez utiliser l'option
"-e" afin d'activer les informations étendues d'APD.
Par exemple : php -e -f script.php
Pour afficher les données formatées du profil, exécutez la commande pprofp avec les options de tri et d'affichage de votre choix. Le formatage de la sortie ressemblera à :
bash-2.05b$ pprofp -R /tmp/pprof.22141.0 Trace for /home/dan/testapd.php Total Elapsed Time = 0.00 Total System Time = 0.00 Total User Time = 0.00 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main 56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace 28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace 14.3 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 str_replace
L'option -R utilisé dans cet exemple trie la table de profil par la colonne "Real Time", représentant le temps mis par le script pour exécuter une fonction donnée. La colonne "cumm call" montre le nombre de fois que la fonction a été appelée et la colonne "s/call", le nombre de secondes chaque appel à la fonction nécessite, en moyenne.
Pour générer un fichier "calltree" que vous pourrez importer dans l'application d'analyse de profil KCacheGrind, exécutez la commande pprof2calltree.
Si vous avez des commentaires, des corrections de bogues ou si vous voulez développer des améliorations pour cette extension, vous pouvez envoyer un message à » apd@mail.communityconnect.com. Toute aide est vraiment la bienvenue.
(PECL apd >= 0.2)
apd_breakpoint — Stoppe l'interpréteur et attend un CR depuis la socket
apd_breakpoint() peut être utilisé pour stopper l'exécution de votre script PHP et attend les réponses depuis la socket connectée. Pour reprendre l'exécution du programme, appuyez juste sur enter (une ligne vide) ou entrez une commande PHP à exécuter.
Un entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis. ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Session typique utilisant tcplisten
bash#tcplisten localhost 7777
APD - Advanced PHP Debugger Trace File
---------------------------------------------------------------------------
Process Pid (6118)
Trace Begun at Sun Mar 10 23:13:12 2002
---------------------------------------------------------------------------
( 0.000000): apd_set_session_trace called at /home/alan/Projects/project2/test.
php:5
( 0.074824): apd_set_session_trace_socket() at /home/alan/Projects/project2/tes
t.php:5 returned. Elapsed (0.074824)
( 0.074918): apd_breakpoint() /home/alan/Projects/project2/test.php:7
++ argv[0] $(??) = 9
apd_breakpoint() at /home/alan/Projects/project2/test.php:7 returned. Elapsed (
-2089521468.1073275368)
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:8
>\n
statement: /home/alan/Projects/project2/test.php:10
>apd_echo($i);
EXEC: apd_echo($i);
0
>apd_echo(serialize(apd_get_active_symbols()));
EXEC: apd_echo(serialize(apd_get_active_symbols()));
a:47:{i:0;s:4:"PWD";i:1;s:10:"COLORFGBG";i:2;s:11:"XAUTHORITY";i:3;s:14:"
COLORTERM_BCE";i:4;s:9:"WINDOWID";i:5;s:14:"ETERM_VERSION";i:6;s:16:"SE
SSION_MANAGER";i:7;s:4:"PS1";i:8;s:11:"GDMSESSION";i:9;s:5:"USER";i:10;s:5:"
MAIL";i:11;s:7:"OLDPWD";i:12;s:5:"LANG";i:13;s:10:"COLORTERM";i:14;s:8:"DISP
LAY";i:15;s:8:"LOGNAME";i:16;s:6:"
>apd_echo(system('ls /home/mydir'));
>apd_continue(0);
(PECL apd 0.2-0.4)
apd_callstack — Retourne la pile d'appel courante dans un tableau
apd_callstack() retourne la pile d'appel courante dans un tableau d'éléments.
Un tableau contenant la pile d'appel courante.
Exemple #1 Exemple avec apd_callstack()
<?php
print_r(apd_callstack());
?>
(PECL apd 0.2-0.4)
apd_clunk — Lance une alerte et un callstack
apd_clunk() fonctionne de la même façon que son homologue Perl Carp::cluck. apd_clunk() lance une alerte et un callstack en utilisant le paramètre delimiter comme délimiteur.
L'alerte à lancer.
Le délimiteur. Par défaut, <BR />.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_clunk()
<?php
apd_clunk("Quelques alertes", "<br/>");
?>
(PECL apd >= 0.2)
apd_continue — Redémarre l'interpréteur
apd_continue() envoie une instruction via la socket pour redémarrer l'interpréteur.
Un entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis. ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apd_continue()
<?php
apd_continue(0);
?>
(PECL apd 0.2-0.4)
apd_croak — Lance une erreur, un callstack et sort
apd_croak() fonctionne comme son homologue Perl Carp::croak. apd_croak() lance une erreur, un callstack et sort.
L'alerte à lancer.
Le délimiteur. Par défaut, <BR />.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_croak()
<?php
apd_croak("Quelques alertes","<P>");
?>
(Unknown)
apd_dump_function_table — Affiche la table courante de fonction
apd_dump_function_table() affiche la table courante de fonction.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_dump_function_table()
<?php
apd_dump_function_table();
?>
(PECL apd 0.2-0.4)
apd_dump_persistent_resources — Retourne toutes les ressources persistantes dans un tableau
apd_dump_persistent_resources() retourne toutes les ressources persistantes dans un tableau.
Un tableau contenant toutes les ressources persistantes.
Exemple #1 Exemple avec apd_dump_persistent_resources()
<?php
print_r(apd_dump_persistent_resources());
?>
(PECL apd 0.2-0.4)
apd_dump_regular_resources — Retourne toutes les ressources régulières courantes dans un tableau
Retourne toutes les ressources régulières courantes dans un tableau.
Un tableau contenant les ressources régulières courantes.
Exemple #1 Exemple avec apd_dump_regular_resources()
<?php
print_r(apd_dump_regular_resources());
?>
(PECL apd >= 0.2)
apd_echo — Écrit dans la socket de déboguage
apd_echo() envoie via la socket une demande d'information concernant le script exécuté.
La variable de déboguage.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apd_echo()
<?php
apd_echo($i);
?>
(PECL apd 0.2)
apd_get_active_symbols — Récupère un tableau contenant les noms des variables courantes de portée locale
apd_get_active_symbols() récupère les noms de toutes les variables définies dans le contexte actif (et non leurs valeurs).
Un tableau multidimensionnel contenant toutes les variables.
Exemple #1 Exemple avec apd_get_active_symbols()
<?php
apd_echo(apd_get_active_symbols());
?>
(PECL apd >= 0.2)
apd_set_pprof_trace — Démarre la session de déboguage APD
Démarre la session de déboguage dans le dossier dump_directory /pprof_{process_id}.
Le dossier dans lequel le fichier sera écrit. S'il n'est pas fourni, la directive apd.dumpdir du php.ini sera utilisée.
Retourne le chemin du fichier de destination.
Exemple #1 Exemple avec apd_set_pprof_trace()
<?php
apd_set_pprof_trace();
?>
(PECL apd >= 0.2)
apd_set_session_trace_socket — Démarre la session de déboguage à distance
apd_set_session_trace_socket() se connecte au serveur TCP (e.g. tcplisten) spécifié par l'IP ou la socket Unix (comme un fichier) et envoie des données de déboguage à la socket.
IP ou socket Unix (comme un fichier) du serveur TCP.
Peut prendre les valeurs des constantes AF_UNIX, pour une socket à base de fichiers, ou APD_AF_INET, pour des sockets TCP/IP standard.
Vous pouvez utiliser n'importe quel port, mais les numéros de port les plus élevés sont plus recommandés que les moins élevés, qui risquent d'être utilisés par d'autres services du système.
Un entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis. ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec apd_set_socket_session_trace()
<?php
apd_set_socket_session_trace("127.0.0.1",APD_AF_INET,7112,0);
?>
(PECL apd 0.2-0.4)
apd_set_session_trace — Démarre la session de déboguage APD
Démarre le déboguage de apd_dump_{process_id} dans le dossier dump_directory .
Un entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis. ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Le dossier dans lequel le fichier sera écrit. S'il n'est pas défini, la valeur du paramètre de configuration apd.dumpdir du php.ini sera utilisée.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_set_session_trace()
<?php
apd_set_session_trace(99);
?>
(PECL apd 0.2-0.4)
apd_set_session — Modifie ou définit le degré de déboguage courant
apd_set_session() peut être utilisé pour augmenter ou diminuer le degré de déboguage dans un endroit particulier de votre application.
Un entier qui est formé en ajoutant les constantes XXX_TRACE.
Il n'est pas recommandé d'utiliser MEMORY_TRACE. C'est très lent et ne semble pas être précis. ASSIGNMENT_TRACE n'est actuellement pas implémenté.
Pour activer toutes les traces fonctionnelles (TIMING, FUNCTIONS, ARGS SUMMARY (comme strace -c)), utilisez la valeur 99
Aucune valeur n'est retournée.
Exemple #1 Exemple avec apd_set_session()
<?php
apd_set_session(9);
?>
(PECL apd >= 0.2)
override_function — Surcharge les fonctions intégrées
override_function() surcharge les fonctions intégrées (les remplace dans la table des symboles).
La fonction à surcharger.
Les arguments de la fonction, séparés par une virgule.
Habituellement, vous voudriez passer ce paramètre, tout comme le paramètre function_code , délimité par un guillemet simple. La raison pour laquelle on utilise un guillemet simple est pour protéger le nom de la variable lors de l'analyse, sinon, si vous utilisez des guillemets doubles, il devient nécessaire d'échapper le nom de la variable, e.g. \$votre_variable.
Le nouveau code pour la fonction.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec override_function()
<?php
override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
?>
(PECL apd >= 0.2)
rename_function — Renomme une fonction intégrée dans la table des fonctions globales
rename_function() renomme une fonction intégrée dans la table des fonctions globales. Utile pour surcharger temporairement une fonction intégrée.
Le nom original de la fonction.
Le nouveau nom pour la fonction original_name .
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec rename_function()
<?php
rename_function('mysql_connect', 'debug_mysql_connect' );
?>
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Bcompiler a été écrit pour diverses raisons :
La première des raisons est possible en utilisant les fonctions bcompiler_write_header(), bcompiler_write_file() et bcompiler_write_footer(). Les fichiers bytecode peuvent être écrits compressés ou non. Pour utiliser le bytecode généré, vous pouvez simplement l'inclure grâce aux instructions include ou require.
La deuxième raison est possible en utilisant les fonctions bcompiler_write_header(), bcompiler_write_class(), bcompiler_write_footer(), bcompiler_read(), et bcompiler_load(). Les fichiers bytecode peuvent être écrits compressés ou non. La fonction bcompiler_load() lit le fichier bytecode compressé, qui représente un tiers de la taille du fichier original.
Pour créer les fichiers de type EXE, bcompiler doit être utilisé avec un fichier sapi modifié ou une version de PHP qui a été compilé en tant que bibliothèque partagé. Dans ce cas, bcompiler lit le bytecode compressé depuis la fin du fichier EXE.
Bcompiler peut améliorer les performances d'environ 30% lors de l'utilisation de bytecode non compressé uniquement. Mais garder à l'esprit que le bytecode non compressé peut représenter une taille 5 fois plus large que le code source original. L'utilisation de bytecode compressé prendra moins de place, mais la décompression nécessite plus de temps que d'analyser le code source. De plus, Bcompiler n'effectue aucune optimisation du bytecode. Cette fonctionnalité devrait être ajoutée dans les futures versions...
D'un point de vue de la protection du code, l'on peut dire qu'il est absolument impossible de recréer le code source exact, tel qu'à l'origine, et sans les commentaires originaux. Cependant, il est possible de récupérer les données depuis un fichier bytecode Bcompiler - de ce fait, n'y incluez pas vos mots de passes personnels.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Note d'installation :
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Si vous avez des commentaires, des corrections de bogues, des améliorations ou que vous voulez aider à rendre cette extension meilleure, vous pouvez envoyer un message à » alan_k@php.net. Toute aide est vraiment la bienvenue.
(PECL bcompiler >= 0.4)
bcompiler_load_exe — Lit et crée des classes depuis un fichier exe bcompiler
Lit les données depuis le fichier exe bcompiler appelé filename et crée les classes à partir du bytecode.
Le chemin vers le fichier exe, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_load_exe()
<?php
bcompiler_load_exe("/tmp/example.exe");
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.4)
bcompiler_load — Lit et crée les classes depuis un fichier compressé en bzip2
Lit les données depuis le fichier compressé en bzip2 filename et crée les classes depuis le bytecode.
Le chemin vers le fichier compressé avec bzip2, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_load()
<?php
bcompiler_load("/tmp/example");
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note: Utiliser les instructions include() ou require() pour analyser les bytecodes : c'est plus portable et plus commode que d'utiliser cette fonction.
Notez que cette fonction n'exécute pas le corps du script contenu dans le fichier bytecode.
(PECL bcompiler >= 0.4)
bcompiler_parse_class — Lit le bytecode d'une classe et revient à une fonction utilisateur
Lit le bytecode d'une classe et revient à une fonction utilisateur.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_parse_class()
<?php
function readByteCodes($data) {
print_r($data);
}
bcompiler_parse_class("DB","readByteCodes");
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note: Cette fonction a été supprimée de bcompiler et n'est plus disponible depuis bcompiler 0.5.
(PECL bcompiler >= 0.4)
bcompiler_read — Lit et crée les classes depuis un pointeur de fichier
Lit les données depuis un fichier ouvert représenté par la ressource filehandle et crée les classes depuis le bytecode.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_read()
<?php
$fh = fopen("/tmp/example","r");
bcompiler_read($fh);
fclose($fh);
print_r(get_defined_classes());
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note: Utiliser les instructions include() ou require() pour analyser les bytecodes : c'est plus portable et plus commode que d'utiliser cette fonction.
Notez que cette fonction n'exécute pas le corps du script contenu dans le fichier bytecode.
(PECL bcompiler >= 0.4)
bcompiler_write_class — Écrit une classe définie en bytecode
Lit le bytecode d'une classe existante nommée className depuis PHP et l'écrit dans le fichier ouvert désigné par la ressource filehandle .
Une ressource de fichier retournée par la fonction fopen().
Le nom de la classe, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_class()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
// vous devez écrire DB_common avant DB_mysql, car DB_mysql étend DB_common.
bcompiler_write_class($fh,"DB_common");
bcompiler_write_class($fh,"DB_mysql");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Note: Cette fonction n'effectue pas de vérification sur les dépendances, assurez-vous donc d'écrire les classes dans l'ordre pour éviter d'avoir une alerte du genre 'undefined class' lorsque vous les chargerez.
(PECL bcompiler >= 0.5)
bcompiler_write_constant — Écrit une constante définie comme bytecode
Lit le bytecode depuis PHP pour une constante existante constantName et écrit le bytecode dans le fichier ouvert désigné par filehandle .
Une ressource de fichier retournée par la fonction fopen().
Le nom de la constante définie, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_constant()
<?php
define("MODULE_MAX", 30);
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_constant($fh,"MODULE_MAX");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.6)
bcompiler_write_file — Écrit un code source PHP sous forme de bytecode
Cette fonction compile le fichier filename en bytecodes, et écrit le résultat dans le fichier filename .
Une ressource de fichier retournée par la fonction fopen().
Le chemin vers le fichier source, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_file()
<?php
$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);
/* Ce qui suit doit être équivalent :
include "example.php";
et
include "example.phb";
*/
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_function — Écrit une fonction définie sous forme de bytecode
Lit le bytecode d'une fonction existante depuis PHP et l'écrit dans le fichier désigné par la ressource de fichier filehandle . L'ordre n'est pas important (e.g. si la fonction b utilise la fonction a et que vous compilez l'exemple ci-dessous, cela fonctionnera très bien).
Une ressource de fichier retournée par la fonction fopen().
Le nom de la fonction, sous la forme d'une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_function()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_function($fh,"my_function_a");
bcompiler_write_function($fh,"my_function_b");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_functions_from_file — Écrit toutes les fonctions définies dans un fichier sous forme de bytecode
Recherche toutes les fonctions déclarées dans le fichier nommé fileName et écrit leurs bytecodes correspondants dans le fichier désigné par la ressource filehandle .
Une ressource de fichier retournée par la fonction fopen().
Le fichier à compiler. Souvenez-vous de toujours include/require les fichiers que vous tentez de compiler.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_functions_from_file()
<?php
require('module.php');
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_functions_from_file($fh,'module.php');
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.3)
bcompiler_write_header — Écrit l'en-tête bcompiler
Écrit l'en-tête bcompiler.
Une ressource de fichier retournée par la fonction fopen().
Peut être utilisé pour écrire le bytecode dans un format utilisé précédemment, vous pouvez donc l'utiliser avec les anciennes versions de bcompiler.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec bcompiler_write_header()
<?php
$fh = fopen("/tmp/example","w");
bcompiler_write_header($fh);
bcompiler_write_class($fh,"DB");
bcompiler_write_footer($fh);
fclose($fh);
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PECL bcompiler >= 0.5)
bcompiler_write_included_filename — Écrit un fichier inclus en tant que bytecode
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Voici des fonctions gérant les erreurs et les journaux. Elles vous permettent de définir vos propres règles de gestion des erreurs, mais aussi la façon dont les erreurs sont enregistrées ; ceci afin de répondre à vos besoins particuliers.
Avec les fonctions de journal, vous pouvez envoyer des messages directement à d'autres machines (ou des emails avec une passerelles), vers les logs du système, etc..., ainsi, vous pouvez sélectionner les messages et surveiller les parties les plus importantes de vos applications et de vos sites web.
Les fonctions sur le rapport d'erreurs vous permettent de personnaliser le degré et les erreurs désirées, en les catégorisant comme simple avertissement jusqu'à l'exécution de fonctions personnalisées lorsque des erreurs surviennent.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| error_reporting | NULL | PHP_INI_ALL | |
| display_errors | "1" | PHP_INI_ALL | |
| display_startup_errors | "0" | PHP_INI_ALL | |
| log_errors | "0" | PHP_INI_ALL | |
| log_errors_max_len | "1024" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| ignore_repeated_errors | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| ignore_repeated_source | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| report_memleaks | "1" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| track_errors | "0" | PHP_INI_ALL | |
| html_errors | "1" | PHP_INI_ALL | PHP_INI_SYSTEM in PHP <= 4.2.3. |
| xmlrpc_errors | "0" | PHP_INI_SYSTEM | Disponible depuis PHP 4.1.0. |
| xmlrpc_error_number | "0" | PHP_INI_ALL | Disponible depuis PHP 4.1.0. |
| docref_root | "" | PHP_INI_ALL | Disponible depuis PHP 4.3.0. |
| docref_ext | "" | PHP_INI_ALL | Disponible depuis PHP 4.3.2. |
| error_prepend_string | NULL | PHP_INI_ALL | |
| error_append_string | NULL | PHP_INI_ALL | |
| error_log | NULL | PHP_INI_ALL |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Fixe le niveau d'erreur. Ce paramètre est un entier, représentant un champ de bits. Ajoutez les valeurs suivantes pour choisir le niveau que vous désirez, telles que décrites dans la section Constantes pré-définies, et dans le fichier php.ini. Pour modifier cette configuration durant l'exécution du script, utilisez la fonction error_reporting(). Voyez aussi la directive display_errors.
En PHP 4 et PHP 5, la configuration par défaut est E_ALL & ~E_NOTICE. Elle montre toutes les erreurs, sauf les E_NOTICE. Il est recommandé de les afficher durant le développement.
Note: Activer le rapport d'erreur de niveau E_NOTICE durant le développement a des avantages. En terme de déboguage, les message d'alertes vous signalent des bogues potentiels dans votre code. Par exemple, l'utilisation de valeurs non initialisées est signalée. Il est aussi plus pratique pour trouver des coquilles, et, ainsi, gagner du temps. Les messages NOTICE vous signaleront aussi les mauvaises pratiques de codage. Par exemple $arr[item] doit toujours être écrit $arr['item'] car PHP va considérer "item" comme une constante, au premier abord. Si cette constante n'est pas définie, alors il va l'utiliser comme une chaîne.
Note: En PHP 5, un nouveau niveau d'erreur nommé E_STRICT est disponible. Comme E_STRICT n'est pas inclus sans E_ALL, vous devez explicitement activer ce niveau d'erreur. Activer E_STRICT pendant le développement peut être bénéfique. Les messages STRICT vous aideront à utiliser la dernière et meilleure suggestion de méthode de codage, par exemple, vous alertera de l'utilisation de fonctions non recommandées.
Note: Les constantes PHP en dehors de PHP
L'utilisation des constantes PHP en dehors de PHP, comme dans le fichier httpd.conf, n'a pas de signification utile mise à part dans les cas où des valeurs entières sont nécessaires. Et depuis que les niveaux d'erreurs ont été ajoutés, la valeur maximale (pour E_ALL) devrait changée. Donc, à la place de E_ALL, utilisez plutôt une valeur plus grande pour couvrir tous les octets, une valeur numérique comme 2147483647.
Cette directive détermine si les erreurs doivent être affichées à l'écran ou non.
La valeur "stderr" envoie les erreurs vers stderr plutôt que vers stdout. La valeur est disponible depuis PHP 5.2.4. Dans les anciennes versions, cette directive était du type boolean.
Note: C'est une directive nécessaire en développement mais qui ne doit jamais être utilisée sur un système en production. (e.g. systèmes connectés à Internet).
Note: Bien que display_errors peut être défini en cours d'exécution (avec la fonction ini_set()), il n'aura aucun effet si le script a des erreurs fatales, car l'action désirée au moment de l'exécution ne sera pas exécutée.
Même si display_errors est activé, des erreurs peuvent survenir lors de la séquence de démarrage de PHP, et ces erreurs sont cachées. Avec cette option, vous pouvez les afficher, ce qui est recommandé pour le déboguage. En dehors de ce cas, il est fortement recommandé de laisser display_startup_errors à off.
Indique où les messages d'erreur générés doivent être écrits : dans l'historique du serveur ou dans error_log. Cette fonction est spécifique aux serveurs.
Note: Il est recommandé d'utiliser l'historique d'erreur, plutôt que d'afficher les erreurs sur les sites de production.
Configure la taille maximale des erreurs qui seront enregistrées dans l'historique, en kilo octets. Dans les informations de error_log, l'origine est ajoutée. La valeur par défaut est de 1024. 0 signifie qu'il n'y a pas de limite de taille. Cette longueur est appliquée pour enregistrer dans l'historique les erreurs, afficher les erreurs et également à $php_errormsg.
Lorsqu'un entier est utilisé, sa valeur est mesurée en octets. Vous pouvez également utiliser la notation sténographique comme décrit dans cette entrée de la FAQ..Ne pas enregistrer des messages répétitifs. Les erreurs répétées doivent survenir au même moment, à la même ligne et depuis le même fichier de script, à moins que ignore_repeated_source soit défini à TRUE.
Ignore la source du message lors des messages répétés. Lorsque vous avez configuré cette option à On, vous n'enregistrerez pas les erreurs répétées provenant de fichiers et lignes de code différents.
Si ce paramètre est mis à Off, alors les fuites de mémoires ne seront pas affichées (sur la sortie standard, stdout ou dans les logs). Cette option n'a d'effet que si PHP a été compilé avec l'option de déboguage, et si error_reporting inclut E_WARNING dans sa liste.
Si cette option est activée, le dernier message d'erreur sera placé dans la variable $php_errormsg.
Désactive les balises HTML dans les messages d'erreurs. Le nouveau format d'erreurs HTML fournit des messages avec liens hypertexte, qui redirige l'utilisateur vers la documentation de l'erreur ou de la fonction. Ces références sont affectées par docref_root et docref_ext.
Désactive le rapport normal d'erreur et formate les erreurs comme des messages d'erreur XML-RPC.
Utilisé comme valeur de l'élément XML-RPC faultcode.
Le nouveau format d'erreur contient une référence à une page décrivant
l'erreur, ou la fonction ayant causé l'erreur. Pour le manuel, vous pouvez
télécharger ce dernier dans votre langue, et configurer cette option pour qu'elle
pointe sur lui. Si votre copie du manuel est accessible à
"/manual/", vous pouvez simplement utiliser
docref_root=/manual/
. De plus, vous devez configurer
docref_ext
pour qu'elle corresponde aux extensions de votre manuel.
docref_ext=.html
. Il est possible d'utiliser des
références externes. Par exemple, vous pouvez utiliser
docref_root=http://manual/en/
ou
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon&url=http%3A%2F%2Fwww.php.net%2F"
La plupart du temps, vous utilisez l'option docref_root avec un slash a la fin ("/"). Mais ce n'est pas obligatoire, comme le montre le second exemple ci-dessus.
Note: Cette directive est destiné à vous aider dans votre développement en rendant facile la consultation de la description d'une fonction. Ne jamais l'utiliser sur un système de production (e.g. système connecté à Internet).
Voir aussi docref_root.
Note: La valeur de docref_ext doit commencer par un point ".".
La chaîne à placer avant les messages d'erreur.
La chaîne à placer après les messages d'erreur.
Nom du fichier où seront enregistrées les erreurs. Le fichier doit être accessible en écriture par l'utilisateur exécutant le serveur web. Si la valeur spéciale syslog est utilisée, les erreurs seront envoyées au système d'historique du serveur. Sous Unix, cela correspond à syslog(3) et sous Windows NT, à l'historique d'événement. L'historique n'est pas supporté sous Windows 95. Voir aussi : syslog(). Si cette directive n'est pas fixée, les erreurs sont envoyées au journal d'erreurs SAPI. Par exemple, s'il s'agit d'une erreur de journal dans Apache ou stderr dans CLI.
Cette extension ne définit aucune ressource.
Les constantes listées ici sont toujours disponibles dans PHP.
Note: Vous pouvez utiliser ces constantes dans le fichier php.ini mais pas hors de PHP, comme dans le fichier httpd.conf, où vous devez utiliser les valeurs de champs de bits.
| Valeur | Constante | Description | Note |
|---|---|---|---|
| 1 | E_ERROR (entier) | Les erreurs sont aussi affichées par défaut, et l'exécution du script est interrompue. Elles indiquent des erreurs qui ne peuvent pas être ignorées, comme des problèmes d'allocation de mémoire, par exemple. | |
| 2 | E_WARNING (entier) | Les alertes sont affichées par défaut, mais n'interrompent pas l'exécution du script. Elles indiquent un problème qui doit être intercepté par le script durant l'exécution du script. Par exemple, appeler ereg() avec une expression rationnelle invalide. | |
| 4 | E_PARSE (entier) | Les erreurs d'analyse ne doivent être générées que par l'analyseur. Elles ne sont citées ici que dans le but d'être exhaustif. | |
| 8 | E_NOTICE (entier) | Les alertes ne sont pas affichées par défaut, et indiquent que le script a rencontré quelque chose qui peut être une erreur, mais peut aussi être un événement normal dans la vie du script. Par exemple, essayer d'accéder à une valeur qui n'a pas été déclarée, ou appeler stat() sur un fichier qui n'existe pas. | |
| 16 | E_CORE_ERROR (entier) | Elles sont similaires aux erreurs E_ERROR, mais elles sont générées par le code de PHP. Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 32 | E_CORE_WARNING (entier) | Elles sont similaires à E_WARNING, mais elles sont générées par le code de PHP. Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 64 | E_COMPILE_ERROR (entier) | Elles sont similaires à E_ERROR, mais elles sont générées par le moteur Zend. Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 128 | E_COMPILE_WARNING (entier) | Elles sont similaires à E_WARNING, mais elles sont générées par le moteur Zend. Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 256 | E_USER_ERROR (entier) | Message d'erreur généré par l'utilisateur. Comparable à E_ERROR. Elle est générée en PHP par l'utilisation de la fonction trigger_error(). Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 512 | E_USER_WARNING (entier) | Message d'erreur généré par l'utilisateur. Comparable à E_WARNING. Elle est générée en PHP par l'utilisation de la fonction trigger_error(). Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 1024 | E_USER_NOTICE (entier) | Message d'erreur généré par l'utilisateur. Comparable à E_NOTICE. Elle est générée en PHP par l'utilisation de la fonction trigger_error(). Les fonctions ne doivent pas générer ce genre d'erreur. | Depuis PHP 4 |
| 2048 | E_STRICT (entier) | Permet d'obtenir des suggestions de PHP pour modifier votre code, assurant ainsi une meilleure interopérabilité et compatibilité de celui-ci. | Depuis PHP 5 |
| 4096 | E_RECOVERABLE_ERROR (entier) | Erreur fatale qui peut être captée. Ceci indique qu'une erreur probablement dangereuse s'est produite, mais n'a pas laissé l'engin Zend dans un état instable. Si l'erreur n'est pas attrapée par un gestionnaire d'erreur défini par l'utilisateur (voyez aussi set_error_handler(), l'application arrête prématurément comme si cela était une E_ERROR. | Depuis PHP 5.2.0 |
| 8192 | E_DEPRECATED (entier) | Alertes d'exécution. Activer cette option pour recevoir des alertes sur les portions de votre code qui pourraient ne pas fonctionner avec les futures versions. | Depuis PHP 5.3.0 |
| 16384 | E_USER_DEPRECATED (entier) | Message d'alerte généré par l'utilisateur. Fonctionne de la même façon que E_DEPRECATED, mise à part que le message est généré par votre code PHP en utilisant la fonction trigger_error(). | Depuis PHP 5.3.0 |
| 30719 | E_ALL (entier) | Toutes les erreurs et alertes supportées sauf le niveau E_STRICT dans PHP < 6. | 32767 en PHP 6, 30719 en PHP 5.3.x, 6143 en PHP 5.2.x, et 2047 auparavant |
Les valeurs ci-dessus (numérique ou symbolique) sont utilisées pour constituer des champs de bits, qui spécifient le niveau de rapport d'erreur. Vous pouvez utiliser les opérateurs de bits pour combiner ces valeurs pour en faire des masques qui filtrent certaines erreurs. Notez bien que seuls '|', '~', '!', '^' et '&' seront compris dans le fichier php.ini.
Ci-dessous, vous trouverez un exemple de gestion des erreurs par PHP. Il y est défini un gestionnaire d'erreur, qui enregistre les informations dans un fichier (au format XML), et envoie un courriel au développeur si l'erreur est critique.
Exemple #1 Gestion d'erreurs avancées en PHP
<?php
// Nous allons faire notre propre gestion
error_reporting(0);
// Fonction spéciale de gestion des erreurs
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// Date et heure de l'erreur
$dt = date("Y-m-d H:i:s (T)");
// Définit un tableau associatif avec les chaînes d'erreur
// En fait, les seuls niveaux qui nous interessent
// sont E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING et E_USER_NOTICE
$errortype = array (
E_ERROR => 'Erreur',
E_WARNING => 'Alerte',
E_PARSE => 'Erreur d\'analyse',
E_NOTICE => 'Note',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'Erreur spécifique',
E_USER_WARNING => 'Alerte spécifique',
E_USER_NOTICE => 'Note spécifique',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
);
// Les niveaux qui seront enregistrés
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";
if (in_array($errno, $user_errors)) {
$err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
}
$err .= "</errorentry>\n\n";
// sauvegarde de l'erreur, et mail si c'est critique
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR) {
mail("phpdev@example.com","Critical User Error",$err);
}
}
function distance($vect1, $vect2)
{
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Vectors need to be of the same size", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Coordinate $i in vector 1 is not a number, using zero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Coordinate $i in vector 2 is not a number, using zero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// constante non définie, qui génère une alerte
$t = I_AM_NOT_DEFINED;
// définition de quelques vecteurs
$a = array (2, 3, "foo");
$b = array (5.5, 4.3, -1.6);
$c = array (1, -3);
// génère une erreur utilisateur
$t1 = distance ($c, $b)."\n";
// génère une erreur utilisateur
$t2 = distance ($b, "i am not an array")."\n";
// Génère une alerte
$t3 = distance ($a, $b)."\n";
?>
Voir aussi la fonction syslog().
(PHP 4 >= 4.3.0, PHP 5)
debug_backtrace — Génère le contexte de déboguage
debug_backtrace() génère un contexte de déboguage PHP.
Indique s'il faut remplir l'index "object". Par défaut, TRUE.
Retourne un tableau associatif. Les éléments de retour possibles sont les suivants :
| Nom | Type | Description |
|---|---|---|
| function | chaîne de caractères | Le nom de la fonction courante. Voir aussi __FUNCTION__. |
| line | entier | Le numéro de la ligne courante. Voir aussi __LINE__. |
| file | string | Le nom du fichier courant. Voir aussi __FILE__. |
| class | string | Le nom courante de la classe. Voir aussi __CLASS__ |
| object | object | L'objet courant. |
| type | string | Le type de classe courante. Si une méthode est appelée, "->" est retourné. Si une méthode statique est appelé, "::" est retourné. Si une fonction est appelée, rien ne sera retourné. |
| args | array | Si à l'intérieur d'une fonction, ceci liste des arguments. Si dans un fichier inclus, ceci liste des fichiers inclus. |
| Version | Description |
|---|---|
| 5.2.5 | Ajout du paramètre optionnel provide_object . |
| 5.1.1 | Ajout de l'objet courant comme élément de retour possible. |
Exemple #1 Exemple avec debug_backtrace()
<?php
// filename: /tmp/a.php
function a_test($str)
{
echo "\nHi: $str";
var_dump(debug_backtrace());
}
a_test('friend');
?>
<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';
?>
Résultat de l'exécution de /tmp/b.php :
Hi: friend
array(2) {
[0]=>
array(4) {
["file"] => string(10) "/tmp/a.php"
["line"] => int(10)
["function"] => string(6) "a_test"
["args"]=>
array(1) {
[0] => &string(6) "friend"
}
}
[1]=>
array(4) {
["file"] => string(10) "/tmp/b.php"
["line"] => int(2)
["args"] =>
array(1) {
[0] => string(10) "/tmp/a.php"
}
["function"] => string(12) "include_once"
}
}
(PHP 5)
debug_print_backtrace — Affiche la pile d'exécution PHP
debug_print_backtrace() affiche la pile d'exécution de PHP. Elle affiche les appels aux fonctions, aux fichiers inclus / requis ainsi que les appels à eval().
Cette fonction n'a aucun paramètre.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec debug_print_backtrace()
<?php
// fichier include.php
function a() {
b();
}
function b() {
c();
}
function c(){
debug_print_backtrace();
}
a();
?>
<?php
// fichier test.php
// C'est le fichier que vous devez exécuter
include 'include.php';
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
#0 eval() called at [/tmp/include.php:5] #1 a() called at [/tmp/include.php:17] #2 include(/tmp/include.php) called at [/tmp/test.php:3] #0 c() called at [/tmp/include.php:10] #1 b() called at [/tmp/include.php:6] #2 a() called at [/tmp/include.php:17] #3 include(/tmp/include.php) called at [/tmp/test.php:3]
(PHP 5 >= 5.2.0)
error_get_last — Récupère la dernière erreur survenue
Récupère la dernière erreur survenue.
Retourne un tableau associatif décrivant la dernière errer avec les clés "type", "message", "file" et "line". Retourne NULL s'il n'y a actuellement aucune erreur.
Exemple #1 Exemple avec error_get_last()
<?php
echo $a;
print_r(error_get_last());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[type] => 8
[message] => Undefined variable: a
[file] => C:\WWW\index.php
[line] => 2
)
(PHP 4, PHP 5)
error_log — Stocke un message d'erreur
Envoie un message d'erreur à l'historique du serveur web, à un port TCP ou un fichier.
Le message d'erreur qui doit être stocké.
Spécifie la destination du message d'erreur. Les types possibles de messages sont :
| 0 | message est envoyé à l'historique PHP, qui est basé sur l'historique système ou un fichier, en fonction de la configuration de error_log. C'est l'option par défaut. |
| 1 | message est envoyé par email à l'adresse destination . C'est le seul type qui utilise le quatrième paramètre extra_headers . |
| 2 | N'est plus une option. |
| 3 | message est ajouté au fichier destination . Une nouvelle ligne est automatiquement ajoutée à la fin de la chaîne message . |
| 4 | message est envoyé directement au gestionnaire d'identification SAPI. |
La destination. Cela dépend du paramètre message_type décrit ci-dessus.
Les en-têtes supplémentaires. Ils sont utilisés lorsque le paramètre message_type est défini à 1. Ce type de message utilise la même fonction interne que la fonction mail().
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
| Version | Description |
|---|---|
| 5.2.7 | La valeur possible pour 4 a été ajoutée à message_type . |
Exemple #1 Exemples avec error_log()
<?php
// Envoie une notification par l'historique du serveur web,
// si la connexion à la base de données est impossible.
if (!Ora_Logon($username, $password)) {
error_log("Base Oracle indisponible !", 0);
}
// Indiquer à l'administrateur, par email, qu'il n'y a plus de FOO
if (!($foo = allocate_new_foo())) {
error_log("Aya!, Il ne reste plus de FOO disponibles !", 1,
"operateur@example.com");
}
// D'autres manières d'appeler error_log():
error_log("Grosse bourde !", 3, "/var/tmp/mes-erreurs.log");
?>
(PHP 4, PHP 5)
error_reporting — Fixe le niveau de rapport d'erreurs PHP
error_reporting() modifie la directive error_reporting pendant l'exécution du script. PHP possède plusieurs niveaux d'erreurs, utiliser cette fonction configure ce niveau pendant la durée (d'exécution) de votre script.
Le nouveau niveau error_reporting. Il peut être un champ de bits ou une combinaison de constantes. L'utilisation des constantes est vivement recommandée pour assurer une compatibilité maximale avec les futures versions. Au fur et à mesure que de nouveaux niveaux d'erreurs sont créés, les valeurs évoluent, c'est pourquoi les anciennes valeurs n'ont plus forcément la même signification.
Les constantes représentant les niveaux d'erreurs disponibles et la signification de ces niveaux d'erreurs est décrite dans le manuel sur les constantes prédéfinies.
Retourne l'ancien niveau d'error_reporting.
| Version | Description |
|---|---|
| 5.0.0 | E_STRICT est introduit (ne fait plus partie de E_ALL). |
| 5.2.0 | E_RECOVERABLE_ERROR est introduit. |
| 5.3.0 | E_DEPRECATED et E_USER_DEPRECATED ont été introduits. |
| 6.0.0 | E_STRICT devient une partie de E_ALL. |
Exemple #1 Exemple avec error_reporting()
<?php
// Désactiver le rapport d'erreurs
error_reporting(0);
// Rapporte les erreurs d'exécution de script
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Rapporter les E_NOTICE peut vous aider à améliorer vos scripts
// (variables non initialisées, variables mal orthographiées..)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Rapporte toutes les erreurs à part les E_NOTICE
// C'est la configuration par défaut de php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Reporte toutes les erreurs PHP (Voir l'historique des modifications)
error_reporting(E_ALL);
// Reporte toutes les erreurs PHP
error_reporting(-1);
// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>
La plupart des erreurs E_STRICT sont évaluées au moment de la compilation, comme les erreurs qui ne sont pas reportées dans le fichier lorsque error_reporting est défini pour inclure les erreurs E_STRICT (et vice-versa).
En passant la valeur -1, toutes les erreurs possibles seront affichées, même lors de l'ajout d'autres niveaux et constantes dans les futures versions de PHP. La constantes E_ALL fonctionne de la même façon depuis PHP 6.
(PHP 4 >= 4.0.1, PHP 5)
restore_error_handler — Réactive l'ancienne fonction de gestion des erreurs
Utilisée après avoir modifié la fonction de gestion des erreurs, grâce à set_error_handler(), restore_error_handler() permet de réutiliser l'ancienne version de gestion des erreurs (qui peut être la fonction PHP par défaut, ou une autre fonction utilisateur).
Cette fonction retourne toujours TRUE.
Exemple #1 Exemple avec restore_error_handler()
Si unserialize() cause une erreur, alors le gestionnaire d'erreurs original est restauré.
<?php
function unserialize_handler($errno, $errstr)
{
echo "Valeur incorrectement linéarisée.\n";
}
$serialized = 'foo';
set_error_handler('unserialize_handler');
$original = unserialize($serialized);
restore_error_handler();
?>
L'exemple ci-dessus va afficher :
Valeur incorrectement linéarisée.
Note: L'appel de la fonction restore_error_handler() depuis la fonction error_handler est ignoré.
(PHP 5)
restore_exception_handler — Réactive l'ancienne fonction de gestion d'exceptions
restore_exception_handler() est utilisé, après le changement de la fonction de gestion d'exceptions avec la fonction set_exception_handler(), pour revenir à l'ancien gestionnaire d'exceptions (qui peut être la fonction interne ou une fonction définie par l'utilisateur).
Cette fonction retourne toujours TRUE.
Exemple #1 Exemple avec restore_exception_handler()
<?php
function exception_handler_1(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
function exception_handler_2(Exception $e)
{
echo '[' . __FUNCTION__ . '] ' . $e->getMessage();
}
set_exception_handler('exception_handler_1');
set_exception_handler('exception_handler_2');
restore_exception_handler();
throw new Exception('Ceci utilise le premier gestionnaire d\'exception...');
?>
L'exemple ci-dessus va afficher :
[exception_handler_1] Ceci utilise le premier gestionnaire d'exception...
(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Spécifie une fonction utilisateur comme gestionnaire d'erreurs
set_error_handler() choisit la fonction utilisateur error_handler pour gérer les erreurs dans un script.
set_error_handler() peut être utilisé pour définir votre propre manière de gérer les erreurs durant l'exécution, par exemple pour une application dans laquelle vous devez nettoyer les données/fichiers lorsqu'une erreur survient ou lorsque vous devez déclencher une erreur sous certaines conditions (en utilisant trigger_error()).
Il faut se rappeler que la fonction standard de traitement des erreurs de PHP est alors complètement ignorée. error_reporting() n'aura plus d'effet, et votre fonction de gestion des erreurs sera toujours appelée. Vous pourrez toujours lire la valeur de l'erreur courante de error_reporting et faire réagir la fonction de gestion des erreurs en fonction. Cette remarque est notamment valable si la commande a été préfixée par @.
Notez aussi qu'il est alors confié à cette fonction de terminer le script (die()) si nécessaire. Si la fonction de gestion des erreurs se termine normalement, l'exécution du script se poursuivra avec l'exécution de la prochaine commande.
Les types d'erreur suivants ne peuvent pas être gérés avec cette fonction : E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING ainsi que la plupart des E_STRICT d'un fichier lorsque set_error_handler() est appelé.
Si une erreur survient avant que le script ne soit exécuté (par exemple un téléchargement de fichier), le gestionnaire d'erreurs personnalisé ne pourra pas être appelé, car il n'est pas encore enregistré.
La fonction utilisateur doit accepter deux paramètres : le code d'erreur et une chaîne décrivant le code d'erreur. Depuis, trois paramètres optionnels sont fournis en même temps : le fichier dans lequel l'erreur est survenue, la ligne à laquelle l'erreur est survenue, et le contexte dans lequel l'erreu est survenue (un tableau contenant la liste des symboles lors de l'erreur). La fonction peut être décrite comme ceci :
Si la fonction retourne FALSE, alors le gestion d'erreurs normal continue.
Sert de masque pour appeler la fonction error_handler de la même façon que l'option de configuration error_reporting contrôle les erreurs qui sont affichées. Sans le masque, error_handler sera appelé pour toutes les erreurs, quelque soit la valeur de error_reporting.
Retourne une chaîne contenant le dernier gestionnaire d'erreurs (s'il existe). Si le gestionnaire d'erreurs natif est utilisé, NULL est retourné. NULL est également retourné dans le cas d'une erreur, comme une fonction de rappel incorrecte. Si le gestionnaire d'erreurs précédent est une méthode d'une classe, cette fonction retournera un tableau indexé de la classe et du nom de la méthode.
| Version | Description |
|---|---|
| 5.2.0 | Le gestionnaire d'erreurs doit retourner FALSE pour peupler la variable $php_errormsg. |
| 5.0.0 | Le paramètre error_types a été introduit. |
| 4.3.0 | Au lieu d'un nom de fonction, un tableau contenant une référence à un objet ainsi qu'un nom de méthode peut aussi être passé au paramètre error_handler . |
| 4.0.2 | Trois paramètres optionnels pour le paramètre error_handler de la fonction utilisateur ont été introduits. C'est le nom du fichier, le numéro de ligne ainsi que le contexte. |
Exemple #1 Gestionnaire d'erreurs avec set_error_handler() et trigger_error()
L'exemple ci-dessous illustre l'interception d'erreurs internes avec génération d'erreur et son exploitation dans une fonction utilisateur :
<?php
// Gestionnaire d'erreurs
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
case E_USER_ERROR:
echo "<b>Mon ERREUR</b> [$errno] $errstr<br />\n";
echo " Erreur fatale sur la ligne $errline dans le fichier $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Arrêt...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>Mon ALERTE</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Mon AVERTISSEMENT</b> [$errno] $errstr<br />\n";
break;
default:
echo "Type d'erreur inconnu : [$errno] $errstr<br />\n";
break;
}
/* Ne pas exécuter le gestionnaire interne de PHP */
return true;
}
// Fonction pour tester la gestion d'erreur
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Type d'entrée incorrect, tableau de valeurs attendu", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("La valeur à la position $pos n'est pas un nombre, utilisation 0 (zéro)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// Configuration du gestionnaire d'erreurs
$old_error_handler = set_error_handler("myErrorHandler");
// Génération de quelques erreurs. Commençons par créer un tableau
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// Générons maintenant un second tableau
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Valeur à la position $pos n'est pas un nombre, utilisation de 0 (zéro) */
$b = scale_by_log($a, M_PI);
print_r($b);
// Ceci est un problème, nous avons utilisé une chaîne au lieu d'un tableau
echo "----\nvector c - a warning\n";
/* Type d'entrée incorrect, tableau de valeurs attendu */
$c = scale_by_log("non un tablau", 2.3);
var_dump($c); // NULL
// Ceci est une erreur critique : le logarithme de zéro ou d'un nombre négatif est indéfini
echo "----\nvector d - fatal error\n";
/* log(x) pour x <= 0 est indéfini, vous utilisez : scale = $scale" */
$d = scale_by_log($a, -2.5);
var_dump($d); // Jamais atteint
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
<b>Mon AVERTISSEMENT</b> [1024] La valeur à la position 2 n'est pas un nombre, utilisation de 0 (zéro)<br />
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an warning
<b>Mon ALERTE</b> [512] Entrée incorrect, tableau de valeurs attendu<br />
NULL
----
vector d - fatal error
<b>Mon ERREUR</b> [256] log(x) for x <= 0 est indéfini, vous utilisez : scale = -2.5<br />
Erreur fatale sur la ligne 36 dans le fichier trigger_error.php, PHP 4.0.2 (Linux)<br />
Abandon...<br />
(PHP 5)
set_exception_handler — Définit une fonction utilisateur de gestion d'exceptions
set_exception_handler() définit le gestionnaire d'exceptions par défaut si une exception n'est pas attrapée avec un bloc d'essai/d'attrape. L'exécution sera stoppé après l'appel à la fonction exception_handler .
Nom de la fonction à appeler lorsqu'une exception qui n'a pu être attrapée survient. Cette fonction doit être définie avant l'appel de la fonction set_exception_handler(). Ce gestionnaire de fonction doit accepter un paramètre qui sera l'objet représentant l'exception qui vient d'être lancée.
Retourne le nom du gestionnaire précédemment défini ou NULL en cas d'erreur. Si aucun gestionnaire n'a été précédemment défini, NULL est également retournée.
Exemple #1 Exemple avec set_exception_handler()
<?php
function exception_handler($exception) {
echo "Exception non attrapée : " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Non exécuté\n";
?>
(PHP 4 >= 4.0.1, PHP 5)
trigger_error — Déclenche une erreur utilisateur
trigger_error() est utilisé pour déclencher une erreur utilisateur. Elle peut aussi être utilisée en conjonction avec un gestionnaire d'erreurs interne, ou un gestionnaire d'erreurs utilisateur qui a été choisi comme gestionnaire d'erreurs avec set_error_handler().
trigger_error() est pratique lorsque vous devez générer une réponse particulière lors de l'exécution.
Le message d'erreur désigné pour cette erreur. Il est limité en longueur à 1024 caractères. Tous caractères après les 1024 seront ignorés.
Le type d'erreur désigné pour cette erreur. Cela ne fonctionne qu'avec la famille de constantes E_USER et sera par défaut E_USER_NOTICE.
Cette fonction retourne FALSE si un paramètre incorrect est passé à error_type , TRUE sinon.
Exemple #1 Exemple avec trigger_error()
Voir set_error_handler() pour un exemple plus conséquent.
<?php
if (assert($divisor == 0)) {
trigger_error("Impossible de diviser par zéro", E_USER_ERROR);
}
?>
L'extension htscanner donne la possibilité d'accéder à des fichiers au format .htaccess pour configurer PHP, dossier par dossier, comme c'est possible avec Apache. Cela est particulièrement utile avec fastcgi (ISS5/6/7, lighttpd, etc.).
PHP version 5.2.0 ou plus récent.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/htscanner
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| htscanner.config_file | ".htscanner" | PHP_INI_SYSTEM | |
| htscanner.default_docroot | "/" | PHP_INI_SYSTEM | |
| htscanner.default_ttl | "300" | PHP_INI_SYSTEM | |
| htscanner."stop_on_error" | "Off" | PHP_INI_SYSTEM |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Nom du fichier qui contient les configurations.
Racine Web par défaut.
Durée de vie des documents mis en cache, exprimé en secondes.
Arrêt sur erreur (erreur d'analyse, ou d'affectation d'une directive INI).
Cette extension ne définit aucune ressource.
Note les inclusions, et produire une arborescence d'inclusions et d'héritage de classes à la volée.
Les fichiers peuvent avoir été inclus avec les fonctions include(), include_once(), require() ou require_once().
Les héritages de classes sont aussi rapportés.
PHP version 5.1.0 ou plus récente.
Le fichier inclus gengraph.php utilise la bibliothèque » graphviz, mais elle n'est pas obligatoire.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/inclued
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| inclued.enabled | Off | PHP_INI_* | |
| inclued.dumpdir | Off | PHP_INI_* |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Si oui ou non, inclued est activée.
Chemin du dossier qui stocke les fichiers inclued. Si configuré, chaque requête PHP va créer un fichier dans ce dossier.
Comme chaque requête crée un fichier, ce dossier risque de se remplir très très vite!
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Cette extension ne définit aucune constante.
Cet exemple montre comment implémenter inclued dans une explication existante, et afficher les résultats.
Exemple #1 Lecture des informations depuis inclued
<?php
// Fichier de stockage des informations d'inclusion
$fp = fopen('/tmp/wp.json', 'w');
if ($fp) {
$clue = inclued_get_data();
if ($clue) {
fwrite($fp, json_encode($clue));
}
fclose($fp);
}
?>
Maintenant que nous avons des données, il est temps de prendre du recul et d'avoir un graphique. L'extension inclued inclut un fichier PHP appelé gengraph.php qui crée un fichier DOT, qui peut être passé à la bibliothèque » graphviz. Cependant, cette approche n'est pas obligatoire.
Exemple #2 Exemple d'utilisation de gengraph.php
Cet exemple crée une image appelée inclued.png qui montre les fichiers inclus.
# First, create the dot file $ php graphviz.php -i /tmp/wp.json -o wp.dot # Next, create the image $ dot -Tpng -o inclued.png wp.dot
(PECL inclued >= 0.1.0)
inclued_get_data — Get the inclued data
Lit les données incluses.
Cette fonction ne contient aucun paramètre.
Les données incluses.
Exemple #1 Exemple avec inclued_get_data()
Voyez les exemples avec inclued pour une méthode de représentation de ces données.
<?php
include 'x.php';
$clue = inclued_get_data();
print_r($clue);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[includes] => Array
(
[0] => Array
(
[operation] => include
[op_type] => 2
[filename] => x.php
[opened_path] => /tmp/x.php
[fromfile] => /tmp/z.php
[fromline] => 2
)
)
)
Ces fonctions vous donnent accès à de nombreuses informations sur PHP lui-même, comme les configurations d'exécution, les extensions chargées, les versions, etc. Vous trouverez aussi des fonctions pour modifier des options. Ainsi que la star des fonctions PHP phpinfo().
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| assert.active | "1" | PHP_INI_ALL | |
| assert.bail | "0" | PHP_INI_ALL | |
| assert.warning | "1" | PHP_INI_ALL | |
| assert.callback | NULL | PHP_INI_ALL | |
| assert.quiet_eval | "0" | PHP_INI_ALL | |
| enable_dl | "1" | PHP_INI_SYSTEM | Supprimé depuis PHP 6.0.0. |
| max_execution_time | "30" | PHP_INI_ALL | |
| max_input_time | "-1" | PHP_INI_PERDIR | Disponible depuis PHP 4.3.0. |
| max_input_nesting_level | "64" | PHP_INI_PERDIR | Disponible depuis PHP 4.4.8. Supprimé depuis PHP 5.0.0. |
| magic_quotes_gpc | "1" | PHP_INI_PERDIR | PHP_INI_ALL en PHP <= 4.2.3. Supprimé depuis PHP 6.0.0. |
| magic_quotes_runtime | "0" | PHP_INI_ALL | Supprimé depuis PHP 6.0.0. |
| zend.enable_gc | "1" | PHP_INI_ALL | Disponible depuis PHP 5.3.0. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Active les évaluations de type assert().
Termine le script si une assertion échoue.
Émet une alerte PHP pour chaque assertion qui échoue.
Fonction définie par le programmeur, à appeler pour chaque assertion échouée.
Utilise la configuration courante de error_reporting() durant les évaluations d'assertions. Si activée, aucune erreur n'est affichée (error_reporting(0) implicite) durant l'évaluation. Si désactivée, les erreurs sont affichées en fonction de la configuration de error_reporting()
Cette directive est réellement utile lorsque PHP est compilé comme module Apache. Vous pouvez activer le chargement dynamique d'extension avec la fonction PHP dl() au cas par cas, pour chaque serveur virtuel.
La raison principale pour désactiver ce système est la sécurité. Avec le chargement dynamique, il est possible de passer outre les configurations de safe mode et open_basedir. Par défaut, le chargement dynamique est autorisé, sauf avec le safe mode. En safe mode, il est toujours impossible d'utiliser la fonction dl().
Fixe le temps maximal d'exécution d'un script, en secondes. Cela permet d'éviter que des scripts en boucles infinies saturent le serveur. La configuration par défaut est de 30 secondes. Lorsque PHP fonctionne depuis la ligne de commande, la valeur par défaut est 0.
Le temps d'exécution maximum n'est pas affecté par des appels systèmes tels que sleep(). Reportez-vous à la fonction set_time_limit() pour plus de détails.
Vous ne pouvez pas modifier la valeur de cette directive avec ini_set() lorsque PHP est configuré en safe mode. Le seul moyen de le faire est de désactiver le safe mode ou de changer la valeur dans php.ini.
Votre serveur web peut avoir d'autres configurations de la durée limite d'exécution qui peuvent également interrompre PHP. Apache a une directive Timeout et IIS a une fonction CGI pour cela. Par défaut, elles valent toutes les deux 300 secondes. Reportez-vous à la documentation de votre serveur web pour plus de détails.
Cette option spécifie la durée maximale pour analyser les données d'entrée, via POST, GET et téléchargement de fichier.
Définit la profondeur maximale des variables d'entrées (i.e. $_GET, $_POST..)
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
Fixe le mode magic_quotes pour les opérations GPC (Get/Post/Cookie). Lorsque magic_quotes est activé, tous les caractères ' (guillemets simples), " (guillemets doubles), \ (antislash) et NUL sont échappés avec un antislash.
Note: En PHP 4, la variable $_ENV est également échappée.
Note: Si la directive magic_quotes_sybase est aussi activée, elle écrasera magic_quotes_gpc. Avec les deux directives activées, seuls les guillemets simples seront protégés avec un autre guillemet simple (''). Les guillemets doubles, les antislashs et les NUL ne seront pas protégés.
Voir aussi get_magic_quotes_gpc().
Cette fonctionnalité est OBSOLETE depuis PHP 5.3.0 et a été SUPPRIMEE depuis PHP 6.0.0. Nous vous encourageons vivement à ne plus l'utiliser.
Si magic_quotes_runtime est activé, toutes les fonctions qui obtiennent des données auprès d'une source externe, y compris les bases de données et les fichiers texte, verront leur guillemets échappés avec un antislash. Si magic_quotes_sybase est aussi activé, les guillemets simples seront échappés avec un autre guillemet simple, plutôt qu'un antislash.
Active ou désactive la collecte des références circulaires.
Cette extension ne définit aucune ressource.
Les constantes listées ici sont toujours disponibles dans PHP.
| Constante | Valeur | Description |
|---|---|---|
| CREDITS_GROUP | 1 | Une liste des développeurs principaux |
| CREDITS_GENERAL | 2 | Crédits généraux. Design du langage, concepts, auteurs de PHP et module SAPI. |
| CREDITS_SAPI | 4 | Une liste des API de serveurs, et leurs auteurs. |
| CREDITS_MODULES | 8 | Une liste des extensions de PHP, et leurs auteurs |
| CREDITS_DOCS | 16 | Les crédits de l'équipe de documentation |
| CREDITS_FULLPAGE | 32 | Généralement utilisé combiné avec d'autres options. Cette option indique qu'une page HTML complète doit être générée. |
| CREDITS_QA | 64 | Les crédits pour le groupe d'assurance qualité. |
| CREDITS_ALL | -1 | Tous les crédits. C'est l'équivalent de : CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_QA CREDITS_FULLPAGE. Elle génère une page HTML complète et autonome. C'est la valeur par défaut. |
| Constante | Valeur | Description |
|---|---|---|
| INFO_GENERAL | 1 | La ligne de configuration, le chemin du php.ini, la date de compilation, le système et plus encore. |
| INFO_CREDITS | 2 | Crédits de PHP. Voir aussi phpcredits(). |
| INFO_CONFIGURATION | 4 | Valeurs locales et serveurs des directives PHP. Voir aussi ini_get(). |
| INFO_MODULES | 8 | Les modules chargés et leurs configurations respectives. |
| INFO_ENVIRONMENT | 16 | Les variables d'environnement, qui sont aussi disponibles dans $_ENV. |
| INFO_VARIABLES | 32 | Toutes les variables prédéfinies : EGPCS (Environnement, GET, POST, Cookie, Server). |
| INFO_LICENSE | 64 | La licence PHP. Voir aussi la » FAQ de la licence. |
| INFO_ALL | -1 | Affiche toutes les valeurs citées ci-dessus. C'est la valeur par défaut. |
Les constantes d'assertions servent avec la fonction assert_options().
| Constante | Directive de configuration | Description |
|---|---|---|
| ASSERT_ACTIVE | assert.active | Active l'évaluation assert(). |
| ASSERT_CALLBACK | assert.callback | Fonction de rappel des assertions échouées. |
| ASSERT_BAIL | assert.bail | Termine l'exécution des assertions échouées. |
| ASSERT_WARNING | assert.warning | Émet une alerte PHP pour chaque assertion échouée. |
| ASSERT_QUITE_EVAL | assert.quiet_eval | Désactive le error_reporting durant l'évaluation des expressions d'assertion. |
Les constantes suivantes ne sont disponibles que si le système d'hébergement est sur Windows, et peut vous donner des informations sur les versions, qui vous permettront de détecter la présence de fonctionnalités. Elles sont disponibles depuis PHP 5.3.0.
| Constante | Description |
|---|---|
| PHP_WINDOWS_VERSION_MAJOR | La version majeure de Windows, qui peut être 4 (NT4/ME/98/95), 5 (XP/2003 R2/2003/2000) ou 6 (Vista/2008). |
| PHP_WINDOWS_VERSION_MINOR | La version mineure de Windows, qui peut être 0 (Vista/2008/2000/NT4/95), 1 (XP), 2 (2003 R2/2003/XP x64), 10 (98) ou 90 (ME). |
| PHP_WINDOWS_VERSION_BUILD | Le numéro de compilation de Windows (par exemple, Windows Vista avec SP1 a le numéro 6001) |
| PHP_WINDOWS_VERSION_PLATFORM | La plate-forme que PHP utilise actuellement : cette valeur peut être 2 sur Windows Vista/XP/2000/NT4, Server 2008/2003 et sur Windows ME/98/95 cette valeur est 1. |
| PHP_WINDOWS_VERSION_SP_MAJOR | La version majeure du paquet de service installé : cette valeur vaut 0 si aucun paquet de service n'est disponible. Par exemple, Windows XP avec le paquet de service 3 donne la valeur 3 à cette constante. |
| PHP_WINDOWS_VERSION_SP_MINOR | La version mineur du paquet de service installé. Cette valeur est 0 si aucun paquet de service n'est installé. |
| PHP_WINDOWS_VERSION_SUITEMASK | Le masque est un champ de bits qui permet de connaître la présence de différentes fonctionnalités de Windows. Voyez la table ci-dessous pour connaître les différents champs. |
| PHP_WINDOWS_VERSION_PRODUCTTYPE | Cette constante contient la valeur utilisée pour déterminer la valeur des constantes PHP_WINDOWS_NT_*. Cette valeur peut être l'une des constantes PHP_WINDOWS_NT_*, indiquant le type de plate-forme. |
| PHP_WINDOWS_NT_DOMAIN_CONTROLLER | Le contrôleur de domaine. |
| PHP_WINDOWS_NT_SERVER | Un serveur système (eg. Server 2008/2003/2000). Notez que si c'est un contrôleur de domaine, il est indiqué dans PHP_WINDOWS_NT_DOMAIN_CONTROLLER. |
| PHP_WINDOWS_NT_WORKSTATION | Un poste de travail (eg. Vista/XP/2000/NT4) |
La table ci-desous présente les fonctionnalités qui peuvent être vérifiées dans le champ de bit de la constante PHP_WINDOWS_VERSION_SUITEMASK.
| Bits | Description |
|---|---|
| 0x00000004 | Les composants Microsoft BackOffice sont installés. |
| 0x00000400 | Windows Server 2003, Web Edition est installé. |
| 0x00004000 | Windows Server 2003, Compute Cluster Edition est installé. |
| 0x00000080 | Windows Server 2008 Datacenter, Windows Server 2003, Datacenter Edition ou Windows 2000 Datacenter Server est installé. |
| 0x00000002 | Windows Server 2008 Enterprise, Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server, ou Windows NT Server 4.0 Enterprise Edition est installé. |
| 0x00000040 | Windows XP Embedded est installé. |
| 0x00000200 | Windows Vista Home Premium, Windows Vista Home Basic, ou Windows XP Home Edition est installé. |
| 0x00000100 | Remote Desktop est supporté, mais une seule session interactive est supportée. Cette valeur est présente, à moins que le système ne fonctionne en mode serveur d'application. |
| 0x00000001 | Microsoft Small Business Server a été installé sur le système, mais a été mis à joru vers une nouvelle version de Windows. |
| 0x00000020 | Microsoft Small Business Server est installé avec la licence cliente restreinte. |
| 0x00002000 | Windows Storage Server 2003 R2 ou Windows Storage Server 2003 est installé. |
| 0x00000010 | Terminal Services est installé. Cette valeur est toujours activée. Si cette valeur est activée, mais 0x00000100 ne l'est pas, alors le système fonctionne en mode de serveur d'application. |
| 0x00008000 | Windows Home Server est installé. |
(PHP 4, PHP 5)
assert_options — Fixe et lit différentes options d'assertions
assert_options() permet de modifier les diverses options de la fonction assert(), ou simplement connaître la configuration actuelle.
| Option | Directive | Valeur par défaut | Description |
|---|---|---|---|
| ASSERT_ACTIVE | assert.active | 1 | Active l'évaluation de la fonction assert() |
| ASSERT_WARNING | assert.warning | 1 | Génère une alerte PHP pour chaque assertion fausse |
| ASSERT_BAIL | assert.bail | 0 | Termine l'exécution en cas d'assertion fausse |
| ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | Désactive le rapport d'erreur durant l'évaluation d'une assertion |
| ASSERT_CALLBACK | assert.callback | (NULL) | Fonction de rappel utilisateur, pour le traitement des assertions fausses |
Une nouvelle valeur, optionnelle, pour l'option.
Retourne la valeur originale de l'option, ou bien FALSE en cas d'erreur.
Exemple #1 Exemple avec assert_options()
<?php
// Ceci est notre fonction pour gérer les
// erreurs d'assertion
function assert_failure()
{
echo 'Échec de l\'assertion';
}
// Ceci est notre fonction de test
function test_assert($parameter)
{
assert(is_bool($parameter));
}
// Définit nos options d'assertion
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, 'assert_failure');
// Une assertion qui doit échouée
test_assert(1);
// Ceci n'est jamais atteint, car ASSERT_BAIL
// vaut true
echo 'Jamais atteint';
?>
(PHP 4, PHP 5)
assert — Vérifie si une assertion est fausse
assert() va vérifier l'assertion assertion et prendre la mesure appropriée si le résultat est FALSE.
Si assertion est donnée sous la forme d'une chaîne, elle sera évaluée comme un code PHP par la fonction assert(). Les avantages de ce type d'assertion sont d'être moins lourd si la vérification d'assertion est désactivée, et les messages contenant l'assertion lorsque l'assertion échoue. Cela signifie que si vous passez une condition booléenne en tant qu'assertion, cette condition ne sera pas considérée comme un paramètre par la fonction d'assertion que vous avez définie avec la fonction assert_options(), la condition est convertie en chaîne de caractères avant l'appel à ce gestionnaire de fonction, et le booléen FALSE sera converti en chaîne de caractères vide.
Il est recommandé de n'utiliser les assertions que comme outil de déboguage. Vous pouvez les utiliser pour les vérifications d'usage : ces conditions doivent normalement être vraies, et indiquer une erreur de programmation si ce n'est pas le cas. Vous pouvez aussi vérifier la présence de certaines extensions ou limitations du système.
Les assertions ne doivent pas être utilisées pour faire des opérations de vérifications en production, comme des vérifications de valeur d'argument. En conditions normales, votre code doit être en état de fonctionner si la vérification d'assertion est désactivée.
Le comportement de assert() peut être configuré par assert_options() ou par les directives de configuration décrites dans la page de manuel de cette fonction.
La fonction assert_options() et la directive ASSERT_CALLBACK permettent de configurer une fonction qui sera appelée lorsque l'assertion échoue.
Les fonctions de rappel pour assert() sont particulièrement utiles pour bâtir des suites de tests automatiques, car elles vous permettent de capturer facilement le code passé à l'assertion, ainsi que des informations sur le lieu et le moment de l'assertion. Même si ces informations peuvent être appelées par d'autres méthodes, les assertions sont plus rapides et plus faciles.
La fonction de rappel doit accepter trois arguments. Le premier contient le nom du fichier qui a vu l'assertion échouer. Le second contient le numéro de ligne dans le fichier précédent. Le troisième argument contient l'expression qui a échoué (s'il y en a : les valeurs littérales comme 1 ou "deux" ne seront pas passées par cet argument).
L'assertion.
FALSE si l'assertion est fausse, TRUE sinon.
Exemple #1 Gestion des assertions avec un gestionnaire personnalisé
<?php
// Activation des assertions et mise en mode discret
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Création d'un gestionnaire d'assertions
function my_assert_handler($file, $line, $code)
{
echo "<hr>Échec de l'assertion :
File '$file'<br />
Line '$line'<br />
Code '$code'<br /><hr />";
}
// Configuration de la méthode de callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Utilisation d'une assertion qui va échouer
assert('mysql_query("")');
?>
(PHP 4, PHP 5)
dl — Charge une extension PHP à la volée
Charge l'extension PHP library à la volée.
Utilisez la fonction extension_loaded() pour vérifier qu'une extension est chargée ou non. Cette fonction travaille aussi bien avec les extensions natives qu'avec les extensions dynamiquement chargées (via le php.ini ou dl()).
Ce paramètre est seulement le nom de fichier de l'extension, qui dépend de votre plate-forme. Par exemple l'extension sockets (si compilée comme module partagé, et non par défaut), sera appelée sockets.so sous Unix, et php_sockets.dll sous Windows.
Le dossier à partir duquel sont chargées vos extensions dépend de votre plate-forme :
Windows - S'il n'est pas explicitement indiqué dans le fichier php.ini, le dossier des extensions est c:\php4\extensions\.
Unix - S'il n'est pas explicitement indiqué dans le fichier php.ini, le dossier des extensions dépend de
En prenant ces paramètres en considération, le dossier des extensions vaut alors <install-dir>/lib/php/extensions/ <debug-or-not>-<zts-or-not>-ZEND_MODULE_API_NO, e.g. /usr/local/php/lib/php/extensions/debug-non-zts-20010901 ou /usr/local/php/lib/php/extensions/no-debug-zts-20010901.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.. Si la fonctionnalité de chargement de module n'est pas disponible (voir Note), ou a été désactivée (soit en désactivant la directive enable_dl ou en activant le safe mode dans le php.ini) une E_ERROR sera émise et l'exécution du script sera stoppée. Si la fonction dl() échoue parce que la bibliothèque n'a pu être trouvée, dl() retournera FALSE et émettra un message d'alerte E_WARNING.
Exemple #1 Exemples avec dl()
<?php
// Chargement pour toutes plates-formes
if (!extension_loaded('sqlite')) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
dl('php_sqlite.dll');
} else {
dl('sqlite.so');
}
}
// Mais la constante PHP_SHLIB_SUFFIX est disponible depuis PHP 4.3.0
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
?>
| Version | Description |
|---|---|
| 5.3.0 | Cette fonction lance maintenant une alerte de type E_DEPRECATED pour tous les SAPI, sauf CLI, CGI et interne. |
Note: dl() n'est pas supportée sur les serveur web multithreadés. Utilisez la directive extensions dans votre fichier php.ini lorsque vous vous trouvez dans un environnement de ce type. Cependant, les versions CGI et CLI ne sont pas affectées !
Note: Depuis PHP 5, la fonction dl() est obsolète dans tous les SAPI, excepté CLI. Utilisez les directives d'extensions de chargement à la place.
Note: Depuis PHP 6, cette fonction est désactivée pour toutes les SAPI, exceptées CLI, CGI et embarquée.
Note: dl() est sensible à la casse sur les plates-formes Unix.
Note: Cette fonction est désactivée par le safe-mode
(PHP 4, PHP 5)
extension_loaded — Détermine si une extension est chargée ou non
Détermine si une extension est chargée ou non.
Le nom de l'extension.
Vous pouvez connaître le nom des différentes extensions PHP en utilisant la fonction phpinfo() ou bien si vous utilisez la version CGI ou CLI de PHP, vous pouvez utiliser l'option de ligne de commande -m pour afficher toutes les extensions disponibles :
$ php -m [PHP Modules] xml tokenizer standard sockets session posix pcre overload mysql mbstring ctype [Zend Modules]
Retourne TRUE si l'extension name a été chargée, FALSE sinon.
Exemple #1 Exemple avec extension_loaded()
<?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>
Note: extension_loaded() utilise le nom interne de l'extension pour vérifier si une extension est disponible ou pas. La plupart des extensions ont des noms internes écrits en minuscules, mais il peut arriver que certaines aient des noms en majuscules. Soyez donc prévenus que la comparaison effectuée par cette fonction est sensible à la casse !
(PHP 5 >= 5.3.0)
gc_collect_cycles — Force le passage du collecteur de mémoire
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Force le passage du collecteur de mémoire.
Cette fonction ne contient aucun paramètre.
Retourne le nombre de cycles collectés.
(PHP 5 >= 5.3.0)
gc_disable — Désactive le collecteur de références circulaires
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Désactive le collecteur de références circulaires.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PHP 5 >= 5.3.0)
gc_enable — Active le collecteur de références circulaires
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Active le collecteur de références circulaires.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
(PHP 5 >= 5.3.0)
gc_enabled — Retourne le statut du collecteur de références circulaires
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Retourne le statut du collecteur de références circulaires.
Cette fonction ne contient aucun paramètre.
Retourne TRUE so le collecteur est actif, et FALSE sinon.
(PHP 4, PHP 5)
get_cfg_var — Retourne la valeur d'une option de PHP
Retourne la valeur de l'option option de configuration PHP.
get_cfg_var() ne retourne pas les options qui ont été choisies lors de la compilation de PHP, ni ne lit dans le fichier de configuration d'Apache.
Pour vérifier si le système utilise le fichier de configuration, essayez de lire la valeur de cfg_file_path. Si cette valeur est disponible, alors le fichier de configuration est utilisé.
Le nom de l'option de configuration.
Retourne la valeur courante de l'option PHP option ou bien FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | get_cfg_var() a été modifié afin de permettre de retourner un tableau de directives. |
(PHP 4, PHP 5)
get_current_user — Retourne le nom du possesseur du script courant
Retourne le nom du possesseur du script courant.
Retourne le nom de l'utilisateur, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec get_current_user()
<?php
echo 'Propriétaire du script courant : ' . get_current_user();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Propriétaire du script courant : SYSTEM
(PHP 4 >= 4.1.0, PHP 5)
get_defined_constants — Retourne la liste des constantes et leurs valeurs
Retourne les noms et valeurs des constantes déjà définies. Cela inclut les constantes créées par les extensions, et celles créées avec la fonction define().
Permet à cette fonction de retourner un tableau multidimensionnel avec les catégories en tant que clés de la première dimension et les constantes ainsi que leurs valeurs dans la seconde dimension.
<?php
define("MY_CONSTANT", 1);
print_r(get_defined_constants(true));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[internal] => Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
[pcre] => Array
(
[PREG_PATTERN_ORDER] => 1
[PREG_SET_ORDER] => 2
[PREG_OFFSET_CAPTURE] => 256
[PREG_SPLIT_NO_EMPTY] => 1
[PREG_SPLIT_DELIM_CAPTURE] => 2
[PREG_SPLIT_OFFSET_CAPTURE] => 4
[PREG_GREP_INVERT] => 1
)
[user] => Array
(
[MY_CONSTANT] => 1
)
)
| Version | Description |
|---|---|
| 5.0.0 | Le paramètre categorize a été ajouté. |
Exemple #1 Exemple avec get_defined_constants()
<?php
print_r(get_defined_constants());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[E_PARSE] => 4
[E_NOTICE] => 8
[E_CORE_ERROR] => 16
[E_CORE_WARNING] => 32
[E_COMPILE_ERROR] => 64
[E_COMPILE_WARNING] => 128
[E_USER_ERROR] => 256
[E_USER_WARNING] => 512
[E_USER_NOTICE] => 1024
[E_ALL] => 2047
[TRUE] => 1
)
(PHP 4, PHP 5)
get_extension_funcs — Liste les fonctions d'une extension
Retourne le nom des fonctions définies dans le module module_name .
Le nom du module.
Note: Ce paramètre doit être en minuscule.
Retourne un tableau contenant toutes les fonctions, ou FALSE si module_name n'est pas une extension valide.
Exemple #1 Affiche toutes les fonctions XML
<?php
print_r(get_extension_funcs("xml"));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => xml_parser_create
[1] => xml_parser_create_ns
[2] => xml_set_object
[3] => xml_set_element_handler
[4] => xml_set_character_data_handler
[5] => xml_set_processing_instruction_handler
[6] => xml_set_default_handler
[7] => xml_set_unparsed_entity_decl_handler
[8] => xml_set_notation_decl_handler
[9] => xml_set_external_entity_ref_handler
[10] => xml_set_start_namespace_decl_handler
[11] => xml_set_end_namespace_decl_handler
[12] => xml_parse
[13] => xml_parse_into_struct
[14] => xml_get_error_code
[15] => xml_error_string
[16] => xml_get_current_line_number
[17] => xml_get_current_column_number
[18] => xml_get_current_byte_index
[19] => xml_parser_free
[20] => xml_parser_set_option
[21] => xml_parser_get_option
[22] => utf8_encode
[23] => utf8_decode
)
(PHP 4 >= 4.3.0, PHP 5)
get_include_path — Lit la valeur de la directive de configuration include_path
Lit la valeur de la directive de configuration include_path.
Retourne le chemin, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec get_include_path()
<?php
// Fonctionne depuis PHP 4.3.0
echo get_include_path();
// Fonctionne sur toutes les versions
echo ini_get('include_path');
?>
(PHP 4, PHP 5)
get_included_files — Retourne un tableau avec les noms des fichiers qui sont inclus dans un script
Retourne un tableau contenant les noms de tous les fichiers qui ont été ajoutés au script avec les fonctions require_once(), include_once(), require() ou include().
Retourne un tableau contenant les noms de tous les fichiers.
Le script en cours est considéré comme fichier inclus, il sera donc listé avec les autres fichiers.
Les fichiers inclus ou requis plusieurs fois ne s'affichent qu'une fois dans le tableau retourné.
| Version | Description |
|---|---|
| 4.0.1 | En PHP 4.0.1 et inférieure, cette fonction supposait que les fichiers requis utilisait l'extension .php ; les autres extensions ne fonctionnaient pas. Par ailleurs, dans cette version, le tableau retourné par la fonction get_included_files() était un tableau associatif et ne reprenait que les fichiers ajoutés avec include() et include_once(). |
Exemple #1 Exemple avec get_included_files()
<?php
// Ce fichier est abc.php
include 'test1.php';
include_once 'test2.php';
require 'test3.php';
require_once 'test4.php';
$included_files = get_included_files();
foreach ($included_files as $filename) {
echo "$filename\n";
}
?>
L'exemple ci-dessus va afficher :
abc.php test1.php test2.php test3.php test4.php
Note: Les fichiers inclus en utilisant la directive de configuration auto_prepend_file ne sont pas listés.
(PHP 4, PHP 5)
get_loaded_extensions — Retourne la liste de tous les modules compilés et chargés
Retourne un tableau contenant les noms de tous les modules compilés et chargés par l'application PHP courante.
Retourne zend_extensions ou pas, par défaut, vaut FALSE (ne liste pas zend_extensions).
Retourne un tableau indexé des noms de tous les modules.
| Version | Description |
|---|---|
| 5.2.4 | Le paramètre optionnel zend_extensions a été ajouté |
Exemple #1 Exemple avec get_loaded_extensions()
<?php
print_r(get_loaded_extensions());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array ( [0] => xml [1] => wddx [2] => standard [3] => session [4] => posix [5] => pgsql [6] => pcre [7] => gd [8] => ftp [9] => db [10] => calendar [11] => bcmath )
(PHP 4, PHP 5)
get_magic_quotes_gpc — Retourne la configuration actuelle de l'option magic_quotes_gpc
Retourne la configuration actuelle de l'option magic_quotes_gpc
Gardez en tête que la configuration de magic_quotes_gpc ne fonctionnera pas durant l'exécution du script.
Pour plus d'informations sur magic_quotes, voir la section sur les guillemets magiques.
Retourne 0 si l'option est désactivée, 1 sinon.
Exemple #1 Exemple avec get_magic_quotes_gpc()
<?php
echo get_magic_quotes_gpc(); // 1
echo $_POST['lastname']; // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>
Note: Si la directive magic_quotes_sybase est activée, elle remplacera complètement magic_quotes_gpc. Ce qui fait que même si get_magic_quotes() retourne TRUE les guillemets doubles, les antislashs ou les caractères NULL ne seront pas protégés. Seul les guillemets simples le seront. Dans ce cas, ils ressembleront à ''.
(PHP 4, PHP 5)
get_magic_quotes_runtime — Retourne la configuration actuelle de l'option magic_quotes_runtime
Retourne la configuration actuelle de l'option magic_quotes_runtime.
Retourne 0 si l'option est désactivée, 1 sinon.
Exemple #1 Exemple avec get_magic_quotes_runtime()
<?php
// Vérifie si magic_quotes_runtime est activé
if(get_magic_quotes_runtime())
{
// Désactivation
set_magic_quotes_runtime(false);
}
?>
(PHP 4, PHP 5)
getenv — Retourne la valeur d'une variable d'environnement
Retourne la valeur d'une variable d'environnement.
Vous pouvez voir une liste complète des variables d'environnement en utilisant la fonction phpinfo(). Vous pouvez trouver la signification de chacune d'entre elles en consultant le site concernant » "CGI specification" (en anglais), et particulièrement la page concernant les » variables d'environnement.
Le nom de la variable.
Retourne la valeur de la variable d'environnement varname , ou FALSE en cas d'erreur.
Exemple #1 Exemple avec getenv()
<?php
// Exemple d'utilisation de getenv()
$ip = getenv('REMOTE_ADDR');
// Ou utilisez simplement une Superglobale ($_SERVER ou $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];
?>
(PHP 4, PHP 5)
getlastmod — Retourne la date de dernière modification de la page
Retourne la date de dernière modification de la page.
Si vous voulez récupérer la date de la dernière modification d'un fichier différent, utilisez la fonction filemtime().
Retourne la date de dernière modification de la page. La valeur retournée est un timestamp UNIX, utilisable comme paramètre avec la fonction date(). Retourne FALSE si une erreur survient.
Exemple #1 Exemple avec getlastmod()
<?php
// affiche par exemple 'Dernière modification: April 20 2004 20:43:59.'
echo "Dernière modification : " . date ("F d Y H:i:s.", getlastmod());
?>
(PHP 4 >= 4.1.0, PHP 5)
getmygid — Retourne le GID du propriétaire du script
Retourne le GID du propriétaire du script.
Retourne le GID du propriétaire du script courant, ou FALSE si une erreur survient.
(PHP 4, PHP 5)
getmyinode — Retourne l'inode du script
Retourne l'inode du script courant.
Retourne l'inode du script courant, sous la forme d'un entier, ou FALSE si une erreur survient.
(PHP 4, PHP 5)
getmypid — Retourne le numéro de processus courant de PHP
Retourne le numéro de processus courant de PHP.
Retourne le numéro de processus courant de PHP, ou FALSE si une erreur survient.
Les identifiants de processus ne sont pas uniques, et forment une source d'entropie faible. Nous recommandons de ne pas utiliser les pid pour assurer la sécurité d'un système.
(PHP 4, PHP 5)
getmyuid — Retourne l'UID du propriétaire du script actuel
Retourne l'UID du propriétaire du script actuel.
Retourne l'identifiant du propriétaire du script actuel (UID) ou FALSE en cas d'erreur.
(PHP 4 >= 4.3.0, PHP 5)
getopt — Lit des options passées dans la ligne de commande
getopt() lit les options passées dans la ligne de commande.
Note: Avant PHP 5.3.0, ce paramètre n'était disponible que sous peu de systèmes.
Le paramètre options peut contenir les éléments suivants :
Les valeurs optionnelles sont les premiers arguments après la chaîne. Peut importe que la valeur soit suivie d'un espace ou non.
Note: Les valeurs optionnelles n'acceptent pas l'espace comme séparateur.
Note: Le format des paramètres options et longopts est identique ; la seule différence est que longopts prend un tableau en option (où chaque élément est une option) alors que options prend une chaîne (où chaque caractère est une option).
Cette fonction retourne un tableau d'options/arguments, ou FALSE si une erreur survient.
| Version | Description |
|---|---|
| 5.3.0 | Ajout du support de "=" comme séparateur argument/valeur. |
| 5.3.0 | Ajout du support des valeurs optionnelles (spécifié par "::"). |
| 5.3.0 | Cette fonction n'est plus dépendante du système et fonctionne maintenant également sous Windows. |
Exemple #1 Exemple avec getopt()
<?php
$options = getopt("f:hp:");
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -fvalue -h affichera :
array(2) {
["f"]=>
string(5) "value"
["h"]=>
bool(false)
}
Exemple #2 Second exemple avec getopt()
<?php
$shortopts = "";
$shortopts .= "f:"; // Valeur requise
$shortopts .= "v::"; // Valeur optionnelle
$shortopts .= "abc"; // Ces options n'acceptent pas de valeur
$longopts = array(
"required:", // Valeur requise
"optional::", // Valeur optionnelle
"option", // Aucune valeur
"opt", // Aucune valeur
);
$options = getopt($shortopts, $longopts);
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -f "value for f" -v -a --required value --optional="optional value" --option affichera :
array(6) {
["f"]=>
string(11) "value for f"
["v"]=>
bool(false)
["a"]=>
bool(false)
["required"]=>
string(5) "value"
["optional"]=>
string(14) "optional value"
["option"]=>
bool(false)
}
Exemple #3 Troisième exemple avec getopt()
Passage de plusieurs options
<?php
$options = getopt("abc");
var_dump($options);
?>
L'exécution du script ci-dessus avec la commande php script.php -aaac affichera :
array(2) {
["a"]=>
array(3) {
[0]=>
bool(false)
[1]=>
bool(false)
[2]=>
bool(false)
}
["c"]=>
bool(false)
}
(PHP 4, PHP 5)
getrusage — Retourne le niveau d'utilisation des ressources
C'est une interface à la fonction système getrusage(2). Elle retourne un tableau associatif contenant les informations renvoyées par cet appel système.
Si who est égal à 1, getrusage() sera appelé avec le paramètre RUSAGE_CHILDREN.
Retourne un tableau associatif contenant les données retournées depuis l'appel système. Toutes les entrées sont accessibles en utilisant leurs noms de champs documentés.
Exemple #1 Exemple avec getrusage()
<?php
$dat = getrusage();
echo $dat["ru_nswap"]; // Taille de la mémoire swap
echo $dat["ru_majflt"]; // Nombre de page mémoires utilisées
echo $dat["ru_utime.tv_sec"]; // Temps utilisateur (en secondes)
echo $dat["ru_utime.tv_usec"]; // Temps utilisateur (en microsecondes)
?>
Note: Cette fonction n'est pas implémentée sous Windows.
(PHP 4 >= 4.2.0, PHP 5)
ini_get_all — Lit toutes les valeurs de configuration
Lit toutes les valeurs de configuration.
Un nom d'extension, optionnel. S'il est défini, la fonction retournera uniquement les options spécifiques à cette extension.
Récupère les détails, ou uniquement la valeur courante de chaque configuration. Par défaut, vaut TRUE (récupère les détails).
Retourne un tableau associatif dont les clés sont les noms des directives.
Lorsque le paramètre details vaut TRUE (défaut), le tableau contiendra les valeurs global_value (définies dans le fichier php.ini), local_value (définie éventuellement avec la fonction ini_set() ou via un .htaccess), et access (le degré d'accès).
Lorsque le paramètre details vaut FALSE, la valeur sera la valeur courant de l'option.
Voir le manuel pour plus d'informations sur la signification du degré d'accès.
Note: Il est possible pour une directive d'avoir plusieurs degrés d'accès, et c'est la raison pour laquelle access montre les valeurs du masque appropriées.
| Version | Description |
|---|---|
| 5.3.0 | Ajout du paramètre details . |
Exemple #1 Exemple avec ini_get_all()
<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
[pcre.recursion_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
)
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 0
[local_value] => 0
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 4
)
...
)
Exemple #2 Désactive le paramètre details
<?php
print_r(ini_get_all("pcre", false)); // Ajouté en PHP 5.3.0
print_r(ini_get_all(null, false)); // Ajouté en PHP 5.3.0
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[pcre.backtrack_limit] => 100000
[pcre.recursion_limit] => 100000
)
Array
(
[allow_call_time_pass_reference] => 0
[allow_url_fopen] => 1
...
)
(PHP 4, PHP 5)
ini_get — Lit la valeur d'une option de configuration
Retourne la valeur de l'option de configuration varname en cas de succès.
Le nom de l'option de configuration.
Retourne la valeur de l'option de configuration varname en cas de succès, ou une chaîne de caractères vide si une erreur survient, ou pour les valeurs NULL.
Exemple #1 Exemples avec ini_get()
<?php
/*
Notre fichier php.ini contient les directives suivantes :
display_errors = On
register_globals = Off
post_max_size = 8M
*/
echo 'display_errors = ' . ini_get('display_errors') . "\n";
echo 'register_globals = ' . ini_get('register_globals') . "\n";
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'post_max_size in bytes = ' . return_bytes(ini_get('post_max_size'));
function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// Le modifieur 'G' est disponible depuis PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
display_errors = 1 register_globals = 0 post_max_size = 8M post_max_size+1 = 9 post_max_size in bytes = 8388608
Note: Lecture de valeurs booléennes
Une directive de configuration ayant la valeur de off sera retourné sous la forme d'une chaîne vide ou "0" alors que la valeur on retournera "-1". Cette fonction peut également retourner la valeur littérale du fichier INI.
Note: Lors de la lecture des tailles de mémoire
Plusieurs directives traitant de taille mémoire, comme upload_max_filesize, sont stockées dans le fichier php.ini avec une notation courte. ini_get() retourne la chaîne exacte stockée dans le fichier php.ini et NON PAS son équivalent entier. Appliquer des opérations arithmétiques classiques sur ces valeurs ne conduira à rien de bon. L'exemple ci-dessous montre une façon de convertir la notation sténographique en octets, de la même façon dont le fait le source PHP.
(PHP 4, PHP 5)
ini_restore — Restaure la valeur de l'option de configuration
Restaure la valeur originale de l'option de configuration varname .
Le nom de l'option de configuration.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec ini_restore()
<?php
$setting = 'y2k_compliance';
echo 'Valeur courante de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_set($setting, ini_get($setting) ? 0 : 1);
echo 'Nouvelle valeur de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_restore($setting);
echo 'Valeur originale de \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
?>
L'exemple ci-dessus va afficher :
Valeur courante de 'y2k_compliance': 1 Nouvelle valeur de 'y2k_compliance': 0 Valeur originale de 'y2k_compliance': 1
(PHP 4, PHP 5)
ini_set — Modifie la valeur d'une option de configuration
Change la valeur de l'option de configuration varname et lui donne celle de newvalue . La valeur de l'option de configuration sera modifiée durant toute l'exécution du script et pour ce script spécifiquement. Elle reprendra sa valeur par défaut dès la fin du script.
Les options disponibles ne peuvent pas toutes être modifiées avec ini_set(). La liste de toutes les options disponibles se trouve dans l'annexe.
La nouvelle valeur pour l'option.
Retourne l'ancien valeur en cas de succès, FALSE si une erreur survient.
Exemple #1 Définit une option de configuration
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', 1);
}
echo ini_get('display_errors');
?>
main — Fausse documentation pour main()
Il n'y a pas de fonction appelée main(), hormis dans les sources PHP. En PHP 4.3.0, un nouveau type de gestion d'erreur a été introduit dans les sources de PHP : php_error_docref. Une des fonctionnalité était de fournir un lien vers la page de manuel de PHP lorsque les directives html_errors (par défaut) et docref_root (par défaut jusqu'en PHP 4.3.2) sont activées.
Certains messages d'erreur faisaient référence à une page de manuel pour la fonction main() alors que cette page n'existe pas. Ajoutez alors un » rapport de bug, en anglais, où vous mentionnez la fonction PHP vous ayant conduite sur cette page. Cette erreur sera corrigée et documentée.
| Nom de la fonction | Ne pointe plus sur cette page depuis la version |
|---|---|
| include() | 5.1.0 |
| include_once() | 5.1.0 |
| require() | 5.1.0 |
| require_once() | 5.1.0 |
(PHP 5 >= 5.2.0)
memory_get_peak_usage — Retourne la quantité de mémoire allouée par PHP
Retourne la quantité de mémoires, en octets, qui peut être allouée à votre script PHP.
Définir à TRUE pour récupérer la taille réelle de la mémoire allouée par le système. Si ce paramètre n'est pas définit ou vaut FALSE, seule la mémoire utilisée par emalloc() sera retournée.
Retourne la quantité de mémoire, en octets.
| Version | Description |
|---|---|
| 5.2.1 | La compilation avec l'option de configuration --enable-memory-limit n'est plus nécessaire pour que cette fonction existe. |
| 5.2.0 | Le paramètre real_usage a été ajouté. |
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage — Indique la quantité de mémoire utilisée par PHP
Retourne la quantité de mémoire allouée à PHP à cet instant.
Définir à TRUE pour récupérer la taille réelle de la mémoire allouée par le système. Si ce paramètre n'est pas définit ou vaut FALSE, seule la mémoire utilisée par emalloc() sera retournée.
Retourne la quantité de mémoire, en octets.
| Version | Description |
|---|---|
| 5.2.1 | La compilation avec l'option de configuration --enable-memory-limit n'est plus nécessaire pour que cette fonction existe. |
| 5.2.0 | Le paramètre real_usage a été ajouté. |
Exemple #1 Exemple avec memory_get_usage()
<?php
// Ceci n'est qu'un exemple. Les chiffres ci-dessous
// différeront suivant les systèmes et les configurations
echo memory_get_usage() . "\n"; // 36640
$a = str_repeat("Hello", 4242);
echo memory_get_usage() . "\n"; // 57960
unset($a);
echo memory_get_usage() . "\n"; // 36744
?>
(PHP 5 >= 5.2.4)
php_ini_loaded_file — Récupère le chemin d'un fichier php.ini chargé
Vérifie si un fichier php.ini est chargé, et récupère son chemin.
Cette fonction ne contient aucun paramètre.
Le chemin du fichier php.ini chargé, ou FALSE si aucun n'a été chargé.
Exemple #1 Exemple avec php_ini_loaded_file()
<?php
$inipath = php_ini_loaded_file();
if ($inipath) {
echo 'php.ini chargé : ' . $inipath;
} else {
echo 'Aucun fichier php.ini n\'a été chargé';
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
php.ini chargé : /usr/local/php/php.ini
(PHP 4 >= 4.3.0, PHP 5)
php_ini_scanned_files — Retourne la liste des fichiers .ini analysés dans les dossiers de configuration supplémentaires
php_ini_scanned_files() retourne une liste de noms de fichiers de configuration analysés, en plus de php.ini. Cette liste est au format CSV. Ces fichiers sont situés dans un dossier défini par l'option --with-config-file-scan-dir, définie au moment de la compilation.
Les fichiers retournés incluent le chemin, comme déclaré dans la directive --with-config-file-scan-dir. De plus, chaque virgule est suivie d'une nouvelle ligne.
Retourne une chaîne de caractères, où les noms de fichiers sont séparés par des virgules. Si --with-config-file-scan-dir n'était pas configuré, FALSE est retourné. Si cette option était configurée, mais que le dossier était vide, une chaîne vide est retournée. Si un fichier n'est pas lisible, le nom du fichier sera inclus dans la liste, mais une erreur sera générée. Cette erreur sera visible au moment de la compilation, et lorsque vous appellerez la fonction php_ini_scanned_files().
Exemple #1 Un exemple de liste retournée par php_ini_scanned_files()
<?php
if ($filelist = php_ini_scanned_files()) {
if (strlen($filelist) > 0) {
$files = explode(',', $filelist);
foreach ($files as $file) {
echo "<li>" . trim($file) . "</li>\n";
}
}
}
?>
(PHP 4, PHP 5)
php_logo_guid — Retourne l'identifiant du logo PHP
Cette fonction retourne l'identifiant qui peut être utilisé pour afficher le logo PHP en utilisant une image incorporée dans les sources. Le logo est affiché uniquement si expose_php vaut On.
Retourne PHPE9568F34-D428-11d2-A769-00AA001ACF42.
Exemple #1 Exemple avec php_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . php_logo_guid() . '" alt="Logo PHP !" />';
?>
(PHP 4 >= 4.0.1, PHP 5)
php_sapi_name — Retourne le type d'interface utilisée entre le serveur web et PHP
Retourne une chaîne en minuscule qui décrit le type d'interface (l'API, SAPI serveur) que PHP utilise. Par exemple, en PHP CLI, cette chaîne sera "cli" tandis qu'avec Apache, elle pourra avoir plusieurs valeurs différentes suivant le SAPI exact utilisé. Les valeurs possibles sont listées ci-dessous.
Retourne le type de l'interface, sous la forme d'une chaîne de caractères en minuscule.
Voici une liste non exhaustive des valeurs possibles : aolserver, apache, apache2filter, apache2handler, caudium, cgi (jusqu'en PHP 5.3), cgi-fcgi, cli, continuity, embed, isapi, litespeed, milter, nsapi, phttpd, pi3web, roxen, thttpd, tux et webjames.
Exemple #1 Exemple avec php_sapi_name()
Cet exemple cherche la sous-chaîne cgi car elle peut également valoir cgi-fcgi.
<?php
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Vous utilisez CGI PHP\n";
} else {
echo "Vous n'utilisez pas CGI PHP\n";
}
?>
Note: Une approche alternative
La constante PHP PHP_SAPI a une valeur identique à php_sapi_name().
Le SAPI défini ne doit pas être ambigu, car par exemple, au lieu de apache, il peut être défini à apache2handler ou apache2filter.
(PHP 4 >= 4.0.2, PHP 5)
php_uname — Retourne les informations sur le système d'exploitation
php_uname() retourne une description sur le système d'exploitation sur lequel tourne PHP. C'est la même chaîne que celle que vous voyez en haut du phpinfo(). Si vous voulez juste savoir le nom du système d'exploitation, utilisez plutôt la constante PHP_OS mais gardez à l'esprit que cette constante contient le nom du système sur lequel PHP a été compilé.
Sur certaines vieilles plate-formes Unix, il n'est pas possible de déterminer les informations courantes de l'OS, auquel cas cette fonction se contente de retourner le nom de l'OS sur lequel PHP a été compilé. Cela n'arrivera que si votre bibliothèque uname() n'existe pas ou ne fonctionne pas.
mode est un seul caractère qui définit quelles seront les informations à retourner :
Retourne la description, sous la forme d'une chaîne de caractères.
Exemple #1 Exemples avec php_uname()
<?php
echo php_uname();
echo PHP_OS;
/* Affichages possibles :
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
Linux
FreeBSD localhost 3.2-RELEASE #15: Mon Dec 17 08:46:02 GMT 2001
FreeBSD
Windows NT XN1 5.1 build 2600
WINNT
*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'Le serveur tourne sous Windows !';
} else {
echo 'Le serveur ne tourne pas sous Windows !';
}
?>
Il existe aussi des constantes PHP pré-définies liées qui peuvent s'avérer utiles, par exemple :
Exemple #2 Exemples avec quelques constantes liées au système
<?php
// *nix
echo DIRECTORY_SEPARATOR; // /
echo PHP_SHLIB_SUFFIX; // so
echo PATH_SEPARATOR; // :
// Win*
echo DIRECTORY_SEPARATOR; // \
echo PHP_SHLIB_SUFFIX; // dll
echo PATH_SEPARATOR; // ;
?>
(PHP 4, PHP 5)
phpcredits — Affiche les crédits de PHP
Affiche la liste des développeurs PHP, des modules, etc. Elle génère le code HTML approprié pour insérer les informations dans une page.
Pour générer une page personnalisée sur les crédits, il faut utiliser le paramètre flag . flag est optionnel, et vaut par défaut CREDITS_ALL.
| Nom | Description |
|---|---|
| CREDITS_ALL | Tous les crédits, équivalent à : CREDITS_DOCS + CREDITS_GENERAL + CREDITS_GROUP + CREDITS_MODULES + CREDITS_FULLPAGE. La fonction génère alors une page HTML complète. |
| CREDITS_DOCS | Les crédits du groupe de documentation |
| CREDITS_FULLPAGE | En général, ce paramètre est utilisé avec d'autres constantes. Il indique que la page ainsi générée doit être une page HTML complète, avec toutes les balises nécessaires. |
| CREDITS_GENERAL | Crédits Généraux : conception et design du langage, auteurs de PHP 4.0, module SAPI. |
| CREDITS_GROUP | Une liste des développeurs principaux |
| CREDITS_MODULES | Une liste des extensions de PHP, et leurs auteurs |
| CREDITS_SAPI | Une liste des API serveur pour PHP et leurs auteurs |
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec phpcredits()
<?php
phpcredits(CREDITS_GENERAL);
?>
Exemple #2 Affiche les développeurs principaux ansi que le groupe de documentation
<?php
phpcredits(CREDITS_GROUP + CREDITS_DOCS + CREDITS_FULLPAGE);
?>
Exemple #3 Affiche tous les crédits
<html>
<head>
<title>Ma page de crédits</title>
</head>
<body>
<?php
// Un peu de votre code
phpcredits(CREDITS_ALL - CREDITS_FULLPAGE);
// Encore un peu de votre code
?>
</body>
</html>
(PHP 4, PHP 5)
phpinfo — Affiche de nombreuses informations sur PHP
Affiche de nombreuses informations sur PHP, concernant sa configuration courante : options de compilation, extensions, version, informations sur le serveur, et l'environnement (lorsqu'il est compilé comme module), environnement PHP, informations sur le système, chemins, valeurs générales et locales de configuration, en-têtes HTTP et la licence PHP.
Comme tous les systèmes sont configurés différemment, phpinfo() sert généralement à vérifier la configuration ainsi que les variables prédéfinies, pour une plate-forme donnée.
phpinfo() est un bon outil de débogage, car il affiche le contenu de toutes les variables EGPCS (Environnement, GET, POST, Cookie, Serveur).
L'affichage peut être personnalisé en utilisant une ou plusieurs des constantes suivantes. Elles sont combinables avec l'opérateur or, et doivent être passées dans le paramètre what . Vous pouvez aussi additionner ces constantes.
| Nom de la constante | Valeur | Description |
|---|---|---|
| INFO_GENERAL | 1 | La ligne de configuration, le chemin du php.ini, la date de compilation, le serveur web, le système, etc. |
| INFO_CREDITS | 2 | Les crédits de PHP. Voir aussi phpcredits(). |
| INFO_CONFIGURATION | 4 | Valeurs courantes locales et générales des directives PHP. Voyez aussi la fonction ini_get(). |
| INFO_MODULES | 8 | Modules chargés et leur configuration spécifique. Voir aussi la fonction get_loaded_extensions(). |
| INFO_ENVIRONMENT | 16 | Informations sur les variables d'environnement, qui sont disponibles dans la variable $_ENV. |
| INFO_VARIABLES | 32 | Affiche toutes les variables prédéfinies, issues de l'environnement, la méthode GET, la méthode POST, les cookies et le serveur. |
| INFO_LICENSE | 64 | La licence PHP. Voir aussi » la FAQ de la licence. |
| INFO_ALL | -1 | Affiche toutes les informations suscitées. C'est la valeur par défaut. |
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
| Version | Description |
|---|---|
| 5.2.2 | L'information "Loaded Configuration File" a été ajoutée, alors qu'avant, seule l'information "Configuration File (php.ini) Path" existée. |
Exemple #1 Exemple avec phpinfo()
<?php
// Affiche toutes les informations, comme le ferait INFO_ALL
phpinfo();
// Affiche uniquement le module d'information.
// phpinfo(8) fournirait les mêmes informations.
phpinfo(INFO_MODULES);
?>
Note: Une partie des informations affichées sont désactivées si la directive expose_php est configurée avec la valeur off. Cela inclus les logos PHP et Zend, ainsi que les crédits.
Note: phpinfo() affiche du texte au lieu de HTML lorsque vous utilisez la version CLI.
(PHP 4, PHP 5)
phpversion — Retourne le numéro de la version courante de PHP
Retourne le numéro de la version courante de PHP.
Un nom d'extension, optionnel.
Si le paramètre optionnel extension est spécifié, la fonction phpversion() retournera la version de cette extension ou FALSE s'il n'y a aucune information sur la version d'associée ou si cette extensions n'est pas disponible.
Exemple #1 Exemple avec phpversion()
<?php
// affiche le numéro de version courante du PHP.
echo "Version PHP courante : " . phpversion();
// affiche e.g. '2.0' ou rien du tout si cette extension n'est pas active
echo phpversion('tidy');
?>
Exemple #2 Exemple avec PHP_VERSION_ID
<?php
// PHP_VERSION_ID est disponible depuis PHP 5.2.7,
// si votre version est antérieure, émulez-le.
if(!defined('PHP_VERSION_ID'))
{
$version = PHP_VERSION;
define('PHP_VERSION_ID', ($version{0} * 10000 + $version{2} * 100 + $version{4}));
}
// PHP_VERSION_ID est défini comme un nombre : plus il est grand, plus
// la version de PHP est récente. Il est défini comme illustré dans
// le code ci-dessous :
//
// $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
//
// Maintenant, avec PHP_VERSION_ID, il est possible de vérifier la disponibilité
// de fonctionnalités de PHP, sans passer par version_compare().
//
// Par exemple, on peut définir les constantes PHP_VERSION_* qui n'étaient pas
// disponibles avant 5.2.7
if(PHP_VERSION_ID < 50207)
{
define('PHP_MAJOR_VERSION', $version{0});
define('PHP_MINOR_VERSION', $version{2});
define('PHP_RELEASE_VERSION', $version{4});
// etc.
}
?>
Note: Cette information est aussi disponible via la constante prédéfinie PHP_VERSION. Plus d'informations sur les versions, avec les constantes PHP_VERSION_*.
(PHP 4, PHP 5)
putenv — Fixe la valeur d'une variable d'environnement
Fixe la valeur d'une variable d'environnement. Cette valeur n'existera que durant la vie du script courant, et l'environnement initial sera restauré lorsque le script sera terminé.
Modifier la valeur de certaines variables système peut être un trou de sécurité considérable. La directive de configuration safe_mode_allowed_env_vars contient une liste de préfixes, séparés par des virgules. Lorsque le Safe Mode est actif, l'utilisateur ne peut que modifier les variables dont le nom commence par les préfixes fournis par cette directive. Par défaut, les utilisateurs ne peuvent modifier que les variables qui commencent par PHP_ (i.e. PHP_FOO=BAR). Note : Si cette directive est vide, PHP autorisera la modification de TOUTES les variables d'environnement !
La directive de configuration safe_mode_protected_env_vars contient une liste de variables d'environnement, séparées par des virgules. Les utilisateurs ne pourront pas modifier ces variables avec la fonction putenv(). Ces variables seront protégées même si safe_mode_allowed_env_vars permet leur modification.
La configuration, comme "FOO=BAR"
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Modification d'une variable d'environnement
<?php
putenv("UNIQID=$uniqid");
?>
Ces directives n'ont d'effets que lorsque le safe-mode est activé !
(PHP 4 >= 4.3.0, PHP 5)
restore_include_path — Restaure la valeur de la directive de configuration include_path
Restaure la valeur de la directive de configuration include_path à sa valeur originale de début de script, telle qu'inscrite dans le php.ini.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec restore_include_path()
<?php
echo get_include_path(); // .:/usr/local/lib/php
set_include_path('/inc');
echo get_include_path(); // /inc
// Fonctionne depuis PHP 4.3.0
restore_include_path();
// Fonctionne sur toutes les versions
ini_restore('include_path');
echo get_include_path(); // .:/usr/local/lib/php
?>
(PHP 4 >= 4.3.0, PHP 5)
set_include_path — Modifie la valeur de la directive de configuration include_path
Modifie la valeur de la directive de configuration include_path, pour la durée du script en cours.
La nouvelle valeur pour la directive de configuration include_path
Retourne l'ancienne valeur de include_path en cas de succès, et FALSE si une erreur survient.
Exemple #1 Exemple avec set_include_path()
<?php
// Fonctionne depuis PHP 4.3.0
set_include_path('/inc');
// Fonctionne sur toutes les versions
ini_set('include_path', '/inc');
?>
Exemple #2 Ajout dans le chemin d'inclusion
En utilisant la constante PATH_SEPARATOR, il est possible d'étendre le chemin d'inclusion au vu du système.
Dans cet exemple, nous ajoutons /usr/lib/pear à la fin de l'actuel include_path.
<?php
$path = '/usr/lib/pear';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>
(PHP 4, PHP 5)
set_magic_quotes_runtime — Active/désactive l'option magic_quotes_runtime
Active/désactive l'option magic_quotes_runtime.
0 l'option est désactivée, 1 l'option est activée.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec set_magic_quotes_runtime()
<?php
// Création d'un pointeur de fichier temporaire
$fp = tmpfile();
// Écriture de quelques données dans ce pointeur
fwrite($fp, '\'PHP\' est un acronyme récursif');
// Sans magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(false);
echo 'Sans magic_quotes_runtime : ' . fread($fp, 64), PHP_EOL;
// Avec magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(true);
echo 'Avec magic_quotes_runtime : ' . fread($fp, 64), PHP_EOL;
// Clean up
fclose($fp);
?>
L'exemple ci-dessus va afficher :
Sans magic_quotes_runtime: 'PHP' est un acronyme récursif Avec magic_quotes_runtime: \'PHP\' est un acronyme récursif
(PHP 4, PHP 5)
set_time_limit — Fixe le temps maximum d'exécution d'un script
Fixe le délai d'expiration d'un script, en secondes. Si cette limite est atteinte, le script s'interrompt, et renvoie une erreur fatale. La valeur par défaut est 30 secondes ou, si c'est le cas, la valeur de la directive max_execution_time définie dans le php.ini.
Lorsqu'elle est appelée, set_time_limit() remet le compteur à zéro. En d'autres termes, si la limite par défaut est à 30 secondes, et qu'après 25 secondes d'exécution du script l'appel set_time_limit(20) est fait, alors le script tournera pendant un total de 45 secondes avant de finir.
Le temps maximal d'exécution, en secondes. S'il vaut 0, aucune limite n'est imposée.
Aucune valeur n'est retournée.
Notez que set_time_limit() n'a pas d'effet lorsque PHP fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de mode, ou de modifier la durée maximale d'exécution dans le php.ini.
Note: La fonction set_time_limit() et la directive de configuration max_execution_time n'affectent que le temps d'exécution du script lui-même. Tout temps passé en dehors du script, comme un appel système utilisant system(), des opérations sur les flux, les requêtes sur base de données, etc. n'est pas pris en compte lors du calcul de la durée maximale d'exécution du script. Ceci est faux sous Windows où le temps mesuré est le temps réel.
(PHP 5 >= 5.2.1)
sys_get_temp_dir — Retourne le chemin du répertoire utilisé pour les fichiers temporaires
Retourne le chemin du répertoire PHP où sont enregistrés les fichiers temporaires par défaut.
Retourne le chemin du répertoire temporaire.
Exemple #1 Exemple avec sys_get_temp_dir()
<?php
// Création d'un fichier temporaire dans le dossier
// des fichiers temporaires, en utilisant la fonction sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'Tux');
echo $temp_file;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
C:\Windows\Temp\TuxA318.tmp
(PHP 4 >= 4.1.0, PHP 5)
version_compare — Compare deux chaînes de version au format des versions PHP
version_compare() compare les deux versions de PHP standardisées. Cette fonction est pratique pour les programmes qui doivent vérifier la version de PHP qui les fait tourner.
version_compare() remplace dans un premier temps _, - et + par un point (.) dans les chaînes de version et insère aussi des points avant et après tout caractère non-numérique pour que, par exemple, '4.3.5RC1' devienne '4.3.5.RC.1'. Ensuite, elle découpe les résultats, similairement à explode('.', $ver). Puis, elle compare les morceaux en allant de gauche à droite. Si une part contient des caractères alphabétiques, ils sont gérés dans l'ordre suivant : dev < alpha = a < beta = b < RC < pl. De cette façon, il est possible de comparer non seulement des versions de différents niveaux, comme '4.1' et '4.1.2', mais aussi des versions de développement à la mode de PHP, à n'importe quel stade.
Premier numéro de version.
Second numéro de version.
Si troisième argument optionnel operator est spécifié, il est possible de tester une relation particulière. Les opérateurs possibles sont : <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne.
Ce paramètre est sensible à la casse, aussi les valeurs doivent être en minuscule.
Par défaut, version_compare() retourne -1 si la première version est inférieure à la seconde, 0 si elles sont égales, et 1 si la seconde est inférieure à la première.
Lorsque l'on utilise le paramètre optionnel operator , la fonction retourne TRUE si la relation est celle spécifiée par l'opérateur, FALSE sinon.
Les exemples ci-dessous utilisent la constante PHP_VERSION, sachant qu'elle contient la valeur de la version PHP utilisée pour exécuter le code.
Exemple #1 Exemple avec version_compare()
<?php
if (version_compare(PHP_VERSION, '6.0.0') === 1) {
echo 'J\'ai au moins la version 6.0.0 de PHP ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.3.0') === 1) {
echo 'J\'ai au moins la version 5.3.0 de PHP ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '>')) {
echo 'J\'utilise PHP 5 ; ma version : ' . PHP_VERSION . "\n";
}
if (version_compare(PHP_VERSION, '5.0.0', '<')) {
echo 'J\'utilise PHP 4 ; ma version : ' . PHP_VERSION . "\n";
}
?>
Note: La constante PHP_VERSION contient la version courante de PHP.
Note: Notez que les versions intermédiaires, comme 5.3.0-dev, sont considérées comme inférieures à leurs versions finales (telle que 5.3.0).
(PHP 4, PHP 5)
zend_logo_guid — Retourne le logo de Zend
zend_logo_guid() retourne l'identifiant pouvant être utilisé pour afficher le logo Zend en utilisant l'image intégrée.
Retourne PHPE9568F35-D428-11d2-A769-00AA001ACF42.
Exemple #1 Exemple avec zend_logo_guid()
<?php
echo '<img src="' . $_SERVER['PHP_SELF'] .
'?=' . zend_logo_guid() . '" alt="Zend Logo !" />';
?>
(PHP 5)
zend_thread_id — Retourne un identifiant unique du thread courant
Cette fonction retourne un identifiant unique pour le thread courant.
Retourne l'identifiant du thread, sous la forme d'un entier.
Exemple #1 Exemple avec zend_thread_id()
<?php
$thread_id = zend_thread_id();
echo 'ID du thread courant : ' . $thread_id;
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
ID du thread courant : 7864
Note: Cette fonction n'est disponible que si PHP a été compilé avec le support ZTS (Zend Thread Safety) et le mode de débogage (--enable-debug).
(PHP 4, PHP 5)
zend_version — Lit la version courante du moteur Zend
Retourne une chaîne contenant le numéro de version du moteur d'analyse Zend actuellement en cours d'utilisation.
Retourne le numéro de la version du moteur Zend, sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec zend_version()
<?php
echo "Version du moteur Zend : " . zend_version();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Version du moteur Zend : 2.2.0
Le but de cette extension est d'identifier les scripts et les fonctions les plus consommateurs de mémoire.
memtrack surveille la consommation de mémoire dans les scripts PHP, et produit un rapport d'alertes lorsque la consommation atteint un certain niveau, défini par l'utilisateur. Ceci est réussi en remplaçant les fonctions standard par une fonction spéciale qui compare l'utilisation de mémoire avant et après le passage par une fonction : de cette manière, on sait de combien la consommation de mémoire a changé.
Le Zend Engine fait fonctionner son exécuteur pour chaque tableau d'opcodes, ce qui représente généralement une fonction ou un script, ce qui fait que memtrack n'a pas d'impact notable sur les performances.
memtrack ne fournit aucune fonction, car il n'y a que des directives d'exécution pour configurer son fonctionnement.
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/memtrack
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable |
|---|---|---|
| memtrack.enabled | "0" | PHP_INI_SYSTEM |
| memtrack.soft_limit | "0" | PHP_INI_ALL |
| memtrack.hard_limit | "0" | PHP_INI_ALL |
| memtrack.vm_limit | "0" | PHP_INI_ALL |
| memtrack.ignore_functions | "" | PHP_INI_SYSTEM |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Active ou non l'extension. Par défaut, c'est 0, i.e. désactivé.
Limite mémoire logicielle.
L'extension vérifie la consommation avant et après l'exécution d'un tableau d'opcode, puis produit une alerte si la différence entre les deux valeurs est égale ou supérieure à la limite logicielle, et que la fonction n'est pas ignorée.
En donnant à cette directive la valeur de 0, on désactive les limites logicielle et physique. Par défaut, cette directive vaut 0, ce qui fait qu'aucune alerte n'est produite.
Limite mémoire physique.
L'extension vérifie la consommation avant et après l'exécution d'un tableau d'opcode, puis produit une alerte si la différence entre les deux valeurs est égale ou supérieure à la limite logicielle, même si la fonction est ignorée. En donnant à cette directive la valeur de 0, on désactive les limites physique. Par défaut, cette directive vaut 0, ce qui fait qu'aucune alerte n'est produite.
Limite de mémoire virtuelle (par processus).
Cette limite est vérifiée à l'extinction du script, et une alerte est émise si la consommation de mémoire est plus grande que cette limite.
Cette option est uniquement supportée sur les OS où la fonction mallinfo() est disponible (i.e. Linux).
Une liste de fonctions qui seront ignorées par la limite logicielle. Les fonctions sont séparées par des virgules ou des espaces. Les valeurs sont insensibles à la casse, et pour les méthodes, il faut utiliser la syntaxe classe::méthode.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Exemple simple d'utilisation de memtrack
Exemple #1 Création d'un grand tableau
<?php
/* /tmp/exemple.php */
function foo() {
$a = array();
for ($i = 0; $i < 10000; $i++) $a[] = "test";
return $a;
}
$arr = foo();
?>
Exécution de l'exemple avec la commande suivante :
php -d memtrack.enabled=1 -d memtrack.soft_limit=1M -d memtrack.vm_limit=3M /tmp/exemple.php
L'exemple ci-dessus va afficher quelque chose de similaire à :
Warning: [memtrack] [pid 26177] user function foo() executed in /tmp/example1.php on line 10 allocated 4194304 bytes in /tmp/example1.php on line 0 Warning: [memtrack] [pid 26177] virtual memory usage on shutdown: 32911360 bytes in Unknown on line 0
Le but de cette extension est de permettre de maîtriser les appels aux méthodes et aux membres d'un objet. Seule une fonction est définie dans cette extension, overload() qui demande le nom de la classe qui doit supporter cette fonctionnalité. Cette classe doit être pourvue des méthodes nécessaires au bon fonctionnement de l'extension, c'est-à-dire : __get(), __set() et __call(), qui servent respectivement à lire, à modifier un membre et à appeler une méthode. De cette manière, l'overloading assure un contrôle sur les fonctions appelées. À l'intérieur de ces méthodes, l'overloading est désactivé, pour que vous puissiez accéder à l'objet.
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls.
Cette extension ne fait pas partie de PHP 5. PHP 5 supporte __get(), __set() et __call() nativement. Voir la page traitant de la surcharge en PHP 5 pour plus d'informations.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Afin d'utiliser ces fonctions, vous devez compiler PHP avec l'option --enable-overload. Depuis PHP 4.3.0, cette extension est activée par défaut. Pour la désactiver, utilisez l'option --disable--overload.
La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.
Note: Le support par défaut de l'extension overload a été ajouté en PHP 4.3.0.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Voici un exemple simple de fonctions utilisant overload() :
Exemple #1 Overload avec une classe PHP
<?php
class OO {
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Fonction de callback pour la lecture de membre
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Fonction de callback pour l'écriture de membre
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Ici, l'initiation de l'overload
overload('OO');
$o = new OO;
echo "\$o->a: $o->a\n"; // print: $o->a: 111
echo "\$o->b: $o->b\n"; // print: $o->b: 9
echo "\$o->c: $o->c\n"; // print: $o->c: 42
echo "\$o->d: $o->d\n"; // print: $o->d:
// ajout d'une nouvelle valeur au membre $elem, en programmation OOP
$o->x = 56;
// instantiation de la classe stdclass (elle existe par défaut en PHP 4)
// $val n'est pas surchargée !
$val = new stdclass;
$val->prop = 555;
// Forcez "a" à être un tableau avec l'élément $val
// Mais _set() forcera cet élément dans le tableau $elem
$o->a = array($val);
var_dump($o->a[0]->prop);
?>
(PHP 4 >= 4.3.0)
overload — Active la couche de contrôle des membres et méthodes
overload() active le contrôle des accesseurs et appels de méthodes pour la classe class_name .
Le nom de la classe surchargée, sous la forme d'une chaîne de caractères
Aucune valeur n'est retournée.
Voir un exemple dans la section d'introduction de cette partie.
Les fonctions de bufferisation de sortie vous permettent de contrôler quand les données ont été envoyées par le script. Cela peut être utile dans certaines situations, notamment si vous devez envoyer des en-têtes au navigateur après avoir envoyé des données. Ces fonctions n'affectent pas les en-têtes envoyés par la fonction header() ou les cookies envoyés par setcookie(). Seules les fonctions telles que echo() et les données entre blocs PHP sont affectées.
Note: Lors de la mise à jour depuis PHP 4.1.x (et 4.2.x) vers 4.3.x, à cause d'un bogue dans les versions précédentes, vous devez vous assurer que implict_flush vaut OFF dans votre php.ini, sinon, tout affichage avec la fonction ob_start() sera caché.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| output_buffering | "0" | PHP_INI_PERDIR | |
| output_handler | NULL | PHP_INI_PERDIR | Disponible depuis PHP 4.0.4. |
| implicit_flush | "0" | PHP_INI_ALL | PHP_INI_PERDIR en PHP <= 4.2.3. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Vous pouvez activer la bufferisation de sortie pour tous les fichiers avec cette directive, en lui passant la valeur On. Si vous souhaitez limiter la taille du buffer à une certaine taille, vous pouvez alors indiquer un nombre maximum d'octets à la place de On. Par exemple, output_buffering=4096). Depuis PHP 4.3.5, cette directive est toujours désactivée en ligne de commande.
Vous pouvez rediriger le résultat de tous vos scripts à une fonction avant leur envoi au navigateur. Par exemple, si vous configurez output_handler à mb_output_handler(), l'encodage des caractères sera adapté de manière transparente. Configurer une telle fonction active automatiquement la bufferisation de sortie.
Note: Vous ne pouvez pas utiliser simultanément mb_output_handler() avec ob_iconv_handler(), non plus que ob_gzhandler() avec zlib.output_compression.
Note: Seules les fonctions internes peuvent être utilisées avec cette directive. Pour les fonctions utilisateurs, utilisez ob_start().
FALSE par défaut. En changeant cette valeur pour TRUE vous indiquez à PHP que le buffer de sortie doit être vidé automatiquement après chaque fonction d'affichage. Cela revient à appeler la fonction flush() après chaque appel à print() ou echo() et pour tous les blocs HTML.
Lorsque vous utilisez PHP en environnement web, activer cette option a de sérieuses implications et généralement, cela n'est conseillé que pour les déboguages. Cette valeur est par défaut à TRUE lorsque PHP fonctionne en mode CLI SAPI.
Voir aussi ob_implicit_flush().
Cette extension ne définit aucune ressource.
Cette extension ne définit aucune constante.
Exemple #1 Exemple de bufferisation de sortie
<?php
ob_start();
echo "Bonjour\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
Dans l'exemple ci-dessus, l'instruction echo() est stockée dans un buffer jusqu'à l'appel de la fonction ob_end_flush(). Dans le même temps, l'appel à setcookie() a réussi à créer un cookie, sans générer d'erreur. (D'habitude, vous devez envoyer les en-têtes avant les données).
Voir aussi header() et setcookie().
(PHP 4, PHP 5)
flush — Vide les tampons de sortie
Vide les tampons d'écriture de PHP et tous ceux que PHP utilisait (CGI, un serveur web, etc.). Cette fonction envoie réellement toutes les données préparées vers l'utilisateur.
flush() n'a aucun effet sur la tamporisation de votre serveur web ou du navigateur. Et cela n'a pas d'impact sur le mécanisme de tampons de PHP. De ce fait, vous devez appeler les fonctions ob_flush() et flush() pour vider les tampons de sortie.
De nombreux serveurs, essentiellement sous Windows, continueront à tamporiser l'affichage de votre script jusqu'à ce qu'il soit terminé, avant de transmettre les résultats à l'internaute.
Des modules Apache comme mod_gzip utilisent leur propre tamporisation, ce qui fait que flush() n'enverra pas les données jusqu'au navigateur client immédiatement.
Même le navigateur peut réaliser une tamporisation avant de l'afficher. Netscape, par exemple, met en cache le texte jusqu'à ce qu'il reçoive une fin de ligne, ou un début d'une balise et il n'affichera pas les tables tant que la balise </table> la plus externe ne soit vue.
Certaines versions de Microsoft Internet Explorer ne commenceront l'affichage de la page qu'après avoir reçu 256 octets d'affichage. Cela vous obligera à envoyer des espaces supplémentaires pour afficher la page.
Aucune valeur n'est retournée.
(PHP 4 >= 4.2.0, PHP 5)
ob_clean — Efface le tampon de sortie
Cette fonction vide le tampon de sortie sans l'envoyer au navigateur.
Cette fonction ne détruit pas le contenu du tampon de sortie comme peut le faire ob_end_clean().
Aucune valeur n'est retournée.
(PHP 4, PHP 5)
ob_end_clean — Détruit les données du tampon de sortie et éteint la tamporisation de sortie
Cette fonction vide le contenu du premier tampon de sortie et désactive la tamporisation de sortie. Si vous voulez traiter le contenu du tampon, vous devrez appeler ob_get_contents() avant ob_end_clean(), car le tampon est détruit par ob_end_clean().
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec. Les raisons d'un tel échec sont que la tamporisation de sortie pouvait ne pas être activée, ou que, pour une raison quelconque, le tampon n'a pu être détruit.
Si la fonction échoue, elle génère une note E_NOTICE.
| Version | Description |
|---|---|
| 4.2.0 | La valeur booléen retournée par la fonction a été ajoutée. |
L'exemple suivant montre comment se débarrasser de tous les tampons de sortie :
Exemple #1 Exemple avec ob_end_clean()
<?php
ob_start();
echo 'Texte qui ne sera pas affiché.';
ob_end_clean();
?>
(PHP 4, PHP 5)
ob_end_flush — Envoie les données du tampon de sortie et éteint la tamporisation de sortie
Envoie le contenu du tampon de sortie (s'il existe) et éteint la tamporisation de sortie. Si vous voulez continuer à manipuler la valeur du tampon, vous pouvez appeler ob_get_contents() avant ob_end_flush() car le contenu du tampon est détruit après un appel à ob_end_flush().
Note: Cette fonction est similaire à ob_get_flush(), excepté que ob_get_flush() retourne le tampon comme une chaîne de caractères.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec. Les raisons d'échec sont que vous pourriez avoir appelé la fonction sans avoir de tampon actif, ou que, pour une raison quelconque, le tampon n'a pu être effacé (possible pour un tampon spécial).
Si la fonction échoue, elle émet une alerte de type E_NOTICE.
| Version | Description |
|---|---|
| 4.2.0 | La fonction retourne une valeur booléenne. |
Exemple #1 Exemple avec ob_end_flush()
L'exemple ci-dessous montre une méthode simple pour vider tous les tampons :
<?php
while (@ob_end_flush());
?>
(PHP 4 >= 4.2.0, PHP 5)
ob_flush — Envoie le tampon de sortie
Envoie le contenu du tampon de sortie (s'il y en a un). Si vous voulez contrôler le contenu du tampon, vous devez appeler la fonction ob_get_contents() avant ob_flush() car le contenu du tampon est effacé après l'appel de ob_flush().
ob_flush() ne détruit pas le contenu du tampon de sortie comme peut le faire ob_end_flush().
Aucune valeur n'est retournée.
(PHP 4 >= 4.3.0, PHP 5)
ob_get_clean — Lit le contenu courant du tampon de sortie puis l'efface
Lit le contenu courant du tampon de sortie puis l'efface.
ob_get_clean() exécute successivement ob_get_contents() et ob_end_clean().
Retourne le contenu du tampon de sortie et termine la session de tamporisation. Si la tamporisation n'est pas activée, alors FALSE sera retourné.
Exemple #1 Exemple avec ob_get_clean()
<?php
ob_start();
echo "Bonjour le monde !";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
L'exemple ci-dessus va afficher :
string(18) "bonjour le monde !"
(PHP 4, PHP 5)
ob_get_contents — Retourne le contenu du tampon de sortie
Retourne le contenu du tampon de sortie sans l'effacer.
Retourne le contenu du tampon de sortie sans l'effacer ou FALSE, si la tamporisation de sortie n'est pas activée.
Exemple #1 Exemple avec ob_get_contents()
<?php
ob_start();
echo "Bonjour ";
$out1 = ob_get_contents();
echo "le monde !";
$out2 = ob_get_contents();
ob_end_clean();
var_dump($out1, $out2);
?>
L'exemple ci-dessus va afficher :
string(8) "Bonjour " string(18) "le monde"
(PHP 4 >= 4.3.0, PHP 5)
ob_get_flush — Vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation
ob_get_flush() vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation.
Note: ob_get_flush() est similaire à ob_end_flush(), sauf que cette fonction retourne le tampon en tant que chaîne.
Retourne le tampon de sortie ou FALSE s'il n'y en a aucun d'actif.
Exemple #1 Exemple avec ob_get_flush()
<?php
//Utilisation de output_buffering=On
print_r(ob_list_handlers());
//Saugarde du tampon dans un fichier
$buffer = ob_get_flush();
file_put_contents('buffer.txt', $buffer);
print_r(ob_list_handlers());
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => default output handler
)
Array
(
)
(PHP 4 >= 4.0.2, PHP 5)
ob_get_length — Retourne la longueur du contenu du tampon de sortie
Retourne la longueur du contenu du tampon de sortie.
Retourne la longueur du contenu du tampon de sortie si la tamporisation est activée, et FALSE sinon.
Exemple #1 Exemple avec ob_get_length()
<?php
ob_start();
echo "Bonjour ";
$len1 = ob_get_length();
echo "le monde";
$len2 = ob_get_length();
ob_end_clean();
echo $len1 . ", ." . $len2;
?>
L'exemple ci-dessus va afficher :
8, 16
(PHP 4 >= 4.2.0, PHP 5)
ob_get_level — Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie
Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie.
Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie, et zéro s'il n'est pas actif.
(PHP 4 >= 4.2.0, PHP 5)
ob_get_status — Lit le statut du tampon de sortie
ob_get_status() retourne les informations sur le statut du tampon d'affichage de haut niveau ou de tous les tampons d'affichage si full_status est défini à TRUE.
TRUE pour retourner tous les tampons d'affichage. Si vaut FALSE ou non défini, seul le statut du tampon d'affichage de haut niveau sera retourné.
Si la fonction est appelée sans le paramètre full_status ou avec le paramètre full_status = FALSE, un tableau simple avec les éléments suivants sera retourné :
Array
(
[level] => 2
[type] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
Si la fonction est appelée avec le paramètre full_status défini à TRUE, un tableau avec un élément par tampon de sortie actif est retourné. Le niveau de sortie est utilisé en tant que clé du tableau de niveau élevé et chaque élément du tableau est un autre tableau contenant les informations sur le statut du niveau du tampon actif.
Array
(
[0] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 1
[status] => 0
[name] => default output handler
[del] => 1
)
[1] => Array
(
[chunk_size] => 0
[size] => 40960
[block_size] => 10240
[type] => 0
[buffer_size] => 0
[status] => 0
[name] => URL-Rewriter
[del] => 1
)
)
La sortie complète contient les éléments suivants :
(PHP 4 >= 4.0.4, PHP 5)
ob_gzhandler — Fonction de rappel pour la compression automatique des tampons
ob_gzhandler() est destinée à être utilisée comme fonction de rappel par ob_start() pour faciliter l'envoi de données compressées aux navigateurs qui supportent les pages compressées. Avant que ob_gzhandler() envoie les données compressées, il détermine les types d'encodage qui sont supportés par le navigateur ("gzip", "deflate" ou aucun) et retourne le contenu des tampons de manière appropriée. Tous les navigateurs sont traités, car c'est aux navigateurs d'envoyer un en-tête indiquant les types de pages supportés. Si le navigateur ne supporte pas les pages compressées, cette fonction retournera FALSE.
| Version | Description |
|---|---|
| 4.0.5 | Ajout du paramètre mode . |
Exemple #1 Exemple avec ob_gzhandler()
<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>Ceci devrait être une page compressée.</p>
</html>
<body>
Note: ob_gzhandler() nécessite l'extension zlib.
Note: Vous ne pouvez pas utiliser simultanément ob_gzhandler() et zlib.output_compression. De plus, notez bien que zlib.output_compression est préférable à ob_gzhandler().
(PHP 4, PHP 5)
ob_implicit_flush — Active/désactive l'envoi implicite
ob_implicit_flush() active/désactive l'envoi implicite. L'envoi implicite signifie que toute fonction qui envoie des données au navigateur verra ses données envoyées immédiatement (la fonction flush() est appelée automatiquement).
TRUE pour activer, FALSE sinon. Vaut par défaut TRUE.
Aucune valeur n'est retournée.
(PHP 4 >= 4.3.0, PHP 5)
ob_list_handlers — Liste les gestionnaires d'affichage utilisés
Liste les gestionnaires d'affichage utilisés.
Retourne un tableau avec le gestionnaire d'affichage en cours d'utilisation (s'il existe). Si output_buffering est activé ou si une fonction anonyme est utilisée avec ob_start(), ob_list_handlers() retournera un tableau avec comme valeur d'entrée : "default output handler".
Exemple #1 Exemple avec ob_list_handlers()
<?php
//Utilisation de output_buffering=On
print_r(ob_list_handlers());
ob_end_flush();
ob_start("ob_gzhandler");
print_r(ob_list_handlers());
ob_end_flush();
// Fonctions anonymes
ob_start(create_function('$string', 'return $string;'));
print_r(ob_list_handlers());
ob_end_flush();
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => default output handler
)
Array
(
[0] => ob_gzhandler
)
Array
(
[0] => default output handler
)
(PHP 4, PHP 5)
ob_start — Enclenche la tamporisation de sortie
ob_start() démarre la tamporisation de sortie. Tant qu'elle est enclenchée, aucune donnée, hormis les en-têtes, n'est envoyée au navigateur, mais temporairement mise en tampon.
Le contenu de ce tampon peut être copié dans une chaîne avec la fonction ob_get_contents(). Pour afficher le contenu de ce tampon, utilisez ob_end_flush(). Au contraire, ob_end_clean() effacera le contenu de ce tampon.
Quelques serveurs web (par exemple Apache) modifient le dossier de travail d'un script lorsqu'il appelle une fonction de rappel. Vous pouvez revenir à un comportement normal en ajoutant chdir(dirname($_SERVER['SCRIPT_FILENAME'])) dans votre fonction de rappel.
Les tampons de sortie sont gérés par pile, c'est-à-dire que vous pouvez appeler plusieurs fois ob_start() simultanément. Assurez-vous que vous appelez ob_end_flush() suffisamment souvent. Si plusieurs fonctions de rappel sont actives, les contenus seront filtrés séquentiellement, dans l'ordre d'emboîtement.
Une fonction optionnelle de rappel peut être spécifiée. ob_start() prend une chaîne comme paramètre, et retourne une chaîne. Elle sera appelée lorsque le tampon sera envoyé ou supprimé (avec les fonctions ob_flush(), ob_clean() ou des fonctions similaires) ou lorsque le tampon sera envoyé au navigateur à la fin du script et recevra le contenu du tampon de sortie. Lorsque la fonction output_callback est appelée, elle doit retourner un nouveau contenu pour le tampon de sortie : celui-ci sera envoyé au navigateur. Si output_callback n'est pas une fonction accessible, la fonction retournera FALSE.
Si la fonction de rappel a deux paramètres, le second est composé du champ bits constitué par PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT et PHP_OUTPUT_HANDLER_END.
Si output_callback retourne FALSE, l'entrée originale est envoyée au navigateur.
Le paramètre output_callback peut être annulé en y passant la valeur NULL.
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() et ob_start() ne doivent pas être appelés depuis une fonction de rappel. Si vous les appelez depuis une fonction de rappel, le comportement ne sera pas défini. Si vous voulez effacer le contenu du tampon, retournez "" (une chaîne vide) comme fonction de rappel. Vous ne pourrez jamais appeler les fonctions utilisant la fonction de tamporisation de sortie comme print_r($expression, true) ou highlight_file($filename, true) depuis une fonction de rappel.
Note: En PHP 4.0.4, ob_gzhandler() a été introduite pour faciliter l'envoi de fichiers compressés avec gzip aux navigateurs web qui supportent les pages compressées. ob_gzhandler() détermine le type d'encodage accepté par un navigateur, et retourne le contenu le plus adéquat.
Si le paramètre optionnel chunk_size est passé, la fonction de rappel est appelée à chaque nouvelle ligne après chunk_size octets d'affichage. La valeur par défaut (zéro) signifie que la fonction est appelée uniquement à la fin, et si la valeur est 1, chunk_size vaudra 4096.
Si le paramètre optionnel erase est défini à FALSE, le tampon ne sera pas effacé tant que le script ne sera pas terminé (depuis PHP 4.3.0).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
| Version | Description |
|---|---|
| 4.3.2 | Cette fonction a été modifiée pour retourner FALSE dans le cas où output_callback ne peut être exécuté. |
| 4.2.0 | Ajout du paramètre erase . |
Exemple #1 Exemple de gestion de sortie avec fonction de rappel
<?php
function rappel($buffer)
{
// remplace toutes les pommes par des carottes
return (ereg_replace("pommes de terre", "carottes", $buffer));
}
ob_start("rappel");
?>
<html>
<body>
<p>C'est comme comparer des carottes et des pommes de terre.</p>
</body>
</html>
<?php
ob_end_flush();
?>
L'exemple ci-dessus va afficher :
<html> <body> <p>C'est comme comparer des carottes et des carottes.</p> </body> </html>
(PHP 4 >= 4.3.0, PHP 5)
output_add_rewrite_var — Ajoute une règle de réécriture d'URL
Cette fonction ajoute une nouvelle paire nom/valeur au mécanisme de réécriture d'URL. Le nom et la valeur sera ajouté aux URL (en tant que paramètre GET) et aux formulaires (en tant que champs cachés) de la même façon que pour les identifiants de session lorsque la réécriture d'URL est activée avec session.use_trans_sid. Notez que les URL absolues, telles http://example.com/, ne sont pas réécrites.
Ce comportement est contrôlé par l'option url_rewriter.tags du php.ini.
Note: L'appel à cette fonction démarre implicitement la tamporisation de sortie si elle n'est pas déjà activée.
Le nom de la variable.
La valeur de la variable.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec output_add_rewrite_var()
<?php
output_add_rewrite_var('var', 'value');
// Quelques liens
echo '<a href="file.php">link</a>
<a href="http://example.com">link2</a>';
// un formulaire
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';
print_r(ob_list_handlers());
?>
L'exemple ci-dessus va afficher :
<a href="file.php?var=value">link</a>
<a href="http://example.com">link2</a>
<form action="script.php" method="post">
<input type="hidden" name="var" value="value" />
<input type="text" name="var2" />
</form>
Array
(
[0] => URL-Rewriter
)
(PHP 4 >= 4.3.0, PHP 5)
output_reset_rewrite_vars — Annule la réécriture d'URL
Cette fonction annule la règle de réécriture et efface toutes les variables de réécriture précédemment définies avec la fonction output_add_rewrite_var() ou par le mécanisme de session (si session.use_trans_sid a été défini lors de l'utilisation de la fonction session_start()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec output_reset_rewrite_vars()
<?php
session_start();
output_add_rewrite_var('var', 'value');
echo '<a href="file.php">link</a>';
ob_flush();
output_reset_rewrite_vars();
echo '<a href="file.php">link</a>';
?>
L'exemple ci-dessus va afficher :
<a href="file.php?PHPSESSID=xxx&var=value">link</a> <a href="file.php">link</a>
L'extension runkit fournit les moyens de modifier les constantes, les fonctions et les classes définies par l'utilisateur. Elle fournit aussi ces moyens pour les variables superglobales et les sous-interpréteurs par sandboxing.
Ce paquetage est signifié en tant que remplacement de fonctionnalités pour le paquetage » classkit. Lorsque compilé avec l'option --enable-runkit=classkit à ./configure, les définitions des fonctions et des constantes de classkit seront exportées.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Modification de Constantes, Fonctions, Classes et Méthodes fonctionne avec toutes les versions de PHP 4 et PHP 5. Aucune condition spéciale n'est nécessaire.
Les Superglobales Personnalisées sont seulement disponibles dans les versions PHP 4.2.0 et supérieures.
Sandboxing nécessite PHP 5.1.0 ou supérieur ou PHP 5.0.0 avec le patch spécial TSRM appliqué. Sans se soucier de quelle version de PHP est utilisé, sandboxing doit être compilé avec l'option --enable-maintainer-zts. Voyez le fichier README dans le paquetage de runkit pour plus d'informations.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/runkit.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| runkit.superglobal | "" | PHP_INI_PERDIR | |
| runkit.internal_override | "0" | PHP_INI_SYSTEM |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Exemple #1 Superglobales particulières avec runkit.superglobal=_FOO,_BAR dans php.ini
<?php
function montre_valeurs() {
echo "Foo est $_FOO\n";
echo "Bar est $_BAR\n";
echo "Baz est $_BAZ\n";
}
$_FOO = 'foo';
$_BAR = 'bar';
$_BAZ = 'baz';
/* Montre foo et bar mais pas baz */
montre_valeurs();
?>
Cette extension ne définit aucune ressource.
(PECL runkit >= 0.7.0)
Runkit_Sandbox — Classe Runkit Sandbox -- Machine Virtuelle PHP
L'instanciation de la classe Runkit_Sandbox crée un nouveau thread avec sa propre portée et sa pile de programme. En utilisant les options passées au constructeur, cet environnement peut être restreint à un sous-ensemble pour lequel l'interpréteur primaire peut exécuter et fournir un environnement plus sûr pour l'exécution de code utilisateur.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
options est un tableau associatif contenant n'importe quelle combinaison des options ini listées ci-dessous.
Si un script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode = off, alors safe_mod devrait être activé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour désactiver safe_mode lorsque safe_mode est déjà activé dans le script extérieur.
Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode_gid = on, alors safe_mod_gid devrait être désactivé pour l'environnement sandbox. Cette configuration ne peut être utilisée pour activer safe_mode_gid lorsque c'est déjà désactivé dans le script extérieur.
Si le script extérieur qui est instancié avec la classe Runkit_Sandbox est configuré avec safe_mode_include_dir, alors un nouveau safe_mode_include_dir devrait être fixé pour les environnements de sandbox sous la valeur actuellement définie. safe_mode_include_dir peut aussi être supprimé pour indiquer que l'évitement de cette fonctionnalité est désactivé. Si safe_mode_include_dir était vide dans le script extérieur, mais safe_mod n'était pas activé, alors n'importe quel safe_mode_include_dir arbitraire peut être fixé en activant le safe_mode.
open_basedir peut être fixé à n'importe quel chemin sous la configuration courante de open_basedir. Si open_basedir n'est pas fixé dans la portée globale, alors il est assumé qu'il est dans le répertoire root et peut être fixé à n'importe quelle autre emplacement.
Comme safe_mode , cette configuration peut seulement être faite plus restrictive, dans ce cas, en mettant FALSE lorsque la valeur était précédemment TRUE.
Liste de fonctions séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des fonctions déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.
Liste de classes séparées par des virgules à désactiver dans le sous-interpréteur sandbox. Cette liste ne nécessite pas de contenir le nom des classes déjà désactivées, elles resteront désactivées même si elles ne sont pas listées.
Liste des variables qui seront traitées en tant que superglobales dans le sous-interpréteur sandbox. Ces variables seront utilisées en plus de celles définies à l'interne ou à l'aide de la configuration runkit.superglobal.
L'option ini runkit.internal_override devrait être désactivée (mais non réactivée) à l'intérieur des sandbox.
Exemple #1 Instanciation d'un sandbox restreint
<?php
$options = array(
'safe_mode'=>true,
'open_basedir'=>'/var/www/users/jdoe/',
'allow_url_fopen'=>'false',
'disable_functions'=>'exec,shell_exec,passthru,system',
'disable_classes'=>'myAppClass');
$sandbox = new Runkit_Sandbox($options);
/* Configurations ini non protégées sont fixées normalement */
$sandbox->ini_set('html_errors',true);
?>
Toutes les variables dans la portée globale de l'environnement sandbox sont accessibles comme étant des propriétés de l'objet sandbox. La première chose à noter, c'est puisque la manière de gestion de la mémoire entre les deux threads est faite que les objets et les variables de ressources ne peuvent pas, jusqu'à présent, être échangées entre les interpréteurs. De plus, tous les tableaux sont copiés au complet et toutes références seront perdues. Cela veut aussi dire que les références entre les interpréteurs ne sont pas possibles.
Exemple #2 Utilisation des variables dans sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox->foo = 'bar';
$sandbox->eval('echo "$foo\n"; $bar = $foo . "baz";');
echo "{$sandbox->bar}\n";
if (isset($sandbox->foo)) unset($sandbox->foo);
$sandbox->eval('var_dump(isset($foo));');
?>
L'exemple ci-dessus va afficher :
bar barbaz bool(false)
Toute fonction définie dans le sandbox peut être appelée en tant que méthode sur l'objet sandbox. Ceci inclut aussi quelques constructions de pseudo-fonctions : eval() include(), include_once(), require(), require_once(), echo(), print(), die() et exit().
Exemple #3 Appel de fonctions sandbox
<?php
$sandbox = new Runkit_Sandbox();
echo $sandbox->str_replace('a','f','abc');
?>
L'exemple ci-dessus va afficher :
fbc
Lors du passage d'arguments à une fonction sandbox, les arguments sont pris à partir de l'extérieur de l'instance de PHP. Si vous voulez passer les arguments à la portée de sandbox, soyez assuré de les accéder comme étant des propriétés de l'objet sandbox comme montré plus haut.
Exemple #4 Passage d'arguments aux fonctions sandbox
<?php
$sandbox = new Runkit_Sandbox();
$foo = 'bar';
$sandbox->foo = 'baz';
echo $sandbox->str_replace('a',$foo,'a');
echo $sandbox->str_replace('a',$sandbox->foo,'a');
?>
L'exemple ci-dessus va afficher :
bar baz
Depuis la version de runkit 0.5, certaines configurations de Sandbox peuvent être modifiées à la volée en utilisant la syntaxe ArrayAccess. Certaines configurations, comme active sont en lecture seule et permettent de fournir des informations de statut. Les autres configurations, comme output_handler peuvent être fixées et lues comme un tableau normal. Les configurations futures devraient être en écriture seule, cependant aucune configuration n'existe présentement.
| Configuration | Type | But | Défaut |
|---|---|---|---|
| active | booléen (Lecture Seule) | TRUE si le Sandbox est toujours dans un état utilisable, FALSE si la requête est en arrêt dû à un appel à die(), exit() ou à cause d'une condition d'erreur fatale. | TRUE (Initial) |
| output_handler | Callback | Lorsque fixée à une valeur de retour valide, toutes sorties générées par l'instance Sandbox seront traitées à travers la fonction nommée. Les sorties de Sandbox suivent les mêmes conventions d'appel pour les gestionnaires de sortie du système entier. | Aucun |
| parent_access | booléen | Autorise sandbox à utiliser des instances de la classe Runkit_Sandbox_Parent. Doit être activée pour que les autres configurations reliées à Runkit_Sandbox_Parent fonctionnent. | FALSE |
| parent_read | booléen | Autorise sandbox à lire des variables dans son contexte parent. | FALSE |
| parent_write | booléen | Autorise sandbox à modifier des variables dans son contexte parent. | FALSE |
| parent_eval | booléen | Autorise sandbox à évaluer du code arbitraire dans son contexte parent. (DANGEREUX) | FALSE |
| parent_include | booléen | Autorise sandbox à inclure des fichiers de code php dans son contexte parent. DANGEREUX | FALSE |
| parent_echo | booléen | Autorise sandbox à afficher des données dans son contexte parent en court-circuitant efficacement son propre output_handler. | FALSE |
| parent_call | booléen | Autorise sandbox à appeler des fonctions dans son contexte parent. | FALSE |
| parent_die | booléen | Autorise sandbox à tuer son propre parent. (Et donc soi-même) | FALSE |
| parent_scope | entier | Quelle portée la propriété de l'accès parental vérifiera ? 0 == Portée Globale, 1 == Portée Appelante, 2 == Portée précédant la portée appelante, 3 == La porté avant celle-ci, etc., etc. | 0 (Global) |
| parent_scope | chaîne de caractères | Lorsque parent_scope est fixée à une valeur d'une chaîne de caractères, elle se réfère à une variable tableau nommée dans la portée globale. Si la variable nommée n'existe pas au moment de son accès, elle sera créée comme un tableau vide. Si la variable existe mais n'est pas un tableau, un faux tableau sera créé contenant une référence à la variable globale nommée. |
(PECL runkit >= 0.7.0)
Runkit_Sandbox_Parent — Classe Anti-Sandbox Runkit
L'instanciation de la classe Runkit_Sandbox_Parent à l'intérieure d'un environnement sandbox créé à partir de la classe Runkit_Sandbox fournit certains moyens (contrôlés) pour un sandbox fils pour accéder à son parent.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Afin de faire fonctionner une des fonctionnalités de Runkit_Sandbox_Parent, le support doit être activé sur une base de chaque sandbox en activant le drapeau parent_access à partir du contexte parent.
Exemple #1 Travailler avec des variables dans un sandbox
<?php
$sandbox = new Runkit_Sandbox();
$sandbox['parent_access'] = true;
?>
Comme les accès des variables de sandbox, les variables de parent sandbox devraient être lues et écrites à partir des propriétés de la classe Runkit_Sandbox_Parent. L'accès en lecture aux variables parentes devraient être activé avec la configuration parent_read (en plus de la base de configuration parent_access). L'accès en écriture est activé avec la configuration parent_write.
La portée des variables est différente de l'accès aux variables enfants de sandbox; elle n'est pas limitée au variables globales seulement. En configurant la configuration parent_scope pour un entier approprié, les autres portées dans la pile active pourraient être inspectée. Une valeur de 0 (Défaut) autorisera l'accès direct aux variables dans la portée globale. 1 pointera l'accès des variables à n'importe quelles variables dont la portée était active au moment ou le bloc courant du code sandbox était exécuté. Des valeurs plus élevées font reculer à travers les fonctions qui ont appelées d'autres fonctions qui menent au code sandbox en train d'être exécuté et qui essaie d'accéder à ses propres variables parentes.
Exemple #2 Accès aux variables parentes
<?php
$php = new Runkit_Sandbox();
$php['parent_access'] = true;
$php['parent_read'] = true;
$test = "Global";
$php->eval('$PARENT = new Runkit_Sandbox_Parent;');
$php['parent_scope'] = 0;
one();
$php['parent_scope'] = 1;
one();
$php['parent_scope'] = 2;
one();
$php['parent_scope'] = 3;
one();
$php['parent_scope'] = 4;
one();
$php['parent_scope'] = 5;
one();
function un() {
$test = "un()";
two();
}
function deux() {
$test = "deux()";
three();
}
function trois() {
$test = "trois()";
$GLOBALS['php']->eval('var_dump($PARENT->test);');
}
?>
L'exemple ci-dessus va afficher :
string(6) "Global" string(7) "trois()" string(5) "deux()" string(5) "un()" string(6) "Global" string(6) "Global"
Comme l'accès avec sandbox, un sandbox peut accéder ses fonctions parentes si les configurations adéquates ont été activées. L'activation de parent_call autorisera le sandbox d'appeler toutes les fonctions disponibles à la portée parente. Les constructions de langage sont chacune contrôlées par ses propres configurations : print() et echo() sont activées avec parent_echo. die() et exit() sont activées avec parent_die. eval() est activées avec parent_eval tandis que include(), include_once(), require() et require_once() sont activées avec parent_include.
(PECL runkit >= 0.7.0)
runkit_class_adopt — Convertit une classe de base à une classe héritée, ajoute une méthode ancestrale lorsque approprié
Le nom de la classe à adopter
Classe parente pour laquelle la classe enfant s'étend
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_class_adopt()
<?php
class myParent {
function parentFunc() {
echo "Sortie Fonction Parente\n";
}
}
class myChild {
}
runkit_class_adopt('myChild','myParent');
myChild::parentFunc();
?>
L'exemple ci-dessus va afficher :
Sortie Fonction Parente
(PECL runkit >= 0.7.0)
runkit_class_emancipate — Convertit une classe héritée à une classe de base, supprime toute méthode pour qui la portée est ancestrale
Nom de la classe à émanciper
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_class_emancipate()
<?php
class myParent {
function parentFunc () {
echo "Sortie Fonction Parente\n";
}
}
class myChild extends myParent {
}
myChild::parentFunc();
runkit_class_emancipate('myChild');
myChild::parentFunc();
?>
L'exemple ci-dessus va afficher :
Sortie Fonction Parente Fatal error: Call to undefined function: parentFunc() in example.php on line 12
(PECL runkit >= 0.7.0)
runkit_constant_add — Similaire à define(), mais permet aussi la définition dans définitions de classe
Nom de la constante à déclarer. Soit une chaîne de caractères pour indiquer une constante globale ou un classname::constname pour indiquer une constante de classe.
Valeur NULL, Bool, Long, Double, String ou Resource pour enregistrer la nouvelle constante.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_constant_redefine — Redéfinit une constante déjà définie
Constante à redéfinir. Soit une chaîne de caractères pour indiquer une constante globale ou classname::constname pour indiquer une constante de classe.
Nouvelle valeur à assigner à la constante.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_constant_remove — Enlève/Supprime une constante déjà définie
Nom de la constante à enlever. Soit une chaîne de caractères pour indiquer une constante globale ou classname::constname pour indiquer une constante de classe.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_function_add — Ajoute une nouvelle fonction, similaire à create_function()
Nom de la fonction à être créé
Liste d'arguments séparés par des virgules
Code qui compose la fonction
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_function_add()
<?php
runkit_function_add('testme','$a,$b','echo "La valeur de a est $a\n"; echo "La valeur de b est $b\n";');
testme(1,2);
?>
L'exemple ci-dessus va afficher :
La valeur de a est 1 La valeur de b est 2
(PECL runkit >= 0.7.0)
runkit_function_copy — Copie une fonction vers un nom de fonction nouveau
Nom de la fonction existante
Nom de la nouvelle fonction pour copier la définition vers celle-ci
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_function_copy()
<?php
function original() {
echo "Dans une fonction\n";
}
runkit_function_copy('original','duplicate');
original();
duplicate();
?>
L'exemple ci-dessus va afficher :
Dans une fonction Dans une fonction
(PECL runkit >= 0.7.0)
runkit_function_redefine — Remplace une définition de fonction avec une nouvelle implémentation
Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
Nom de la fonction à redéfinir
Nouvelle liste d'arguments à être acceptés par la fonction
Nouvelle implémentation du code
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_function_redefine()
<?php
function testme() {
echo "Implémentation de Testme originale\n";
}
testme();
runkit_function_redefine('testme','','echo "Nouvelle implémentation de Testme\n";');
testme();
?>
L'exemple ci-dessus va afficher :
Implémentation de Testme originale Nouvelle implémentation de Testme
(PECL runkit >= 0.7.0)
runkit_function_remove — Enlève une définition de fonction
Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
Nom de la fonction à supprimer
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_function_rename — Change le nom d'une fonction
Note: Par défaut, seulement les fonctions définies par l'utilisateur peuvent être supprimées, renommées ou modifiées. Afin de surcharger des fonctions internes, vous devez activer la configuration runkit.internal_override dans le fichier php.ini du système entier.
Nom de la fonction courante
Nouveau nom de fonction
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_import — Traite un fichier PHP important fonctions et définitions de classes, écrasement où applicable
Similaire à include(), par contre tout code qui réside à l'extérieur de fonction ou classe est simplement ignoré. De plus, dépendamment de la valeur de flags , toutes fonctions et classes qui existent déjà dans l'environnement en cours d'exécution seront automatiquement écrasées par leurs nouvelles définitions.
Nom du fichier pour importer les définitions de fonctions et de classe
Comparaison de bits OU (OR) de la famille de constantes RUNKIT_IMPORT_*.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_lint_file — Vérifie la syntaxe PHP d'un fichier spécifié
La fonction runkit_lint_file() effectue une vérification de syntaxe (lint) sur le fichier spécifié en testant les erreurs de scripts. Cette fonction est similaire à l'utilisation de php -l à partir de la ligne de commande.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Fichier contenant du code PHP à être vérifié
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_lint — Vérifie la syntaxe PHP de code PHP spécifié
La fonction runkit_lint() effectue une vérification de syntaxe (lint) sur le code PHP spécifié en testant les erreurs de scripts. Cette fonction est similaire à l'utilisation de php -l à partir de la ligne de commande à l'exception que runkit_lint() accepte le code actuel plutôt qu'un fichier.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Code PHP à être vérifié
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL runkit >= 0.7.0)
runkit_method_add — Ajoute dynamiquement une nouvelle méthode à une classe donnée
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
La classe dans laquelle la méthode sera ajoutée
Le nom de la méthode à ajouter
Liste des arguments séparés par des virgules pour la nouvelle méthode créée
Le code à être évalué lors que methodname est appelé
Le type de méthode à créer, peut être RUNKIT_ACC_PUBLIC, RUNKIT_ACC_PROTECTED ou RUNKIT_ACC_PRIVATE
Note: Ce paramètre est utilisé seulement en PHP 5, parce que, avant cette version, toutes les méthodes étaient publiques.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_method_add()
<?php
class Example {
function foo() {
echo "foo!\n";
}
}
// Crée un objet Example
$e = new Example();
// Ajoute une nouvelle méthode publique
runkit_method_add(
'Example',
'add',
'$num1, $num2',
'return $num1 + $num2;',
RUNKIT_ACC_PUBLIC
);
// ajoute 12 + 4
echo $e->add(12, 4);
?>
L'exemple ci-dessus va afficher :
16
(PECL runkit >= 0.7.0)
runkit_method_copy — Copie une méthode d'une classe à une autre
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Classe destination pour la méthode copiée
Nom de la méthode de destination
Classe source pour la méthode à copier
Nom de la méthode à copier à partir de la classe source. Si ce paramètre est omis, la valeur de dMethod est utilisée.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_method_copy()
<?php
class Foo {
function example() {
return "foo!\n";
}
}
class Bar {
// initialement, aucune méthode
}
// Copie la méthode example() de la classe Foo vers la classe Bar, comme étant baz()
runkit_method_copy('Bar', 'baz', 'Foo', 'example');
// sortie de la fonction copiée
echo Bar::baz();
?>
L'exemple ci-dessus va afficher :
foo!
(PECL runkit >= 0.7.0)
runkit_method_redefine — Change dynamiquement le code de la méthode donnée
Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
La classe dans laquelle la méthode sera redéfinie
Le nom de la méthode à redéfinir
Liste d'arguments séparés par des virgules pour la méthode redéfinie
Le nouveau code qui sera évalué lorsque methodname sera appelée
La méthode redéfinie peut etre RUNKIT_ACC_PUBLIC, RUNKIT_ACC_PROTECTED ou RUNKIT_ACC_PRIVATE
Note: Ce paramètre est utilisé seulement en PHP 5, parce que, avant cette version, toutes les méthodes étaient publiques.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_method_redefine()
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// Crée un objet Example
$e = new Example();
// Sortie Example::foo() (avant la redéfinition)
echo "Avant : " . $e->foo();
// Redéfinition de la méthode 'foo'
runkit_method_redefine(
'Example',
'foo',
'',
'return "bar!\n";',
RUNKIT_ACC_PUBLIC
);
// Sortie Example::foo() (après la redéfinition)
echo "Après : " . $e->foo();
?>
L'exemple ci-dessus va afficher :
Avant : foo! Après : bar!
(PECL runkit >= 0.7.0)
runkit_method_remove — Supprime dynamiquement la méthode donnée
Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
La classe dans laquelle la méthode sera supprimée
Le nom de la méthode à supprimer
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_method_remove()
<?php
class Example {
function foo() {
return "foo!\n";
}
function bar() {
return "bar!\n";
}
}
// Suppression de la méthode 'foo'
runkit_method_remove(
'Example',
'foo'
);
echo implode(' ', get_class_methods('Example'));
?>
L'exemple ci-dessus va afficher :
bar
(PECL runkit >= 0.7.0)
runkit_method_rename — Change dynamiquement le nom de la méthode donnée
Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
La classe dans laquelle la méthode sera renommée
Le nom de la méthode à renommer
Le nouveau nom à donner à la méthode renommée
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec runkit_method_rename()
<?php
class Example {
function foo() {
return "foo!\n";
}
}
// Renomme la méthode 'foo' par 'bar'
runkit_method_rename(
'Example',
'foo',
'bar'
);
// output renamed function
echo Example::bar();
?>
L'exemple ci-dessus va afficher :
foo!
(PECL runkit >= 0.8.0)
runkit_return_value_used — Détermine si la valeur de retour des fonctions courantes sera utilisée
Retourne TRUE si la valeur de retour d'une fonction est utilisée par la portée appelante, FALSE autrement.
Exemple #1 Exemple avec runkit_return_value_used()
<?php
function foo() {
var_dump(runkit_return_value_used());
}
foo();
$f = foo();
?>
L'exemple ci-dessus va afficher :
bool(false) bool(true)
(PECL runkit >= 0.7.0)
runkit_sandbox_output_handler — Spécifie une fonction à capturer et/ou traiter la sortie à partir d'un runkit sandbox
Normalement, toutes les sorties (comme avec echo() ou print()) seront écrites comme si elles avaient été écrites à partir de la portée du parent. Cependant, l'utilisation de runkit_sandbox_output_handler(), sorties générées par le sandbox (incluant les erreurs), peuvent être capturées par une fonction extérieure à sandbox.
Note: Support Sandbox (requis pour runkit_lint(), runkit_lint_file() et la classe Runkit_Sandbox) n'est seulement disponible qu'avec PHP 5.1 ou les versions de PHP 5.0 spécialement patché et nécessite que la protection de thread soit activée. Voyez le fichier README inclus dans le paquetage runkit pour plus d'informations.
Note: Dépréciée
Depuis la version de runkit 0.5, cette fonction est dépréciée et devrait être supprimée de ce paquetage avant la version 1.0. Le gestionnaire de sortie pour une instance donnée de Runkit_Sandbox devrait être lue/fixée en utilisant la syntaxe tableau de décalage montrée sur la page de définition de la classe Runkit_Sandbox.
Instance de la classe Runkit_Sandbox sur laquelle spécifier la gestion des sorties.
Nom d'une fonction qui s'attend à un paramètre. La sortie générée par sandbox sera envoyée à cette fonction de rappel. Tout ce qui sera retourné par cette fonction sera affiché normalement. Si ce paramètre n'est pas passé, alors la gestion des sorties ne sera pas changée. Si une valeur incorrecte est passée, la gestion des sorties sera désactivée et sera retournée à l'affichage direct.
Retourne le nom de la fonction de rappel précédemment définie en tant que gestion des sorties, ou FALSE si aucun gestionnaire n'avait été précédemment défini.
Exemple #1 Alimentation de sortie vers une variable
<?php
function capture_output($str) {
$GLOBALS['sandbox_output'] .= $str;
return '';
}
$sandbox_output = '';
$php = new Runkit_Sandbox();
runkit_sandbox_output_handler($php, 'capture_output');
$php->echo("Bonjour\n");
$php->eval('var_dump("Excusez-moi");');
$php->die("Je me suis perdu.");
unset($php);
echo "Sandbox Complété\n\n";
echo $sandbox_output;
?>
L'exemple ci-dessus va afficher :
Sandbox Complété Bonjour string(9) "Excusez-moi" Je me suis perdu.
(PECL runkit >= 0.7.0)
runkit_superglobals — Retourne un tableau indexé numériquement des variables superglobales enregistrées
Retourne un tableau indexé numériquement des variables superglobales enregistrée actuellement. C'est-à-dire _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES
L'extension scream donne la possibilité de désactiver l'opérateur de contrôle d'erreur, de manière à ce que toutes les erreurs soient rapportées. Cette fonctionnalité est désactivée par une directive PHP.
PHP version 5.2.0 ou plus récent.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/scream
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| scream.enabled | Off | PHP_INI_ALL |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
Active ou non le module scream.
Cette extension ne définit aucune ressource.
Cet exemple montre comment l'extension scream affecte le comportement du gestionnaire d'erreur PHP.
Exemple #1 Activation et désactivation de scream, à l'exécution
<?php
// Affichage des erreurs
ini_set('display_errors', true);
error_reporting(E_ALL);
// Désactivation de scream : le code est silencieux
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Activation de scream : le code est verbeux
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Opening http://example.com/not-existing-file Opening http://example.com/not-existing-file Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
Note: Généralement, on active cette extension avec une directive de configuration php.ini, au lieu de la modifier dans le code PHP.
Ces fonctions vous permettent de lire et de manipuler les tags ID3. Les tags ID3 sont utilisés dans les fichiers MP3 pour stocker le titre d'une chanson, tout comme des informations sur l'artiste, l'album, le genre, l'année et le numéro de la piste.
Depuis la version 0.2, il est également possible d'extraire des champs texte depuis des tags ID3 v2.2+.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
id3 fait partie de PECL et peut être installé en utilisant l'installeur Pear. Pour compiler PHP avec le support ID3, téléchargez le code source, mettez-le dans le dossier php-src/ext/id3 et compilez en spécifiant --enable-id3.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
La plupart des fonctions ID3 vous permettent soit de spécifier, soit de retourner un tag. Pour spécifier la version, utilisez une de ces constantes :
(PECL id3 >= 0.2)
id3_get_frame_long_name — Récupère le nom long d'un champs ID3v2
id3_get_frame_long_name() retourne le nom long d'un champs ID3v2.
Une frame ID3v2
Retourne le nom long d'un champs ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_get_frame_long_name()
<?php
$longName = id3_get_frame_long_name("TOLY");
echo $longName;
?>
L'exemple ci-dessus va afficher :
Original lyricist(s)/text writer(s)
(PECL id3 >= 0.2)
id3_get_frame_short_name — Récupère le nom court d'un champs ID3v2
id3_get_frame_short_name() retourne le nom court d'un champs ID3v2.
Une frame ID3v2
Retourne le nom court d'un champs ou FALSE si une erreur survient.
Les valeurs retournées par id3_get_frame_short_name() sont utilisées dans le tableau retourné par id3_get_tag().
Exemple #1 Exemple avec id3_get_frame_short_name()
<?php
$shortName = id3_get_frame_short_name("TOLY");
echo $shortName;
?>
L'exemple ci-dessus va afficher :
originalLyricist
(PECL id3 >= 0.1)
id3_get_genre_id — Récupération d'un id pour un genre
id3_get_genre_id() retourne l'id pour un genre.
Un entier compris entre 0 et 147
L'id du genre ou FALSE si une erreur survient.
Exemple #1 Exemple avec id3_get_genre_id()
<?php
$id = id3_get_genre_id("Alternative");
echo $id;
?>
L'exemple ci-dessus va afficher :
20
(PECL id3 >= 0.1)
id3_get_genre_list — Récupère toutes les valeurs possibles du genre
id3_get_genre_list() retourne un tableau contenant tous les genres possibles pouvant être stockés dans un tag ID3. La liste a été créée par Eric Kemp et, plus tard, complétée par WinAmp.
Cette fonction est pratique pour fournir à vos utilisateurs une liste de genres depuis laquelle ils peuvent en choisir un. Lorsque vous mettez à jour vos tags ID3, vous devez également spécifier un genre sous forme d'entier entre 0-147.
Retourne un tableau contenant tous les genres possibles qui peuvent être stockés dans une balise ID3.
Exemple #1 Exemple avec id3_get_genre_list()
<?php
$genres = id3_get_genre_list();
print_r($genres);
?>
L'exemple ci-dessus va afficher :
Array
(
[0] => Blues
[1] => Classic Rock
[2] => Country
[3] => Dance
[4] => Disco
[5] => Funk
[6] => Grunge
[7] => Hip-Hop
[8] => Jazz
[9] => Metal
[10] => New Age
[11] => Oldies
[12] => Other
[13] => Pop
[14] => R&B
[15] => Rap
[16] => Reggae
[17] => Rock
[18] => Techno
[19] => Industrial
[20] => Alternative
[21] => Ska
[22] => Death Metal
[23] => Pranks
[24] => Soundtrack
[25] => Euro-Techno
[26] => Ambient
[27] => Trip-Hop
[28] => Vocal
[29] => Jazz+Funk
[30] => Fusion
[31] => Trance
[32] => Classical
[33] => Instrumental
[34] => Acid
[35] => House
[36] => Game
[37] => Sound Clip
[38] => Gospel
[39] => Noise
[40] => Alternative Rock
[41] => Bass
[42] => Soul
[43] => Punk
[44] => Space
[45] => Meditative
[46] => Instrumental Pop
[47] => Instrumental Rock
[48] => Ethnic
[49] => Gothic
[50] => Darkwave
[51] => Techno-Industrial
[52] => Electronic
[53] => Pop-Folk
[54] => Eurodance
[55] => Dream
[56] => Southern Rock
[57] => Comedy
[58] => Cult
[59] => Gangsta
[60] => Top 40
[61] => Christian Rap
[62] => Pop/Funk
[63] => Jungle
[64] => Native US
[65] => Cabaret
[66] => New Wave
[67] => Psychadelic
[68] => Rave
[69] => Showtunes
[70] => Trailer
[71] => Lo-Fi
[72] => Tribal
[73] => Acid Punk
[74] => Acid Jazz
[75] => Polka
[76] => Retro
[77] => Musical
[78] => Rock & Roll
[79] => Hard Rock
[80] => Folk
[81] => Folk-Rock
[82] => National Folk
[83] => Swing
[84] => Fast Fusion
[85] => Bebob
[86] => Latin
[87] => Revival
[88] => Celtic
[89] => Bluegrass
[90] => Avantgarde
[91] => Gothic Rock
[92] => Progressive Rock
[93] => Psychedelic Rock
[94] => Symphonic Rock
[95] => Slow Rock
[96] => Big Band
[97] => Chorus
[98] => Easy Listening
[99] => Acoustic
[100] => Humour
[101] => Speech
[102] => Chanson
[103] => Opera
[104] => Chamber Music
[105] => Sonata
[106] => Symphony
[107] => Booty Bass
[108] => Primus
[109] => Porn Groove
[110] => Satire
[111] => Slow Jam
[112] => Club
[113] => Tango
[114] => Samba
[115] => Folklore
[116] => Ballad
[117] => Power Ballad
[118] => Rhytmic Soul
[119] => Freestyle
[120] => Duet
[121] => Punk Rock
[122] => Drum Solo
[123] => Acapella
[124] => Euro-House
[125] => Dance Hall
[126] => Goa
[127] => Drum & Bass
[128] => Club-House
[129] => Hardcore
[130] => Terror
[131] => Indie
[132] => BritPop
[133] => Negerpunk
[134] => Polsk Punk
[135] => Beat
[136] => Christian Gangsta
[137] => Heavy Metal
[138] => Black Metal
[139] => Crossover
[140] => Contemporary C
[141] => Christian Rock
[142] => Merengue
[143] => Salsa
[144] => Thrash Metal
[145] => Anime
[146] => JPop
[147] => SynthPop
)
(PECL id3 >= 0.1)
id3_get_genre_name — Récupère le nom pour un id de genre
id3_get_genre_name() retourne le nom pour un id de genre spécifié.
Un entier, compris entre 0 et 147
Retourne le nom sous la forme d'une chaîne de caractères.
Exemple #1 Exemple avec id3_get_genre_name()
<?php
$genre = id3_get_genre_name(20);
echo $genre;
?>
L'exemple ci-dessus va afficher :
Alternative
(PECL id3 >= 0.1)
id3_get_tag — Récupère toutes les informations stockées dans un tag ID3
id3_get_tag() est utilisée pour récupérer toutes les informations stockées dans un tag ID3 d'un fichier spécifique.
Le chemin vers le fichier MP3
Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Depuis la version 0.2, id3_get_tag() supporte également les tags ID3 version 2.2, 2.3 et 2.4. Pour extraire les informations de ces tags, passez une des constantes ID3_V2_2, ID3_V2_3 ou ID3_V2_4 en tant que second paramètre. Les tags ID3 v2.x peuvent contenir beaucoup plus d'informations sur le fichier MP3 que les versions ID3 v1.x.
Retourne un tableau associatif avec diverses clés, comme : title, artist, ..
La clé genre doit contenir un entier compris entre 0 et 147. Vous pouvez utiliser la fonction id3_get_genre_name() pour convertir ce nombre en une chaîne lisible humainement.
Exemple #1 Exemple avec id3_get_tag()
<?php
$tag = id3_get_tag( "path/to/example.mp3" );
print_r($tag);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[title] => DN-38416
[artist] => Re:\Legion
[album] => Reflections
[year] => 2004
[genre] => 19
)
Exemple #2 Exemple avec id3_get_tag()
<?php
$tag = id3_get_tag( "path/to/example2.mp3", ID3_V2_3 );
print_r($tag);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Götze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)
(PECL id3 >= 0.1)
id3_get_version — Récupère la version d'un tag ID3
id3_get_version() récupère la(les) version(s) de la(des) balise(s) ID3 d'un fichier MP3.
Si un fichier contient une balise ID3 v1.1, il contiendra toujours aussi une balise 1.0, vu que 1.1 est uniquement une extension de 1.0.
Le chemin vers le fichier MP3
Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.
Retourne la(les) version(s) du(des) tag(s) ID3 d'un fichier MP3. Sachant qu'un tag peut contenir des tags ID3 de version v1.x et v2.x, la valeur retournée par cette fonction doit être comparée au niveau binaire avec les constantes prédéfinies ID3_V1_0, ID3_V1_1 et ID3_V2.
Exemple #1 Exemple avec id3_get_version()
<?php
$version = id3_get_version( "path/to/example.mp3" );
if ($version & ID3_V1_0) {
echo "Contains a 1.x tag\n";
}
if ($version & ID3_V1_1) {
echo "Contains a 1.1 tag\n";
}
if ($version & ID3_V2) {
echo "Contains a 2.x tag\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Contains a 1.x tag Contains a 1.1 tag
(PECL id3 >= 0.1)
id3_remove_tag — Efface un tag ID3
id3_remove_tag() est utilisé pour effacer les informations stockées dans un tag ID3.
Le chemin vers le fichier MP3
Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec id3_remove_tag()
<?php
$result = id3_remove_tag( "path/to/example.mp3", ID3_V1_0 );
if ($result === true) {
echo "Le tag a été effacé avec succès\n";
}
?>
Si le fichier est accessible en écriture et qu'il contient un tag 1.0, l'exemple affichera :
Le tag a été effacé avec succès
Note: Actuellement, id3_remove_tag() supporte uniquement les tags version 1.0 et 1.1. Si vous tentez d'effacer un tag 1.0 et que le fichier contient un tag 1.1, le tag sera effacé car la version 1.1 n'est qu'une extension de la version 1.0.
(PECL id3 >= 0.1)
id3_set_tag — Met à jour les informations stockées dans un tag ID3
id3_set_tag() est utilisé pour changer les informations stockées dans un tag ID3. Si aucun tag n'est présent, le tag sera ajouté au fichier.
Le chemin vers le fichier MP3
Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.
Un tableau associatif de clés et de valeurs de tags
Les clés suivantes peuvent être utilisées dans le tableau associatif :
| Clé | Valeur possible | Disponible dans la version |
|---|---|---|
| "title" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "artist" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "album" | chaîne de caractères avec un maximum de 30 caractères | v1.0, v1.1 |
| "year" | 4 digits | v1.0, v1.1 |
| "genre" | valeur entière comprise entre 0 et 147 | v1.0, v1.1 |
| "comment" | chaîne de caractères avec un maximum de 30 caractères (28 en v1.1) | v1.0, v1.1 |
| "track" | entier compris entre 0 et 255 | v1.1 |
Vous permet de spécifier la version du tag, bien que les fichiers MP3 doivent contenir à la fois les versions 1.x et les versions 2.x.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec id3_set_tag()
<?php
$data = array(
"title" => "Re:Start",
"artist" => "Re:\Legion",
"comment" => "A nice track"
);
$result = id3_set_tag( "path/to/example.mp3", $data, ID3_V1_0 );
if ($result === true) {
echo "Le tag a été mis à jour avec succès\n";
}
?>
Si le fichier est accessible en écriture, l'exemple affichera :
Le tag a été mis à jour avec succès
Note: Actuellement, id3_set_tag() supporte uniquement les versions 1.0 et 1.1.
KTaglib est une approche orientée objet de la bibliothèque taglib du projet KDE utilisée dans des projets comme Amarok, permettant de lire et d'écrire les tags ID3 et Ogg. La bibliothèque permet également d'accéder aux informations audio. Cette approche suit l'API C++ de base, mais a été modifiée légèrement afin d'être plus orientée PHP.
Note: Pour le moment, ktaglib est capable de lire et d'écrire les tags ID3v1 et ID3v2.
Si vous voulez compiler ktaglib, vous devez avoir installé la bibliothèque taglib version 1.5. Pour obtenir cette bibliothèque, reportez-vous à la » page du projet taglib. Les bibliothèque DLL Windows sont compilés statiquement sur taglib, aussi, vous n'avez pas besoin d'installer la bibliothèque taglib.
Le support KTaglib en PHP n'est pas activé par défaut. Vous devez configuré PHP avec l'option --with-ktaglib[=DIR].
Note: KTaglib fait parti de PECL.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
KTaglib utilise des constantes. La plupart de ces constantes est identique à celle de la bibliothèque Taglib.
Représente un fichier MPEG. Les fichiers MPEG peuvent avoir des tags ID3v1, ID3v2 et des propriétés audio.
(0.0.1)
KTaglib_MPEG_File::__construct — Ouvre un nouveau fichier
Ouvre un nouveau fichier MPEG.
Le fichier à lire.
Exemple #1 Ouvre un nouveau fichier MP3 et lit le titre
<?php
$mpeg = new KTaglib_MPEG_File('example.mp3');
echo $mpeg->getID3v1Tag()->getTitle();
?>
(0.0.1)
KTaglib_MPEG_File::getAudioProperties — Retourne un objet qui permet l'accès aux propriétés audio
Retourne un objet qui permet l'accès aux propriétés audio d'un fichier MPEG.
Retourne un objet KTaglib_MPEG_AudioProperties ou FALSE si une erreur survient.
(0.0.1)
KTaglib_MPEG_File::getID3v1Tag — Retourne un objet représentant un tag ID3v1
Retourne un objet représentant un tag ID3v1, qui pourra être utilisé pour récupérer les informations s'y trouvant.
Retourne un objet KTaglib_MPEG_ID3v1Tag ou FALSE s'il n'y a pas de tag ID3v1.
(0.0.1)
KTaglib_MPEG_File::getID3v2Tag — Retourne un objet ID3v2
Retourne un objet ID3v2 pour le fichier MPEG. S'il n'y a aucun tag ID3v2, une exception KTaglib_TagNotFoundException sera lancée.
Retourne un objet KTaglib_ID3v2_Tag pour un fichier MPEG s'il possède un tag ID3v2, ou FALSE s'il n'en possède pas.
Représente les propriétés audio d'un fichier MPEG, comme la longueur, le débit ou encore la fréquence.
(0.0.1)
KTaglib_MPEG_AudioProperties::getBitrate — Retourne le débit binaire d'un fichier MPEG
Retourne le débit binaire d'un fichier MPEG.
Retourne le débit binaire, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getChannels — Retourne le nombre de canaux d'un fichier MPEG
Retourne le nombre de canaux d'un fichier MPEG.
Retourne le nombre de canaux, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getLayer — Retourne la couche d'un fichier MPEG
Retourne la couche d'un fichier MPEG (habituellement 2 pour un MP3).
Retourne la couche, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getLength — Retourne la taille d'un fichier MPEG
Retourne la taille d'un fichier MPEG.
Retourne la taille, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getSampleBitrate — Retourne l'échantillonnage d'un fichier MPEG
Retourne l'échantillonnage d'un fichier MPEG.
Retourne l'échantillonnage, sous la forme d'un entier.
(0.0.1)
KTaglib_MPEG_AudioProperties::getVersion — Retourne la version d'un fichier MPEG
Retourne la version de l'en-tête d'un fichier MPEG. Les versions possibles sont définies dans Tag_MPEG_Header (Version1, Version2, Version2.5).
Retourne la version.
(0.0.1)
KTaglib_MPEG_AudioProperties::isCopyrighted — Retourne true si le fichier MPEG est sous copyright
Retourne true si le fichier MPEG est sous copyright.
Retourne true si le fichier MPEG est sous copyright.
(0.0.1)
KTaglib_MPEG_AudioProperties::isOriginal — Retourne true si le fichier MPEG est marqué comme original
Retourne true si le fichier MPEG est marqué comme original.
Retourne true si le fichier MPEG est marqué comme original.
(0.0.1)
KTaglib_MPEG_AudioProperties::isProtectionEnabled — Retourne true si une protection est active
Retourne true si un méchanisme de protection tel que le DRM est actif pour ce fichier.
Retourne true si un méchanisme de protection tel que le DRM est actif pour ce fichier.
Classe de base pour les tags ID3v1 ou ID3v2.
(0.0.1)
KTaglib_Tag::getAlbum — Retourne le nom de l'album d'un tag ID3
Retourne le nom de l'album d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le nom de l'album.
(0.0.1)
KTaglib_Tag::getArtist — Retourne le nom de l'artiste d'un tag ID3
Retourne le nom de l'artiste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le nom de l'artiste.
(0.0.1)
KTaglib_Tag::getComment — Retourne le commentaire d'un tag ID3
Retourne le commentaire d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le commentaire.
(0.0.1)
KTaglib_Tag::getGenre — Retourne le genre d'un tag ID3
Retourne le genre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le genre.
(0.0.1)
KTaglib_Tag::getTitle — Retourne le titre d'un tag ID3
Retourne le titre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le titre.
(0.0.1)
KTaglib_Tag::getTrack — Retourne le numéro de la piste d'un tag ID3
Retourne le numéro de la piste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne le numéro de la piste, sous la forme d'un entier.
(0.0.1)
KTaglib_Tag::getYear — Retourne l'année d'un tag ID3
Retourne l'année d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne l'année, sous la forme d'un entier.
(0.0.1)
KTaglib_Tag::isEmpty — Retourne TRUE si le tag est vide
Retourne TRUE si le tag existe mais qu'il est vide. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.
Retourne TRUE si le tag est vide, FALSE sinon.
Représente un tag ID3v2. Elle fournit une liste des frames ID3v2 et peut être utilisée pour ajouter ou effacer des frames.
(0.0.1)
KTaglib_ID3v2_Tag::addFrame — Ajoute une frame à un tag ID3v2
Ajoute une frame à un tag ID3v2. La frame doit être un objet KTagLib_ID3v2_Frame valide. Pour sauvegarder la frame, la fonction de sauvegarde doit être appelée.
Retourne TRUE en cas de succès, FALSE sinon.
(0.0.1)
KTaglib_ID3v2_Tag::getFrameList — Retourne un tableau de frames ID3v2, associées avec un tag ID3v2
Retourne un tableau de frames ID3v2, associées au tag ID3v2.
Retourne un tableau d'objets KTaglib_ID3v2_Frame.
La classe de base pour les frames ID3v2. Les tags ID3v2 sont séparés en plusieurs frames spécialisés. Quelques frames peuvent être présents plusieurs fois.
(0.0.1)
KTaglib_ID3v2_Frame::getSize — Retourne la taille de la frame, en octets
Retourne la taille de la frame, en octets. Reportez-vous au site id3.org pour savoir comment sont les frames et comment elles sont définies.
Retourne la taille de la frame, en octets.
(0.0.1)
KTaglib_ID3v2_Frame::__toString — Retourne une chaîne représentant la frame
Retourne une chaîne représentant la frame. Ce peut être uniquement l'identifiant de la frame, mais cette chaîne peut également contenir d'autres informations. Reportez-vous à la documentation de ktaglib pour plus d'informations.
Retourne une chaîne représentant la frame.
Représente une frame ID3v2 qui peut contenir une image.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::getDescription — Retourne une description de l'image contenu dans la frame spécialisée
Retourne la description attachée à une frame contenant une image, dans une frame ID3v2.x.
Retourne une description de l'image.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getMimeType — Retourne le type MIME de l'image
Retourne le type MIME de l'image présente dans la frame spécialisée.
Notez que cette méthode peut retourner différents types. Alors que les tags ID3v2.2 contiennent un type MIME qui ne commencent pas par "image/", les tags ID3v2.3 et v2.4 commencent eux par "image/". Aussi, cette méthode peut retourner "image/png" pour les tags IDv2.3 et uniquement "PNG" pour les tags ID3v2.2.
Notez également que, malgré le fait qu'une image soit attachée, le type MIME peut ne pas avoir été défini, et ainsi, une chaîne vide peut être retournée.
Retourne le type MIME de l'image.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::getType — Retourne le type d'une image
Retourne le type d'une image.
La spécification ID3v2 autorise un AttachedPictureFrame à définir une image. Cela peut être, i.e. FrontCover ou FileIcon. Reportez-vous à la description de la classe KTagLib_ID3v2_AttachedPictureFrame pour une liste des types disponibles.
Retourne un entier représentant le type de l'image.
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::savePicture — Sauvegarde une image dans un fichier
Sauvegarde l'image attachée dans un fichier donné.
Retourne TRUE en cas de succès, FALSE sinon.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setMimeType — Définit le type MIME d'une image
Définit le type MIME d'une image. C'est, en général, "image/png" ou "image/jpeg".
(0.0.1)
KTaglib_ID3v2_AttachedPictureFrame::setPicture — Définit le tag image en une image donnée
Définit le tag image en une image donnée. L'image est chargée depuis le fichier fourni. Notez que l'image n'est sauvegardée que lors de l'appel à la méthode de sauvegarde de l'objet fichier correspondant.
Retourne TRUE en cas de succès, FALSE si une erreur survient.
(0.2.0)
KTaglib_ID3v2_AttachedPictureFrame::setType — Définit le type de l'image
Définit le type de l'image. Ce peut être FrontCover ou FileIcon. Reportez-vous à la description de la classe KTaglib_ID3v2_AttachedPictureFrame pour une liste de types disponibles ainsi que leurs constantes correspondantes.
Le format de fichier OGG/Vorbis, comme définit par » http://www.vorbis.com/, est un schéma pour la compression de flux audio par de multiples facteurs avec un minimum de perte de qualité. Cette extension ajoute le support Ogg Vorbis aux gestionnaires d'URL de PHP. Lorsqu'utilisé en mode lecture, les données compressées OGG/Vorbis sont déployées en audio PCM brute en un des six formats d'encodage PCM listés ci-dessous.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/oggvorbis
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Définition |
|---|---|
| OGGVORBIS_PCM_U8 | PCM 8-bit non-signé. |
| OGGVORBIS_PCM_S8 | PCM 8-bit signé. |
| OGGVORBIS_PCM_U16_LE | PCM 16-bit non-signé. Arrangements normaux Little Endian. |
| OGGVORBIS_PCM_U16_BE | PCM 16-bit non-signé. Arrangements normaux Big Endian. |
| OGGVORBIS_PCM_S16_LE | PCM 16-bit signé. Arrangements normaux Little Endian. |
| OGGVORBIS_PCM_S16_BE | PCM 16-bit signé. Arrangements normaux Big Endian. |
| Option | Définition | Pertinence | Défaut |
|---|---|---|---|
| pcm_mode | Encodage PCM utilisé. Voir les constantes ci-dessous. | Lecture / Écriture | OGGVORBIS_PCM_S16_LE |
| rate | Taux d'échantillonnage PCM. Mesuré en Hz. | Écriture uniquement | 44100 |
| bitrate | Débit d'encodage moyen Vorbis / Débit d'encodage variable. Mesuré en bps (ABR) ou en niveau de qualité (VBR : 0.0 à 1.0). 128000 ABR équivaut à 0.4 VBR. | Écriture uniquement | 128000 |
| channels | Nombre de canaux PCM. 1 == Mono, 2 == Stéréo. | Écriture uniquement | 2 |
| serialno | Nombre de séries de flux dans un fichier. Doit être unique dans un fichier. Parce qu'il est potentiellement possible de sélectionner plusieurs nombres de séries dans un fichier chaîné, faites l'effort d'assigner manuellement des nombres uniques lors de l'encodage. | Écriture uniquement | Random |
| comments | Tableau associatif de commentaires de fichier. Peut être traduit par strtoupper($name) . "=$value". Note : cette option de contexte n'est pas disponible en oggvorbis 0.1 | Écriture uniquement | array('ENCODER' => 'PHP/OggVorbis, http://pear.php.net/oggvorbis') |
Exemple #1 Lecture d'un fichier OGG/Vorbis
<?php
dl("oggvorbis.so");
/* Par défaut, ogg:// décodera en 16-bit signé, en mode Little Endian */
$fp = fopen('ogg://monaudio.ogg', 'r');
/* Collecte quelques informations sur le fichier. */
$metadata = stream_get_meta_data($fp);
/* Inspection de la première chanson (habituellement la seule chanson
mais les fichiers OGG/Vorbis peuvent être chaînés) */
$songdata = $metadata['wrapper_data'][0];
echo "Fichier OGG/Vorbis encodé par : {$songdata['vendor']}\n.";
echo " {$songdata['channels']} canaux de {$songdata['rate']}Hz encodé à {$songdata['bitrate_nominal']}bps.\n";
foreach($songdata['comments'] as $comment) {
echo " $comment\n";
}
while ($audio_data = fread($fp, 8192)) {
/* Faire quelque chose avec l'audio PCM extrait depuis le OGG.
Copier vers /dev/dsp est une bonne chose sur les systèmes linux,
souvenez-vous juste de définir le périphérique pour votre mode d'échantillonage d'abord. */
}
fclose($fp);
?>
Exemple #2 Encoder un fichier audio en OGG/Vorbis
<?php
dl('oggvorbis.so');
$context = stream_context_create(array('ogg'=>array(
'pcm_mode' => OGGVORBIS_PCM_S8, /* audio 8bit signé */
'rate' => 44100, /* Qualité CD 44kHz */
'bitrate' => 0.5, /* Qualité moyenne VBR */
'channels' => 1, /* Mono */
'serialno' => 12345))); /* Unique dans notre flux */
/* Ouverture d'un fichier pour un ajout. Ceci permet de "chaîner" un deuxième flux OGG à la fin du premier. */
$ogg = fopen('ogg://machanson.ogg', 'a', false, $context);
$pcm = fopen('mysample.pcm', 'r');
/* Compression de l'audio brute PCM depuis mysample.pcm vers machanson.ogg */
stream_copy_to_stream($pcm, $ogg);
fclose($pcm);
fclose($ogg);
?>
Plate-forme indépendante pour la gestion de l'audio. Requiert la bibliothèque » OpenAL.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Cette extension » PECL n'est pas intégrée à PHP.
Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/openal.
Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension définie quatre types de ressource : Open AL(Device) - Retournée par openal_device_open(), Open AL(Context) - Retournée par openal_context_create(), Open AL(Buffer) - Retournée par openal_buffer_create(), et Open AL(Source) - Retournée par openal_source_create().
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
(PECL openal >= 0.1.0)
openal_buffer_create — Génère un buffer OpenAL
openal_buffer_create() retourne une ressource Open AL(Buffer) ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_buffer_data — Charge un buffer avec des données
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
Format du paramètre data , un parmi ceux-là : AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 et AL_FORMAT_STEREO16.
Bloc de données binaires audio dans le format spécifié format et freq .
Fréquence des données data , en Hz.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_buffer_destroy — Détruit un buffer OpenAL
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_buffer_get — Récupère les propriétés du buffer OpenAL
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
Une propriété spécifique, une parmi celles-ci : AL_FREQUENCY, AL_BITS, AL_CHANNELS et AL_SIZE.
Retourne une valeur entière appropriée à la demande property ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_buffer_loadwav — Charge un fichier .wav dans le buffer
Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).
Chemin vers le fichier .wav sur le système de fichier local.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_context_create — Crée un contexte de traitement audio
Une ressource Open AL(Device) (précédemment créée par openal_device_open()).
Retourne une ressource Open AL(Context) ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_context_current — Rend courant le contexte spécifié
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_context_destroy — Détruit un contexte
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_context_process — Traite le contexte spécifié
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_context_suspend — Suspend le contexte spécifié
Une ressource Open AL(Context) (précédemment créée par openal_context_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_device_close — Ferme un périphérique OpenAL
Une ressource Open AL(Device) (précédemment créée par openal_device_open()) à fermer.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_device_open — Initialise une interface audio OpenAL
openal_device_open() ouvre un périphérique audio optionnellement spécifié par le paramètre device_desc . Si le paramètre device_desc n'est pas spécifié, le premier périphérique audio disponible sera utilisé.
Retourne une ressource Open AL(Device) ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_listener_get — Récupère une propriété d'auditeur
Retourne un nombre décimal ou un tableau de nombres à virgule flottante ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_listener_set — Définie une propriété d'auditeur
La propriété à définir, une parmi celles-ci : AL_GAIN (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)) et AL_ORIENTATION (array(float,float,float)).
La valeur à définir, soit un nombre décimal, soit un tableau de nombres à virgule flottante appropriés.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_create — Génère une ressource de source
Retourne une ressource Open AL(Source) ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_source_destroy — Détruit une ressource de source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_get — Récupère une propriété de source OpenAL
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Propriété à récupérer, une parmi celles-ci : AL_SOURCE_RELATIVE (entier), AL_SOURCE_STATE (entier), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).
Retourne le type associé avec la propriété récupérée ou FALSE en cas d'erreur.
(PECL openal >= 0.1.0)
openal_source_pause — Marque une pause dans la source
Une ressource Open AL(Source) (précédemment créée avec openal_source_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_play — Démarre la lecture de la source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_rewind — Revient en arrière dans la source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_set — Définie une propriété de la source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
La propriété à définir, une parmi celles-ci : AL_BUFFER (OpenAL(Source)), AL_LOOPING (boolean), AL_SOURCE_RELATIVE (int), AL_SOURCE_STATE (int), AL_PITCH (float), AL_GAIN (float), AL_MIN_GAIN (float), AL_MAX_GAIN (float), AL_MAX_DISTANCE (float), AL_ROLLOFF_FACTOR (float), AL_CONE_OUTER_GAIN (float), AL_CONE_INNER_ANGLE (float), AL_CONE_OUTER_ANGLE (float), AL_REFERENCE_DISTANCE (float), AL_POSITION (array(float,float,float)), AL_VELOCITY (array(float,float,float)), AL_DIRECTION (array(float,float,float)).
La valeur à assigner à la propriété spécifiée par le paramètre property . Référez-vous à la description de la propriété property pour une description des valeurs attendues.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_source_stop — Arrête la lecture de la source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL openal >= 0.1.0)
openal_stream — Démarre le streaming d'une source
Une ressource Open AL(Source) (précédemment créée par openal_source_create()).
Le format du paramètre data , un parmi ceux-là : AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 et AL_FORMAT_STEREO16.
La fréquence des données à streamer, en Hz.
Retourne une ressource de streaming ou FALSE en cas d'erreur.
Ce paquet vous permet d'accéder à l'administration des serveurs Kerberos V. Vous pourrez créer, modifier et effacer les directives et les éléments principaux Kerberos V.
Plus d'informations à propos de Kerberos peuvent être trouvées sur » http://web.mit.edu/kerberos/www/.
La documentation sur Kerberos et KADM5 peut être trouvée sur » http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.8/doc/admin_toc.html.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Ces fonctions vous permettent d'accéder aux serveurs d'administration de Kerberos. Afin de pouvoir les utiliser, vous devez compiler PHP avec le support KADM5, en utilisant l'option de configuration --with-kadm5. Si vous utilisez cette option sans spécifier le chemin vers KADM5, PHP utilisera les bibliothèques clientes internes de KADM5. Les utilisateurs qui exécutent d'autres applications qui utilisent également KADM5 (par exemple, l'exécution de PHP 4 et PHP 5 comme modules apache concurrent, ou auth-kadm5), doivent également spécifier le chemin vers KADM5 : --with-kadm5=/path/to/kadm5. Ceci forcera PHP à utiliser les bibliothèques clientes installées par KADM5, évitant ainsi les conflits.
Cette extension ne définit aucune directive de configuration.
Cette extension définit un gestionnaire KADM5 retourné par la fonction kadm5_init_with_password().
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Les fonctions kadm5_create_principal(), kadm5_modify_principal() et kadm5_modify_principal() vous permettent de spécifier des attributs spéciaux utilisant un champ de bits. Les symboles sont définis ci-dessous :
| constante |
|---|
| KRB5_KDB_DISALLOW_POSTDATED |
| KRB5_KDB_DISALLOW_FORWARDABLE |
| KRB5_KDB_DISALLOW_TGT_BASED |
| KRB5_KDB_DISALLOW_RENEWABLE |
| KRB5_KDB_DISALLOW_PROXIABLE |
| KRB5_KDB_DISALLOW_DUP_SKEY |
| KRB5_KDB_DISALLOW_ALL_TIX |
| KRB5_KDB_REQUIRES_PRE_AUTH |
| KRB5_KDB_REQUIRES_HW_AUTH |
| KRB5_KDB_REQUIRES_PWCHANGE |
| KRB5_KDB_DISALLOW_SVR |
| KRB5_KDB_PWCHANGE_SERVER |
| KRB5_KDB_SUPPORT_DESMD5 |
| KRB5_KDB_NEW_PRINC |
Les fonctions kadm5_create_principal(), kadm5_modify_principal() et kadm5_get_principal() permettent de spécifier ou retourner les options des éléments principaux en tant que tableaux associatifs. Les clés pour le tableau associatif sont définies en tant que constantes ci-dessous :
| constante | type | description |
|---|---|---|
| KADM5_PRINCIPAL | long | Le délai d'expiration des éléments principaux en tant que timestamp Kerberos. |
| KADM5_PRINC_EXPIRE_TIME | long | Le délai d'expiration des éléments principaux en tant que timestamp Kerberos. |
| KADM5_LAST_PW_CHANGE | long | Le délai pendant lequel le mot de passe du principal a été changé pour la dernière fois. |
| KADM5_PW_EXPIRATION | long | Le délai d'expiration du mot de passe du principal courant, en tant que timestamp Kerberos. |
| KADM5_MAX_LIFE | long | La durée de vie maximale de tous les tickets Kerberos issus de ce principal. |
| KADM5_MAX_RLIFE | long | La durée maximale renouvelable de tous les tickets Kerberos issus de ce principal. |
| KADM5_MOD_NAME | string | Le nom du principal Kerberos qui a modifié ce principal le plus récemment. |
| KADM5_MOD_TIME | long | L'heure à laquelle ce principal a été modifié pour la dernière fois, en tant que timestamp Kerberos. |
| KADM5_KVNO | long | La version de la clé courante du principal. |
| KADM5_POLICY | string | Le nom de la directive contrôlant ce principal. |
| KADM5_CLEARPOLICY | long | La procédure standard servant à assigner la directive par défaut pour créer des éléments principaux. KADM5_CLEARPOLICY supprime ce comportement. |
| KADM5_LAST_SUCCESS | long | L'heure KDC de la dernière AS_REQ qui a réussi. |
| KADM5_LAST_FAILED | long | L'heure KDC de la dernière AS_REQ qui a échoué. |
| KADM5_FAIL_AUTH_COUNT | long | Le nombre d'échec récursif AS_REQs. |
| KADM5_RANDKEY | long | Génère un mot de passe aléatoire pour le principal. Le paramètre password sera ignoré. |
| KADM5_ATTRIBUTES | long | Un champ de bits d'attributs à utiliser par KDC. |
Cet exemple simple montre comment se connecter, interroger, imprimer les éléments principaux et se déconnecter depuis une base de données KADM5.
Exemple #1 Exemple général de l'extension KADM5
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
$principals = kadm5_get_principals($handle);
for( $i=0; $i<count($principals); $i++)
print "$principals[$i]<br>\n";
print "<h1>get_policies</h1>\n";
$policies = kadm5_get_policies($handle);
for( $i=0; $i<count($policies); $i++)
print "$policies[$i]<br>\n";
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
$keys = array_keys($options);
for( $i=0; $i<count($keys); $i++) {
$value = $options[$keys[$i]];
print "$keys[$i]: $value<br>\n";
}
$options = array(KADM5_PRINC_EXPIRE_TIME => 0);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_chpass_principal — Modifie le mot de passe du principal
kadm5_chpass_principal() définit un nouveau mot de passe password pour le principal .
Un gestionnaire KADM5.
Le principal.
Le nouveau mot de passe.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple de modification du mot de passe du principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_chpass_principal($handle, "burbach@GONICUS.LOCAL", "newpassword");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_create_principal — Crée un principal kerberos avec les paramètres donnés
kadm5_create_principal() crée un principal avec le mot de passe password donné.
Un gestionnaire KADM5.
Le principal.
Si password n'est pas spécifié ou s'il vaut NULL, une clé aléatoire sera générée.
Il est possible de spécifier plusieurs paramètres optionnels avec le tableau options . Les options suivantes sont autorisées : KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_KVNO, KADM5_POLICY, KADM5_CLEARPOLICY, KADM5_MAX_RLIFE.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple de création d'un principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_delete_principal — Efface un principal kerberos
Efface un principal depuis la base de données Kerberos.
Un gestionnaire KADM5.
Le principal à effacer.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec kadm5_delete_principal()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
kadm5_delete_principal($handle, "burbach@GONICUS.LOCAL");
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_destroy — Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées
Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées.
Un gestionnaire KADM5.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL kadm5 >= 0.2.3)
kadm5_flush — Valide toutes les modifications de la base de données Kerberos
Valide toutes les modifications de la base de données Kerberos, et quitte la connexion ouverte du serveur d'administration Kerberos
Un gestionnaire KADM5.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL kadm5 >= 0.2.3)
kadm5_get_policies — Récupère toutes les directives depuis la base de données Kerberos
Récupère un tableau contenant tous les noms des directives.
Un gestionnaire KADM5.
Retourne un tableau de directives en cas de succès, ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_policies()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_policies</h1>\n";
foreach (kadm5_get_policies($handle) as $policy) {
echo "$policy<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principal — Récupère les entrées des éléments principaux depuis la base de données Kerberos
Récupère les entrées des éléments principaux depuis la base de données Kerberos.
Un gestionnaire KADM5.
Le principal.
kadm5_get_principal() retourne un tableau associatif contenant les clés suivantes : KADM5_PRINCIPAL, KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_MOD_NAME, KADM5_MOD_TIME, KADM5_KVNO, KADM5_POLICY, KADM5_MAX_RLIFE, KADM5_LAST_SUCCESS, KADM5_LAST_FAILED, KADM5_FAIL_AUTH_COUNT. en cas de succès, ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_principal()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principal burbach@GONICUS.LOCAL</h1>\n";
$options = kadm5_get_principal($handle, "burbach@GONICUS.LOCAL" );
foreach ($options as $key => $value) {
echo "$key: $value<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_get_principals — Récupère tous les éléments principaux depuis la base de données Kerberos
kadm5_get_principals() retourne un tableau contenant tous les noms des éléments principaux.
A KADM5 handle.
Retourne un tableau d'éléments principaux en cas de succès, ou FALSE si une erreur survient.
Exemple #1 Exemple avec kadm5_get_principals()
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
print "<h1>get_principals</h1>\n";
foreach (kadm5_get_principals($handle) as $principal) {
echo "$principal<br />\n";
}
kadm5_destroy($handle);
?>
(PECL kadm5 >= 0.2.3)
kadm5_init_with_password — Ouvre une connexion à la bibliothèque KADM5
Ouvre une connexion avec la bibliothèque KADM5 en utilisant le principal et le mot de passe password pour obtenir les créances initiales depuis le serveur d'administration admin_server .
Le serveur.
Définit le domaine d'identification pour la connexion.
Le principal.
Si password est omis ou s'il vaut NULL, une clé aléatoire sera générée.
Retourne un gestionnaire KADM5 en cas de succès, ou FALSE si une erreur survient.
Exemple #1 Exemple d'initialisation KADM5
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH | KRB5_KDB_DISALLOW_PROXIABLE;
$options = array(KADM5_PRINC_EXPIRE_TIME => 0,
KADM5_POLICY => "default",
KADM5_ATTRIBUTES => $attributes);
kadm5_create_principal($handle, "burbach@GONICUS.LOCAL", "password", $options);
kadm5_destroy($handle);
?>
Note: La connexion doit être close après l'avoir utilisée avec la fonction kadm5_destroy().
(PECL kadm5 >= 0.2.3)
kadm5_modify_principal — Modifie un principal Kerberos avec les paramètres donnés
Modifie un principal Kerberos avec les paramètres donnés
Un gestionnaire KADM5.
Le principal.
Il est possible de spécifier plusieurs paramètres optionnels avec un tableau d'options . Les options suivantes sont autorisées : KADM5_PRINC_EXPIRE_TIME, KADM5_PW_EXPIRATION, KADM5_ATTRIBUTES, KADM5_MAX_LIFE, KADM5_KVNO, KADM5_POLICY, KADM5_CLEARPOLICY, KADM5_MAX_RLIFE. KADM5_FAIL_AUTH_COUNT.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple de modification d'un principal
<?php
$handle = kadm5_init_with_password("afs-1", "GONICUS.LOCAL", "admin/admin", "password");
$attributes = KRB5_KDB_REQUIRES_PRE_AUTH;
$options = array(KADM5_PRINC_EXPIRE_TIME => 3451234,
KADM5_POLICY => "gonicus",
KADM5_ATTRIBUTES => $attributes);
kadm5_modify_principal($handle, "burbach@GONICUS.LOCAL", $options);
kadm5_destroy($handle);
?>
Ce paquet est basé sur la bibliothèque libradius (Remote Authentication Dial In User Service) de FreeBSD. Il permet aux clients d'effectuer des identification et représentations par le biais de requêtes réseau sur des serveurs distants.
Cette extension PECL supporte tout le protocole Radius Authentication complet pour les identifications (» RFC 2865) et Radius Accounting (» RFC 2866). Ce paquet est disponible pour Unix (testé sous FreeBSD et Linux) mais aussi pour Windows.
Note: Une description de libradius peut être trouvée » ici. Une description détaillée du fichier de configuration peut être trouvée » ici.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Comment installer le paquetage ?
ou, si vous voulez l'avoir en .so :
Pour Windows, je vous recommande d'utiliser la bibliothèque php_radius.dll depuis » http://snaps.php.net/. Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Type de service :
Protocole encadré :
Compression :
Type du port NAS :
Type de statut du compte :
Accounting authentic, un parmi :
Accounting terminate cause, un parmi :
Attributs spécifiques à Microsoft (» RFC 2548) :
Comment commencer ?
Regardez également aux exemples fournis avec ce paquet.
Le paquet contient un exemple de script PHP. Ce script montre une identification avec radius, en utilisant PAP ou CHAP (md5). Si vous effectuer une identification via Microsoft Radius servers, alors il est possible d'utiliser CHAP (md5). Si vous voulez vous identifier avec Microsoft Servers, vous devez utiliser MS-CHAPv1 ou MS-CHAPv2, mais c'est plus compliqué, car vous devez avoir md4, sha1 et des pour générer les bonnes données. L'exemple fourni montre toutes les méthodes d'identification, incluant MS-CHAPv1 et MS-CHAPv2. Pour faire en sorte que MS-CHAP fonctionne, vous devez activer les extensions mcrypt et mhash, à partir de la version 1.2 de ce paquet, l'extension mcrypt n'est plus nécessaire.
Si vous avez des commentaires, des corrections de bogues, des améliorations ou si vous voulez aider dans le développement, vous pouvez envoyer un email à » mbretter@php.net.
(PECL radius >= 1.1.0)
radius_acct_open — Crée une ressource Radius pour les comptes
Retourne une ressource en cas de succès ou FALSE si une erreur survient. Cette fonction n'échoue que s'il y a un manque de mémoire.
Exemple #1 Exemple avec radius_acct_open()
<?php
$res = radius_acct_open ()
or die ("Impossible de créer la ressource");
print("La ressource a été créée avec succès");
?>
(PECL radius >= 1.1.0)
radius_add_server — Ajoute un serveur
radius_add_server() peut être utilisé plusieurs fois, et il peut être utilisé avec la fonction radius_config(). Tout au plus, 10 serveurs peuvent être spécifiés. Lorsque plusieurs serveurs sont fournis, ils sont essayés à la façon round-robin tant qu'une réponse valide n'est pas reçue, ou tant que la limite max_tries de chaque serveur n'est pas atteinte.
Le paramètre hostname spécifie l'hôte serveur, soit en tant que nom de domaine qualifié, soit en tant qu'adresse IP.
Le port
spécifie le port UDP à
contacter sur le serveur. Si le port donné vaut 0, la bibliothèque
recherchera le service radius/udp
ou
radacct/udp
dans la base de données des services du réseau et utilisera le port
s'y trouvant. Si aucune entrée n'est trouvée, la bibliothèque utilisera les ports
Radius standards, 1812 pour l'identification et 1813 pour les comptes.
Le secret partagé pour l'hôte serveur est passé au paramètre secret . Le protocole Radius ignore tout mais garde les 128 premiers octets du secret partagé.
Le délai limite pour recevoir les réponses du serveur est passé au paramètre timeout , sous la forme de seconde.
Le nombre maximal de requêtes répétées à faire avant d'échouer.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_add_server()
<?php
if (!radius_add_server($res, 'radius.example.com', 1812, 'testing123', 3, 3)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br>";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_auth_open — Crée une ressource Radius pour l'identification
Retourne une ressource en cas de succès ou FALSE si une erreur survient. Cette fonction n'échoue que s'il y a un manque de mémoire.
Exemple #1 Exemple avec radius_auth_open()
<?php
$radh = radius_auth_open()
or die ("Impossible de créer la ressource");
echo "La ressource a été créée avec succès";
?>
(PECL radius >= 1.1.0)
radius_close — Libère toutes les ressources Radius
Il n'est pas nécessaire d'appeler cette fonction car PHP libère toutes les ressources à la fin de chaque demande.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_config — Demande à la bibliothèque de lire un fichier de configuration donné
Avant toute demande Radius, la bibliothèque doit connaître le serveur à contacter. La manière simple de configurer la bibliothèque est d'appeler la fonction radius_config(). radius_config() demande à la bibliothèque de lire un fichier de configuration dont le format est décrit sur la page » radius.conf.
Le chemin vers le fichier de configuration est passé en tant qu'argument à la fonction radius_config(). La bibliothèque peut également être configurée en appelant la fonction radius_add_server().
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_create_request — Crée une demande de compte ou d'identification
Une demande Radius consiste en du code spécifiant une demande spécifique, ainsi que zéro ou plusieurs attributs qui fournissent des informations supplémentaires. Pour commencer à construire une nouvelle demande, appelez la fonction radius_create_request().
Note: Attention : Vous devez appeler cette fonction avant de passer n'importe quel argument !
Le type est RADIUS_ACCESS_REQUEST ou RADIUS_ACCOUNTING_REQUEST.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_create_request()
<?php
if (!radius_create_request($res, RADIUS_ACCESS_REQUEST)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_cvt_addr — Convertit des données brutes en adresse IP
Exemple #1 Exemple avec radius_cvt_addr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_IP_ADDRESS:
$ip = radius_cvt_addr($data);
echo "IP : $ip<br>\n";
break;
case RADIUS_FRAMED_IP_NETMASK:
$mask = radius_cvt_addr($data);
echo "MASQUE : $mask<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_int — Convertit des données brutes en entier
Exemple #1 Exemple avec radius_cvt_int()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FRAMED_MTU:
$mtu = radius_cvt_int($data);
echo "MTU : $mtu<br>\n";
break;
}
}
?>
(PECL radius >= 1.1.0)
radius_cvt_string — Convertit des données brutes en chaîne de caractères
Exemple #1 Exemple avec radius_cvt_string()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération des attributs : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
switch ($attr) {
case RADIUS_FILTER_ID:
$id = radius_cvt_string($data);
echo "Filtre ID : $id<br>\n";
break;
}
}
?>
(PECL radius >= 1.2.0)
radius_demangle_mppe_key — Dérive les clés mppe depuis des données
Lors de l'utilisation de MPPE avec MS-CHAPv2, les clés reçues et envoyées sont "séchées" (voir la » RFC 2548), cependant, cette fonction est utile, car je ne sais pas s'il y a ou pas une implémentation de PPTP-MPPE dans PHP.
Retourne la chaîne ou FALSE si une erreur survient.
(PECL radius >= 1.2.0)
radius_demangle — Assèche des données
Quelques données (mots de passe, clés MS-CHAPv1 MPPE) sont "séchées" pour des raisons de sécurité et doivent être "asséchées" avant de pouvoir les utiliser.
Retourne la chaîne "asséchées" ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_get_attr — Extrait un attribut
Comme les demandes Radius, chaque réponse doit contenir zéro ou plusieurs attributs. Après la réception d'une réponse avec succès par la fonction radius_send_request(), ces attributs peuvent être extraits un par un en utilisant la fonction radius_get_attr(). À chaque appel de radius_get_attr(), le prochain attribut est récupéré depuis la réponse courante.
Retourne un tableau associatif contenant le type de l'attribut ainsi que les données ou un numéro d'erreur <= 0.
Exemple #1 Exemple avec radius_get_attr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf("Erreur lors de la récupération de l'attribut : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Attribut récupéré :%d %d octets %s\n", $attr, strlen($data), bin2hex($data));
}
?>
(PECL radius >= 1.1.0)
radius_get_vendor_attr — Extrait un attribut spécifique au vendeur
Si radius_get_attr() retourne RADIUS_VENDOR_SPECIFIC, radius_get_vendor_attr() peut être appelé pour déterminer le vendeur.
Retourne un tableau associatif contenant le type de l'attribut, le vendeur ainsi que les données, ou FALSE si une erreur survient.
Exemple #1 Exemple avec radius_get_vendor_attr()
<?php
while ($resa = radius_get_attr($res)) {
if (!is_array($resa)) {
printf ("Erreur lors de la récupération de l'attribut : %s\n", radius_strerror($res));
exit;
}
$attr = $resa['attr'];
$data = $resa['data'];
printf("Attribut récupéré :%d %d octets %s\n", $attr, strlen($data), bin2hex($data));
if ($attr == RADIUS_VENDOR_SPECIFIC) {
$resv = radius_get_vendor_attr($data);
if (is_array($resv)) {
$vendor = $resv['vendor'];
$attrv = $resv['attr'];
$datav = $resv['data'];
printf("Récupération du vendeur de l'attribut :%d %d octets %s\n", $attrv, strlen($datav), bin2hex($datav));
}
}
}
?>
(PECL radius >= 1.1.0)
radius_put_addr — Attache une adresse IP en tant qu'attribut
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_put_attr — Attache un attribut binaire
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_put_attr()
<?php
mt_srand(time());
$chall = mt_rand();
$chapval = md5(pack('Ca*',1 , 'sepp' . $chall));
$pass = pack('CH*', 1, $chapval);
if (!radius_put_attr($res, RADIUS_CHAP_PASSWORD, $pass)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_int — Attache un attribut entier
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_put_int()
<?php
if (!radius_put_int($res, RAD_FRAMED_PROTOCOL, RAD_PPP)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_string — Attache un attribut chaîne de caractères
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_put_string()
<?php
if (!radius_put_string($res, RADIUS_USER_NAME, 'billy')) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_addr — Attache un attribut IP-Address spécifique à un vendeur
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_put_vendor_attr — Attache un attribut binaire à un vendeur spécifique
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Exemple #1 Exemple avec radius_put_vendor_attr()
<?php
if (!radius_put_vendor_attr($res, RADIUS_VENDOR_MICROSOFT, RAD_MICROSOFT_MS_CHAP_CHALLENGE, $challenge)) {
echo 'Erreur Radius :' . radius_strerror($res). "\n<br />";
exit;
}
?>
(PECL radius >= 1.1.0)
radius_put_vendor_int — Attache un attribut entier à un vendeur spécifique
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_put_vendor_string — Attache un attribut sous la forme d'une chaîne à un vendeur spécifique
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
(PECL radius >= 1.1.0)
radius_request_authenticator — Retourne l'identifiant demandé
L'identifiant demandé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.
Retourne l'identificateur demandé en tant que chaîne de caractères ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_send_request — Envoie la demande et attente une réponse
Après qu'une demande Radius ait été construite, elle est envoyé grâce à la fonction radius_send_request().
La fonction radius_send_request() envoie la requête et attend une réponse valide, essayant à nouveau, suivant la méthode round-robin autant que nécessaire.
Si une réponse valide est reçue, radius_send_request() retourne le code Radius qui spécifie le type de réponse. C'est, typiquement, RADIUS_ACCESS_ACCEPT, RADIUS_ACCESS_REJECT ou RADIUS_ACCESS_CHALLENGE. Si aucune réponse valide n'est reçue, radius_send_request() retournera FALSE.
(PECL radius >= 1.1.0)
radius_server_secret — Retourne le secret partagé
Le secret partagé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.
Retourne le secret partagé du serveur en tant que chaîne de caractères ou FALSE si une erreur survient.
(PECL radius >= 1.1.0)
radius_strerror — Retourne un message d'erreur
Si une fonction Radius échoue, alors, elle enregistre un message d'erreur. Ce message d'erreur peut être récupéré avec cette fonction.
Retourne un message d'erreur en tant que chaîne de caractères.
L'extension Calendar contient une série de fonctions afin de convertir simplement les différents formats de calendrier. Elles sont basées sur un comptage de jour Julien. Le comptage Julien est un comptage commençant le 1er Janvier 4713 A.J. Pour convertir les différents calendriers, vous devez tout d'abord convertir en nombre de jours Julien, puis, dans le type de calendrier de votre choix. Le comptage de jours Julien est très différent du calendrier Julien ! Pour plus d'informations sur le comptage en jours Julien, visitez cette page : » http://www.hermetic.ch/cal_stud/jdn.htm. Pour plus d'informations sur les différents calendriers, visitez cette page : » http://www.fourmilab.ch/documents/calendar/.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Pour faire fonctionner ces fonctions avec PHP, vous devez le compiler avec l'option --enable-calendar.
La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.
Cette extension ne définit aucune directive de configuration.
Cette extension ne définit aucune ressource.
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
Les constantes suivantes sont disponibles depuis PHP 4.3.0 :
Les constantes suivantes sont disponibles depuis PHP 5.0.0 :
(PHP 4 >= 4.1.0, PHP 5)
cal_days_in_month — Retourne le nombre de jours dans un mois, pour une année et un calendrier donné
Retourne le nombre de jours dans le mois month de l'année year , pour le calendrier calendar .
Calendrier à utiliser pour le calcul
Mois dans le calendrier sélectionné
Année dans le calendrier sélectionné
Le nombre de jours dans le mois sélectionné, dans le calendrier fourni.
Exemple #1 Exemple avec cal_days_in_month()
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "Il y a $num jours en Août 2003";
?>
(PHP 4 >= 4.1.0, PHP 5)
cal_from_jd — Convertit le nombre de jours Julien en un calendrier spécifique
cal_from_jd() convertit le nombre de jours Julien jd en une date du calendrier calendar . Les valeurs possibles pour calendar sont CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH et CAL_FRENCH.
Retourne un tableau contenant des informations sur le calendrier, comme le mois, le jour, l'année, le jour de la semaine, les noms abrégés et complets des jours de la semaine et du mois, et la date, sous la forme d'une chaîne de caractères "mois/jour/année".
Exemple #1 Exemple avec cal_from_jd()
<?php
$today = unixtojd(mktime(0, 0, 0, 8, 16, 2003));
print_r(cal_from_jd($today, CAL_GREGORIAN));
?>
L'exemple ci-dessus va afficher :
Array ( [date] => 8/16/2003 [month] => 8 [day] => 16 [year] => 2003 [dow] => 6 [abbrevdayname] => Sat [dayname] => Saturday [abbrevmonth] => Aug [monthname] => August )
(PHP 4 >= 4.1.0, PHP 5)
cal_info — Retourne des détails sur un calendrier
cal_info() retourne des informations sur le calendrier calendar spécifié.
Les informations de calendriers sont retournées dans un tableau qui contient les éléments calname, calsymbol, month, abbrevmonth et maxdaysinmonth. Les noms des différents calendriers qui peuvent être utilisés dans le paramètre calendar sont les suivants :
Si le paramètre calendar n'est pas spécifié, un tableau représentant tous les calendriers est retourné.
Calendrier dont on souhaite des informations. Si aucun calendrier n'est spécifié, des informations sur tous les calendriers seront retournées.
| Version | Description |
|---|---|
| Since 5.0 | Le paramètre calendar devient optionnel et vaut par défaut "tous calendriers" s'il n'est pas spécifié. |
Exemple #1 Exemple avec cal_info()
<?php
$info = cal_info(0);
print_r($info);
?>
L'exemple ci-dessus va afficher :
Array
(
[months] => Array
(
[1] => January
[2] => February
[3] => March
[4] => April
[5] => May
[6] => June
[7] => July
[8] => August
[9] => September
[10] => October
[11] => November
[12] => December
)
[abbrevmonths] => Array
(
[1] => Jan
[2] => Feb
[3] => Mar
[4] => Apr
[5] => May
[6] => Jun
[7] => Jul
[8] => Aug
[9] => Sep
[10] => Oct
[11] => Nov
[12] => Dec
)
[maxdaysinmonth] => 31
[calname] => Gregorian
[calsymbol] => CAL_GREGORIAN
)
(PHP 4 >= 4.1.0, PHP 5)
cal_to_jd — Convertit un calendrier en nombre de jours Julien
cal_to_jd() calcule le nombre de jours Julien pour une date, dans le calendrier calendar . Les valeurs possibles pour calendar sont CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH et CAL_FRENCH.
Calendrier à convertir. Un parmi CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH ou CAL_FRENCH.
Le mois, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar
Le jour, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar
L'année, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar
Le nombre de jour Julien.
(PHP 4, PHP 5)
easter_date — Retourne un timestamp UNIX pour Pâques, à minuit pour une année donnée
Retourne un timestamp UNIX pour Pâques, à minuit, pour une année donnée.
Cette fonction génère une alerte si la date tombe hors de la zone de validité des timestamp UNIX (i.e. avant 1970 ou après 2037).
La date de Pâques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première pleine lune qui suit l'équinoxe de printemps. L'équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L'algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les dates des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, conçu par Clavius et Lilius, puis introduit par le pape Grégoire XIII en octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis.
(Ce code est basé sur le programme en C de Simon Kershaw, <webmaster@ely.anglican.org>)
L'année, sous la forme d'un nombre compris entre 1970 et 2037
La date pour Pâques, sous la forme d'un timestamp unix.
| Version | Description |
|---|---|
| Depuis la version 4.3.0 | Le paramètre year est optionnel et vaut par défaut l'année courante vis à vis de l'heure locale. |
Exemple #1 Exemple avec easter_date()
<?php
echo date("M-d-Y", easter_date(1999)); // Apr-04-1999
echo date("M-d-Y", easter_date(2000)); // Apr-23-2000
echo date("M-d-Y", easter_date(2001)); // Apr-15-2001
?>
(PHP 4, PHP 5)
easter_days — Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée
Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée. Si l'année n'est pas précisée, l'année courante sera utilisée.
Cette fonction peut être utilisée à la place de easter_date() pour calculer la date de Pâques, pour les années qui tombent hors de l'intervalle de validité des timestamps UNIX (i.e. avant 1970 ou après 2037).
La date de Pâques a été fixée par le concile de Nicée, en 325 de notre ère, comme étant le dimanche après la première pleine lune qui suit l'équinoxe de printemps. L'équinoxe de printemps est considéré comme étant toujours le 21 mars, ce qui réduit le problème au calcul de la date de la lune pleine qui suit, et le dimanche suivant. L'algorithme fut introduit vers 532, par Dionysius Exiguus. Avec le calendrier Julien, (pour les années avant 1753), un cycle de 19 ans suffit pour connaître les date des phases de la lune. Avec le calendrier grégorien, (à partir des années 1753, conçu par Clavius et Lilius, puis introduit par le pape Grégoire XIII en octobre 1582, et en Grande Bretagne et ses colonies en septembre 1752), deux facteurs de corrections ont été ajoutés pour rendre le cycle plus précis.
(Ce code est basé sur le programme en C de Simon Kershaw, <webmaster@ely.anglican.org>)
L'année, sous la forme d'un nombre positif
Permet le calcul des dates de Pâques en se basant sur le calendrier Grégorien pour les années entre 1582 et 1752 lorsque définit à CAL_EASTER_ROMAN. Voir les constantes des calendriers pour plus de constantes valides.
Le nombre de jours entre le 21 Mars et Pâques, pour l'année year fournie.
| Version | Description |
|---|---|
| Depuis la version 4.3.0 | Le paramètre year est optionnel et vaut par défaut, l'année courante du temps local. |
| Depuis la version 4.3.0 | Le paramètre method a été introduit. |
Exemple #1 Exemple avec easter_days()
<?php
echo easter_days(1999); // 14, i.e. April 4
echo easter_days(1492); // 32, i.e. April 22
echo easter_days(1913); // 2, i.e. March 23
?>
(PHP 4, PHP 5)
FrenchToJD — Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
frenchtojd() convertit une date du calendrier français républicain en nombre de jours du calendrier Julien.
Ces fonctions convertissent les dates comprises entre l'an 1 et l'an 14 (22 Septembre 1792 à 22 Septembre 1806 en calendrier grégorien). Cela couvre plus que la durée d'existence de ce calendrier.
Le mois, sous la forme d'un nombre entre 1 (pour Vendémiaire) à 13 (pour la période de 5-6 jours en à la fin de chaque année)
Le jour, sous la forme d'un nombre compris entre 1 et 30
L'année, sous la forme d'un nombre compris entre 1 et 14
Le jour Julien pour la date fournie du calendrier français républicain, sous la forme d'un entier.
(PHP 4, PHP 5)
GregorianToJD — Convertit une date grégorienne en nombre de jours du calendrier Julien
Intervalle de validité pour le calendrier grégorien : 4714 avant JC à 9999 après JC.A.D.
Bien qu'il soit possible de manipuler des dates jusqu'en 4714 avant JC, une telle utilisation n'est pas significative. En effet, ce calendrier fut créé le 18 octobre 1582 après J.C. (ou 5 octobre 1582 en calendrier grec). Certains pays ne l'acceptèrent que bien plus tard. Par exemple, les britanniques n'y passèrent qu'en 1752, les Russes en 1918 et les Grecs en 1923. La plupart des pays européens utilisaient le calendrier Julien avant le Grégorien.
Le mois, sous la forme d'un nombre compris entre 1 (pour Janvier) et 12 (pour Décembre)
Le jour, sous la forme d'un nombre compris entre 1 et 31
L'année, sous la forme d'un nombre compris entre -4714 et 9999
Le jour Julien pour la date fournie du calendrier Grégorien, sous la forme d'un entier.
Exemple #1 Fonctions calendrier
<?php
$jd = GregorianToJD(10, 11, 1970);
echo "$jd\n";
$gregorian = JDToGregorian($jd);
echo "$gregorian\n";
?>
(PHP 4, PHP 5)
JDDayOfWeek — Retourne le numéro du jour de la semaine
Retourne le numéro du jour de la semaine. Peut retourner une chaîne ou un entier, en fonction du mode.
Le numéro du jour Julien, sous la forme d'un entier
| Mode | Signification |
|---|---|
| 0 (défaut) | Retourne le numéro du jour comme un entier (0=dimanche, 1=lundi, etc.) |
| 1 | Retourne une chaîne contenant le nom du jour (anglais grégorien) |
| 2 | Retourne une chaîne contenant le nom abrégé du jour de la semaine (anglais grégorien) |
Le jour de la semaine Grégorien, sous la forme d'un entier ou d'une chaîne de caractères.
(PHP 4, PHP 5)
JDMonthName — Retourne le nom du mois
Retourne une chaîne contenant le nom du mois. mode indique de quel calendrier dépend ce mois, et quel type de nom doit être retourné.
| Mode | Signification | Valeurs |
|---|---|---|
| 0 | Grégorien - abrégé | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 1 | Grégorien | January, February, March, April, May, June, July, August, September, October, November, December |
| 2 | Julien - abrégé | Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec |
| 3 | Julien | January, February, March, April, May, June, July, August, September, October, November, December |
| 4 | Juif | Tishri, Heshvan, Kislev, Tevet, Shevat, AdarI, AdarII, Nisan, Iyyar, Sivan, Tammuz, Av, Elul |
| 5 | Républicain français | Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra |
Le jour Julien à analyser
Le calendrier dans lequel on récupère le nom du mois
Le nom du mois pour le jour Julien donné, pour le calendrier calendar .
(PHP 4, PHP 5)
JDToFrench — Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
Convertit le nombre de jours du calendrier julien en date du calendrier français républicain.
La date française républicaine, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
JDToGregorian — Convertit le nombre de jours du calendrier Julien en date grégorienne
Convertit le nombre de jours du calendrier Julien en une chaîne contenant une date du calendrier grégorien, au format "mois/jour/année".
La date grégorienne, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
jdtojewish — Convertit le nombre de jours du calendrier Julien en date du calendrier juif
Convertit le nombre de jours du calendrier Julien en date du calendrier juif.
Les paramètres optionnels hebrew et fl sont disponibles depuis PHP 5.0.0.
Si le paramètre hebrew vaut TRUE, le paramètre fl sera utilisé pour générer une chaîne au format hébreux. Les formats disponibles sont : CAL_JEWISH_ADD_ALAFIM_GERESH, CAL_JEWISH_ADD_ALAFIM et CAL_JEWISH_ADD_GERESHAYIM.
La date Juive, sous la forme d'une chaîne de caractères "mois/jour/année".
| Version | Description |
|---|---|
| 5.0.0 | Les paramètres hebrew et fl ont été ajoutés. Le paramètre fl a été ajouté. |
| 4.3.0 | Le paramètre hebrew a été ajouté. |
Exemple #1 Exemple avec jdtojewish()
<?php
echo jdtojewish(gregoriantojd(10, 8, 2002), true,
CAL_JEWISH_ADD_GERESHAYIM + CAL_JEWISH_ADD_ALAFIM + CAL_JEWISH_ADD_ALAFIM_GERESH);
?>
(PHP 4, PHP 5)
JDToJulian — Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
Convertit le nombre de jours du calendrier Julien en une chaîne contenant la date du calendrier Julien, au format "mois/jour/année".
La date Julien, sous la forme d'une chaîne de caractères "mois/jour/année".
(PHP 4, PHP 5)
jdtounix — Convertit un jour Julien en timestamp UNIX
Retourne un timestamp UNIX correspondant au jour Julien jday ou FALSE si jday n'est pas dans l'intervalle de validité de l'époque UNIX. (années grégoriennes entre 1970 et 2037 ou 2440588 <= jday <= 2465342 .) Le temps retourné est un temps local (et non GMT).
Le nombre de jours Julien, compris entre 2440588 et 2465342.
Le timestamp unix pour le début du jour Julien donné.
(PHP 4, PHP 5)
JewishToJD — Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
Bien qu'il soit possible de manipuler des dates à partir de l'an 1 (3761 avant J.C.), une telle utilisation a peu de sens. Le calendrier juif a été utilisé depuis plusieurs dizaines de siècles, mais dans les premiers temps, il n'y avait pas de formule pour déterminer le début du mois. Un nouveau mois commençait quand une nouvelle lune était observée.
Le mois, sous la forme d'un nombre entre 1 et 13
Le jour, sous la forme d'un nombre entre 1 et 30
L'année, sous la forme d'un nombre entre 1 et 9999
Le jour Julien pour la date Juive donnée, sous la forme d'un entier.
(PHP 4, PHP 5)
JulianToJD — Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
Intervalle de validité du calendrier Julien : 4713 avant JC à 9999 après J.C.
Bien qu'il soit possible de manipuler des dates jusqu'en 4713 avant JC, une telle utilisation n'est pas significative. En effet, ce calendrier fut créé en 46 avant J.C., et ses détails ne furent finalisés qu'au plus tôt en 8 après JC, et probablement pas avant le quatrième siècle après JC. De plus, le début de l'année variait suivant les peuples, certains n'acceptant pas janvier comme premier mois de l'année.
Souvenez-vous, le calendrier courant du système utilisé sur le Web est un calendrier Grégorien. gregoriantojd() peut être utilisé pour convertir ce genre de dates en un nombre de jours du calendrier Julien.
Le mois, sous la forme d'un nombre entre 1 (pour Janvier) et 12 (pour Décembre)
Le jour, sous la forme d'un nombre entre 1 et 31
L'année, sous la forme d'un nombre entre -4713 et 9999
Le jour Julien pour la date Julienne donnée, sous la forme d'un entier.
(PHP 4, PHP 5)
unixtojd — Convertit un timestamp UNIX en un jour Julien
Retourne le jour Julien du timestamp UNIX timestamp (nombre de secondes depuis le 1/1/1970), ou pour le jour courant si timestamp est omis.
Un timestamp unix à convertir.
Un nombre de jours Julien, sous la forme d'un entier.
Ces fonctions vous permettent de récupérer la date et l'heure depuis le serveur où le script PHP s'exécute. Vous pouvez utiliser ces fonctions pour formater la date et l'heure de différentes façons.
Note: Gardez à l'esprit que ces fonctions sont indépendantes de la configuration locale de votre système. Assurez-vous donc de prendre en considération l'heure d'été (en utilisant e.g. $date = strtotime('+7 days', $date) et non $date += 7*24*60*60) ainsi que les années bissextiles lorsque vous utilisez ces fonctions.
Note: Les fuseaux horaires référencés dans cette section peuvent être trouvés dans la section Liste des Fuseaux Horaires Supportés.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.
Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.
Note: Récupération de la dernière base de données des fuseaux horaires
La dernière version de la base de données des fuseaux horaires peut être installée via le paquet PECL » timezonedb.
Note: Support DateTime expérimental en PHP 5.1.x
Bien que la classe DateTime (et les fonctions connexes) soit activée par défaut depuis PHP 5.2.0, il est possible d'ajouter un support expérimental dans PHP 5.1.x en utilisant le drapeau suivant lors de la compilation : CFLAGS=-DEXPERIMENTAL_DATE_SUPPORT=1
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
| Nom | Défaut | Modifiable | Historique |
|---|---|---|---|
| date.default_latitude | "31.7667" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.default_longitude | "35.2333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.sunrise_zenith | "90.583333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.sunset_zenith | "90.583333" | PHP_INI_ALL | Disponible depuis PHP 5.0.0. |
| date.timezone | "" | PHP_INI_ALL | Disponible depuis PHP 5.1.0. |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.
Voici un éclaircissement sur l'utilisation des directives de configuration.
La latitude par défaut.
La longitude par défaut.
L'heure de lever du soleil par défaut.
L'heure du coucher du soleil par défaut.
Le décalage horaire utilisé par toutes les fonctions date/heure si la variable d'environnement TZ n'est pas définie. L'ordre de priorité est décrit dans la page date_default_timezone_get(). Voir Liste des Fuseaux Horaires Supportés pour une liste des décalages horaires supportés.
Note: Les quatre premières options de configuration sont actuellement utilisées uniquement par les fonction date_sunrise() et date_sunset().
Cette extension ne définit aucune ressource.
Les constantes DATE_ sont définies depuis PHP 5.1.1 et offrent une représentation standard des dates, qui peut être utilisée avec toutes les fonctions de formatage de date (comme date()).
Les constantes suivantes existent depuis PHP 5.1.2 et spécifient un format retourné par les fonctions date_sunrise() et date_sunset().
Ici, vous trouverez une liste complète des fuseaux horaires supportés par PHP, qui peuvent être utilisés avec, e.g. date_default_timezone_set().
Note: La dernière version de la base de données des fuseaux horaires peut être installée via la commande PECL » timezonedb.
Note: Cette liste set basée sur la version 2009.10 de la base timezonedb.
| Africa/Abidjan | Africa/Accra | Africa/Addis_Ababa | Africa/Algiers | Africa/Asmara |
| Africa/Asmera | Africa/Bamako | Africa/Bangui | Africa/Banjul | Africa/Bissau |
| Africa/Blantyre | Africa/Brazzaville | Africa/Bujumbura | Africa/Cairo | Africa/Casablanca |
| Africa/Ceuta | Africa/Conakry | Africa/Dakar | Africa/Dar_es_Salaam | Africa/Djibouti |
| Africa/Douala | Africa/El_Aaiun | Africa/Freetown | Africa/Gaborone | Africa/Harare |
| Africa/Johannesburg | Africa/Kampala | Africa/Khartoum | Africa/Kigali | Africa/Kinshasa |
| Africa/Lagos | Africa/Libreville | Africa/Lome | Africa/Luanda | Africa/Lubumbashi |
| Africa/Lusaka | Africa/Malabo | Africa/Maputo | Africa/Maseru | Africa/Mbabane |
| Africa/Mogadishu | Africa/Monrovia | Africa/Nairobi | Africa/Ndjamena | Africa/Niamey |
| Africa/Nouakchott | Africa/Ouagadougou | Africa/Porto-Novo | Africa/Sao_Tome | Africa/Timbuktu |
| Africa/Tripoli | Africa/Tunis | Africa/Windhoek |
| America/Adak | America/Anchorage | America/Anguilla | America/Antigua | America/Araguaina |
| America/Argentina/Buenos_Aires | America/Argentina/Catamarca | America/Argentina/ComodRivadavia | America/Argentina/Cordoba | America/Argentina/Jujuy |
| America/Argentina/La_Rioja | America/Argentina/Mendoza | America/Argentina/Rio_Gallegos | America/Argentina/Salta | America/Argentina/San_Juan |
| America/Argentina/San_Luis | America/Argentina/Tucuman | America/Argentina/Ushuaia | America/Aruba | America/Asuncion |
| America/Atikokan | America/Atka | America/Bahia | America/Barbados | America/Belem |
| America/Belize | America/Blanc-Sablon | America/Boa_Vista | America/Bogota | America/Boise |
| America/Buenos_Aires | America/Cambridge_Bay | America/Campo_Grande | America/Cancun | America/Caracas |
| America/Catamarca | America/Cayenne | America/Cayman | America/Chicago | America/Chihuahua |
| America/Coral_Harbour | America/Cordoba | America/Costa_Rica | America/Cuiaba | America/Curacao |
| America/Danmarkshavn | America/Dawson | America/Dawson_Creek | America/Denver | America/Detroit |
| America/Dominica | America/Edmonton | America/Eirunepe | America/El_Salvador | America/Ensenada |
| America/Fort_Wayne | America/Fortaleza | America/Glace_Bay | America/Godthab | America/Goose_Bay |
| America/Grand_Turk | America/Grenada | America/Guadeloupe | America/Guatemala | America/Guayaquil |
| America/Guyana | America/Halifax | America/Havana | America/Hermosillo | America/Indiana/Indianapolis |
| America/Indiana/Knox | America/Indiana/Marengo | America/Indiana/Petersburg | America/Indiana/Tell_City | America/Indiana/Vevay |
| America/Indiana/Vincennes | America/Indiana/Winamac | America/Indianapolis | America/Inuvik | America/Iqaluit |
| America/Jamaica | America/Jujuy | America/Juneau | America/Kentucky/Louisville | America/Kentucky/Monticello |
| America/Knox_IN | America/La_Paz | America/Lima | America/Los_Angeles | America/Louisville |
| America/Maceio | America/Managua | America/Manaus | America/Marigot | America/Martinique |
| America/Mazatlan | America/Mendoza | America/Menominee | America/Merida | America/Mexico_City |
| America/Miquelon | America/Moncton | America/Monterrey | America/Montevideo | America/Montreal |
| America/Montserrat | America/Nassau | America/New_York | America/Nipigon | America/Nome |
| America/Noronha | America/North_Dakota/Center | America/North_Dakota/New_Salem | America/Panama | America/Pangnirtung |
| America/Paramaribo | America/Phoenix | America/Port-au-Prince | America/Port_of_Spain | America/Porto_Acre |
| America/Porto_Velho | America/Puerto_Rico | America/Rainy_River | America/Rankin_Inlet | America/Recife |
| America/Regina | America/Resolute | America/Rio_Branco | America/Rosario | America/Santarem |
| America/Santiago | America/Santo_Domingo | America/Sao_Paulo | America/Scoresbysund | America/Shiprock |
| America/St_Barthelemy | America/St_Johns | America/St_Kitts | America/St_Lucia | America/St_Thomas |
| America/St_Vincent | America/Swift_Current | America/Tegucigalpa | America/Thule | America/Thunder_Bay |
| America/Tijuana | America/Toronto | America/Tortola | America/Vancouver | America/Virgin |
| America/Whitehorse | America/Winnipeg | America/Yakutat | America/Yellowknife |
| Antarctica/Casey | Antarctica/Davis | Antarctica/DumontDUrville | Antarctica/Mawson | Antarctica/McMurdo |
| Antarctica/Palmer | Antarctica/Rothera | Antarctica/South_Pole | Antarctica/Syowa | Antarctica/Vostok |
| Arctic/Longyearbyen |
| Asia/Aden | Asia/Almaty | Asia/Amman | Asia/Anadyr | Asia/Aqtau |
| Asia/Aqtobe | Asia/Ashgabat | Asia/Ashkhabad | Asia/Baghdad | Asia/Bahrain |
| Asia/Baku | Asia/Bangkok | Asia/Beirut | Asia/Bishkek | Asia/Brunei |
| Asia/Calcutta | Asia/Choibalsan | Asia/Chongqing | Asia/Chungking | Asia/Colombo |
| Asia/Dacca | Asia/Damascus | Asia/Dhaka | Asia/Dili | Asia/Dubai |
| Asia/Dushanbe | Asia/Gaza | Asia/Harbin | Asia/Ho_Chi_Minh | Asia/Hong_Kong |
| Asia/Hovd | Asia/Irkutsk | Asia/Istanbul | Asia/Jakarta | Asia/Jayapura |
| Asia/Jerusalem | Asia/Kabul | Asia/Kamchatka | Asia/Karachi | Asia/Kashgar |
| Asia/Kathmandu | Asia/Katmandu | Asia/Kolkata | Asia/Krasnoyarsk | Asia/Kuala_Lumpur |
| Asia/Kuching | Asia/Kuwait | Asia/Macao | Asia/Macau | Asia/Magadan |
| Asia/Makassar | Asia/Manila | Asia/Muscat | Asia/Nicosia | Asia/Novosibirsk |
| Asia/Omsk | Asia/Oral | Asia/Phnom_Penh | Asia/Pontianak | Asia/Pyongyang |
| Asia/Qatar | Asia/Qyzylorda | Asia/Rangoon | Asia/Riyadh | Asia/Saigon |
| Asia/Sakhalin | Asia/Samarkand | Asia/Seoul | Asia/Shanghai | Asia/Singapore |
| Asia/Taipei | Asia/Tashkent | Asia/Tbilisi | Asia/Tehran | Asia/Tel_Aviv |
| Asia/Thimbu | Asia/Thimphu | Asia/Tokyo | Asia/Ujung_Pandang | Asia/Ulaanbaatar |
| Asia/Ulan_Bator | Asia/Urumqi | Asia/Vientiane | Asia/Vladivostok | Asia/Yakutsk |
| Asia/Yekaterinburg | Asia/Yerevan |
| Atlantic/Azores | Atlantic/Bermuda | Atlantic/Canary | Atlantic/Cape_Verde | Atlantic/Faeroe |
| Atlantic/Faroe | Atlantic/Jan_Mayen | Atlantic/Madeira | Atlantic/Reykjavik | Atlantic/South_Georgia |
| Atlantic/St_Helena | Atlantic/Stanley |
| Australia/ACT | Australia/Adelaide | Australia/Brisbane | Australia/Broken_Hill | Australia/Canberra |
| Australia/Currie | Australia/Darwin | Australia/Eucla | Australia/Hobart | Australia/LHI |
| Australia/Lindeman | Australia/Lord_Howe | Australia/Melbourne | Australia/North | Australia/NSW |
| Australia/Perth | Australia/Queensland | Australia/South | Australia/Sydney | Australia/Tasmania |
| Australia/Victoria | Australia/West | Australia/Yancowinna |
| Europe/Amsterdam | Europe/Andorra | Europe/Athens | Europe/Belfast | Europe/Belgrade |
| Europe/Berlin | Europe/Bratislava | Europe/Brussels | Europe/Bucharest | Europe/Budapest |
| Europe/Chisinau | Europe/Copenhagen | Europe/Dublin | Europe/Gibraltar | Europe/Guernsey |
| Europe/Helsinki | Europe/Isle_of_Man | Europe/Istanbul | Europe/Jersey | Europe/Kaliningrad |
| Europe/Kiev | Europe/Lisbon | Europe/Ljubljana | Europe/London | Europe/Luxembourg |
| Europe/Madrid | Europe/Malta | Europe/Mariehamn | Europe/Minsk | Europe/Monaco |
| Europe/Moscow | Europe/Nicosia | Europe/Oslo | Europe/Paris | Europe/Podgorica |
| Europe/Prague | Europe/Riga | Europe/Rome | Europe/Samara | Europe/San_Marino |
| Europe/Sarajevo | Europe/Simferopol | Europe/Skopje | Europe/Sofia | Europe/Stockholm |
| Europe/Tallinn | Europe/Tirane | Europe/Tiraspol | Europe/Uzhgorod | Europe/Vaduz |
| Europe/Vatican | Europe/Vienna | Europe/Vilnius | Europe/Volgograd | Europe/Warsaw |
| Europe/Zagreb | Europe/Zaporozhye | Europe/Zurich |
| Indian/Antananarivo | Indian/Chagos | Indian/Christmas | Indian/Cocos | Indian/Comoro |
| Indian/Kerguelen | Indian/Mahe | Indian/Maldives | Indian/Mauritius | Indian/Mayotte |
| Indian/Reunion |
| Pacific/Apia | Pacific/Auckland | Pacific/Chatham | Pacific/Easter | Pacific/Efate |
| Pacific/Enderbury | Pacific/Fakaofo | Pacific/Fiji | Pacific/Funafuti | Pacific/Galapagos |
| Pacific/Gambier | Pacific/Guadalcanal | Pacific/Guam | Pacific/Honolulu | Pacific/Johnston |
| Pacific/Kiritimati | Pacific/Kosrae | Pacific/Kwajalein | Pacific/Majuro | Pacific/Marquesas |
| Pacific/Midway | Pacific/Nauru | Pacific/Niue | Pacific/Norfolk | Pacific/Noumea |
| Pacific/Pago_Pago | Pacific/Palau | Pacific/Pitcairn | Pacific/Ponape | Pacific/Port_Moresby |
| Pacific/Rarotonga | Pacific/Saipan | Pacific/Samoa | Pacific/Tahiti | Pacific/Tarawa |
| Pacific/Tongatapu | Pacific/Truk | Pacific/Wake | Pacific/Wallis | Pacific/Yap |
| Brazil/Acre | Brazil/DeNoronha | Brazil/East | Brazil/West | Canada/Atlantic |
| Canada/Central | Canada/East-Saskatchewan | Canada/Eastern | Canada/Mountain | Canada/Newfoundland |
| Canada/Pacific | Canada/Saskatchewan | Canada/Yukon | CET | Chile/Continental |
| Chile/EasterIsland | CST6CDT | Cuba | EET | Egypt |
| Eire | EST | EST5EDT | Etc/GMT | Etc/GMT+0 |
| Etc/GMT+1 | Etc/GMT+10 | Etc/GMT+11 | Etc/GMT+12 | Etc/GMT+2 |
| Etc/GMT+3 | Etc/GMT+4 | Etc/GMT+5 | Etc/GMT+6 | Etc/GMT+7 |
| Etc/GMT+8 | Etc/GMT+9 | Etc/GMT-0 | Etc/GMT-1 | Etc/GMT-10 |
| Etc/GMT-11 | Etc/GMT-12 | Etc/GMT-13 | Etc/GMT-14 | Etc/GMT-2 |
| Etc/GMT-3 | Etc/GMT-4 | Etc/GMT-5 | Etc/GMT-6 | Etc/GMT-7 |
| Etc/GMT-8 | Etc/GMT-9 | Etc/GMT0 | Etc/Greenwich | Etc/UCT |
| Etc/Universal | Etc/UTC | Etc/Zulu | Factory | GB |
| GB-Eire | GMT | GMT+0 | GMT-0 | GMT0 |
| Greenwich | Hongkong | HST | Iceland | Iran |
| Israel | Jamaica | Japan | Kwajalein | Libya |
| MET | Mexico/BajaNorte | Mexico/BajaSur | Mexico/General | MST |
| MST7MDT | Navajo | NZ | NZ-CHAT | Poland |
| Portugal | PRC | PST8PDT | ROC | ROK |
| Singapore | Turkey | UCT | Universal | US/Alaska |
| US/Aleutian | US/Arizona | US/Central | US/East-Indiana | US/Eastern |
| US/Hawaii | US/Indiana-Starke | US/Michigan | US/Mountain | US/Pacific |
| US/Pacific-New | US/Samoa | UTC | W-SU | WET |
| Zulu |
N'utilisez aucun des fuseaux horaires listés ici (à côté de UTC), ils n'existent que pour des raisons de compatibilité ascendante.
Représentation d'une date et heure.
Ajoute la durée de l'objet DateInterval à l'objet DateTime.
Seulement en style procédural : un objet DateTime retourné par date_create()
La durée à ajouter. Pour les dates, utilisez "P3D", "P3M", "P3Y" ou une combinaison des droits, e.g. "P2M5D" (Y = Années, M = Mois, D = Jours.) Important : le format doit être année, mois et jour, "P5Y", "P5M2D", "P5Y4D". Pour l'heure, utilisez "T3H", "T3M", "T3S" ou une combinaison des trois, e.g. "T5H20M" (H = Heures, M = Minutes, S = Secondes). Pour une date et heure, utilisez "P5D2M4YT5H20M". Les chiffres avant les lettres peuvent être n'importe quelle valeur.
Retourne l'objet DateTime modifié.
Exemple #1 Exemple avec date_add()
<?php
$date = new DateTime("18-July-2008 16:30:30");
echo $date->format("d-m-Y H:i:s").'<br />';
date_add($date, new DateInterval("P5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days';
date_add($date, new DateInterval("P5M"));
echo '<br />'.$date->format("d-m-Y").' : 5 Months';
date_add($date, new DateInterval("P5Y"));
echo '<br />'.$date->format("d-m-Y").' : 5 Years';
date_add($date, new DateInterval("P5Y5M5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days, 5 Months, 5 Years';
date_add($date, new DateInterval("P5YT5H"));
echo '<br />'.$date->format("d-m-Y H:i:s").' : 5 Years, 5 Hours';
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
Retourne un nouvel objet DateTime.
Chaîne dans un format accepté par strtotime(), par défaut, maintenant ("now").
Fuseau horaire de l'heure.
Émet un Exception en cas d'erreur.
Exemple #1 Exemple avec DateTime::__construct()
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
echo $datetime->format(DATE_ATOM);
?>
(PHP 5 >= 5.3.0)
DateTime::createFromFormat — Retourne un nouvel objet DateTime formaté
Retourne un nouvel objet DateTime formaté.
Format accepté par date().
Chaîne représentant l'heure.
Fuseau horaire.
Retourne un nouvel objet DateTime.
Retourne la différence entre deux objets DateTime.
La date de comparaison.
S'il faut retourner une différence absolue. Par défaut, FALSE.
La différence entre les deux dates.
(PHP 5 >= 5.2.0)
DateTime::format — Retourne la date au format demandé
Seulement en style procédural : un objet DateTime retourné par date_create()
Format accepté par date().
Retourne la date formatée, en cas de succès, FALSE sinon.
Exemple #1 Affichage de la date, procédural
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create('2008-08-03 14:52:10');
echo date_format($datetime, 'jS, F Y') . "\n";
echo date_format($datetime, DATE_ATOM);
?>
Exemple #2 Affichage de la date, POO
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
echo $datetime->format('jS, F Y') . "\n";
echo $datetime->format(DATE_ATOM);
?>
?>
L'exemple ci-dessus va afficher :
3rd, August 2008 2008-08-03T14:52:10+01:00
(PHP 5 >= 5.3.0)
DateTime::getLastErrors — Retourne les dernières erreurs et alertes
Retourne les dernières erreurs et alertes obtenu lors de l'analyse de la chaîne de date.
Cette fonction ne contient aucun paramètre.
Retourne un tableau contenant les erreurs et alertes.
Exemple #1 Exemple avec DateTime::getLastErrors()
<?php
$date = date_create('asdfasdf');
print_r(DateTime::getLastErrors());
?>
L'exemple ci-dessus va afficher :
Array
(
[warning_count] => 1
[warnings] => Array
(
[6] => Double timezone specification
)
[error_count] => 1
[errors] => Array
(
[0] => The timezone could not be found in the database
)
)
(PHP 5 >= 5.2.0)
DateTime::getOffset — Retourne le décalage d'heure d'hivers
Seulement en style procédural : un objet DateTime retourné par date_create()
Retourne le décalage d'heure d'hiver, en seconde, en cas de succès, ou bien FALSE sinon.
Exemple #1 Comparaison entre les décalages horaire d'hiver et d'été
<?php
date_default_timezone_set('Europe/London');
$winter = new DateTime('2008-12-25 14:25:41');
$summer = new DateTime('2008-07-14 14:25:41');
echo $winter->getOffset(); // Winter offset: 0
echo $summer->getOffset(); // Summer offset: 3600 = 1 hour
?>
(PHP 5 >= 5.3.0)
DateTime::getTimestamp — Lit le timestamp Unix
Lit le timestamp Unix.
Cette fonction ne contient aucun paramètre.
Lit le timestamp Unix représentant la date.
(PHP 5 >= 5.2.0)
DateTime::getTimezone — Lit le fuseau horaire d'un objet DateTime
Seulement en style procédural : un objet DateTime retourné par date_create()
Retourne l'objet DateTimeZone en cas de succès, et FALSE sinon.
Exemple #1 Manipulations de l'objet DateTimeZone
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->getTimezone()->getName() . "\n";
$datetime = new DateTime('2008-08-03 12:35:23');
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->getTimezone()->getName();
?>
L'exemple ci-dessus va afficher :
Europe/London America/Los_Angeles
(PHP 5 >= 5.2.0)
DateTime::modify — Modifie le timestamp
Modifie le timestamp d'un objet DateTime en l'incrémentant ou le décrémentant dans un format acceptable par strtotime().
Seulement en style procédural : un objet DateTime retourné par date_create()
Une chaîne, dans un format accepté par strtotime().
Retourne l'objet DateTime modifié.
Exemple #1 Exemple avec DateTime::modify()
<?php
$date = new DateTime("2006-12-12");
$date->modify("+1 day");
echo $date->format("Y-m-d");
?>
L'exemple ci-dessus va afficher :
2006-12-13
(PHP 5 >= 5.2.0)
DateTime::__set_state — Le gestionnaire __set_state
Le gestionnaire __set_state.
Retourne une nouvelle instance de l'objet DateTime.
(PHP 5 >= 5.2.0)
DateTime::setDate — Assigne la date
Assigne la date courante de l'objet DateTime à une nouvelle date.
Seulement en style procédural : un objet DateTime retourné par date_create()
Année de la date.
Mois de la date.
Jour de la date.
Retourne l'objet DateTime modifié.
Exemple #1 Exemple avec DateTime::setDate()
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 14:52:10');
$datetime->setDate(2008, 10, 12);
echo $datetime->format(DATE_RFC2822);
?>
Exemple #2 Exemple avec DateTime::setDate() (procédural)
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create('2008-08-03 14:52:10');
date_date_set($datetime, 2008, 10, 12);
echo date_format($datetime, DATE_RFC2822);
?>
L'exemple ci-dessus va afficher :
Sun, 12 Oct 2008 14:52:10 +0100
(PHP 5 >= 5.2.0)
DateTime::setISODate — Configure une date ISO
Configure une date au format ISO 8601 : en utilisant des décalages de semaines et de jours, au lieu de dates spécifiques.
Seulement en style procédural : un objet DateTime retourné par date_create()
L'année de la date.
Le mois de la date.
Décalage par rapport au premier jour de la semaine.
Retourne l'objet DateTime modifié.
Exemple #1 Calcul d'une date à partir d'un décalage de semaine et de jours
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime();
// Le décalage depuis le début de la semaine 2 (7) = 5
$datetime->setISODate(2008, 2, 5); // Day 5 of week 2 of 2008 is the 11th of January.
// Offset from start of week 2 (7) = 10
$datetime->setISODate(2008, 2, 10); // Day 10 of week 2 of 2008 is the 16th of January.
?>
Exemple #2 Calcul du mois dans lequel est une semaine
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create();
date_isodate_set($datetime, 2008, 6); // Week 6 of 2008 is in February.
?>
(PHP 5 >= 5.2.0)
DateTime::setTime — Assigne l'heure
Assigne l'heure de l'objet DateTime à une différente heure.
Seulement en style procédural : un objet DateTime retourné par date_create()
Heure du moment.
Minute du moment.
Seconde du moment.
Retourne l'objet DateTime modifié.
Exemple #1 Changement d'heure d'un objet DateTime
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$datetime->setTime(14, 55, 24);
echo $datetime->format('Y-m-d H:i:s') . "\n";
// Attention : ceci n'incrémente pas l'heure!
// Ceci est lié au fait que l'heure a été configuré (14) - voyez date_modify()
$datetime->setTime($datetime->format('H'), $datetime->format('n') + 6);
echo $datetime->format('Y-m-d H:i:s') . "\n";
// Ceci incrémente le jour, car le jour n'a pas été configuré
$datetime->setTime($datetime->format('H') + 12, $datetime->format('n'));
echo $datetime->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher :
2008-08-03 12:35:23 2008-08-03 14:55:24 2008-08-03 14:14:00 2008-08-04 02:08:00
(PHP 5 >= 5.3.0)
DateTime::setTimestamp — Assigne la date et l'heure à l'aide d'un timestamp Unix
Assigne la date et l'heure à l'aide d'un timestamp Unix.
Timestamp Unix représentant la date et l'heure.
Retourne l'objet DateTime modifié.
(PHP 5 >= 5.2.0)
DateTime::setTimezone — Configure le fuseau horaire de l'objet DateTime
Seulement en style procédural : un objet DateTime retourné par date_create()
Le fuseau horaire voulu.
Retourne l'objet DateTime modifié.
Exemple #1 Modifier et lire un objet DateTimeZone
<?php
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->getTimezone()->getName() . "\n";
$datetime = new DateTime('2008-08-03 12:35:23');
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->getTimezone()->getName();
?>
L'exemple ci-dessus va afficher :
Europe/London America/Los_Angeles
Soustrait la durée spécifiée par l'objet DateInterval de l'objet DateTime.
Seulement en style procédural : un objet DateTime retourné par date_create()
La durée à soustraire. Pour les dates, utilisez "P3D", "P3M", "P3Y" ou une combinaison des droits, e.g. "P2M5D" (Y = Années, M = Mois, D = Jours.) Important : le format doit être année, mois et jour, "P5Y", "P5M2D", "P5Y4D". Pour l'heure, utilisez "T3H", "T3M", "T3S" ou une combinaison des trois, e.g. "T5H20M" (H = Heures, M = Minutes, S = Secondes). Pour une date et heure, utilisez "P5D2M4YT5H20M". Les chiffres avant les lettres peuvent être n'importe quelle valeur.
Retourne l'objet DateTime modifié.
Exemple #1 Exemple avec date_sub()
<?php
$date = new DateTime("18-July-2008 16:30:30");
echo $date->format("d-m-Y H:i:s").'<br />';
date_sub($date, new DateInterval("P5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days';
date_sub($date, new DateInterval("P5M"));
echo '<br />'.$date->format("d-m-Y").' : 5 Months';
date_sub($date, new DateInterval("P5Y"));
echo '<br />'.$date->format("d-m-Y").' : 5 Years';
date_sub($date, new DateInterval("P5Y5M5D"));
echo '<br />'.$date->format("d-m-Y").' : 5 Days, 5 Months, 5 Years';
date_sub($date, new DateInterval("P5YT5H"));
echo '<br />'.$date->format("d-m-Y H:i:s").' : 5 Years, 5 Hours';
?>
Cette fonction est EXPERIMENTALE. Cela signifie que le comportement de cette fonction, son nom et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez cette fonction à vos risques et périls.
(PHP 5 >= 5.2.0)
DateTime::__wakeup — Le gestionnaire de __wakeup
Cette fonction ne contient aucun paramètre.
Initialise un objet DateTime.
Représentation d'un fuseau horaire.
Fuseau africain.
Fuseau américain.
Fuseau antarctique.
Fuseau arctique.
Fuseau asiatique.
Fuseau atlantique.
Fuseau australien.
Fuseau européen.
Fuseau indien.
Fuseau pacifique.
Fuseau UTC.
Tous les fuseaux.
Tous les fuseaux, y compris les anciens.
Fuseaux horaires par pays.
(PHP 5 >= 5.2.0)
DateTimeZone::__construct — Crée un nouvel objet DateTimeZone
Retourne un objet DateTimeZone, en cas de succès.
Cette méthode émet une exception Exception, si le fuseau horaire fourni n'est pas reconnu.
Exemple #1 Interception des erreurs avec DateTimeZone
<?php
// Gestion des erreurs par interception des exceptions
$timezones = array('Europe/London', 'Mars/Phobos', 'Jupiter/Europa');
foreach ($timezones as $tz) {
try {
$mars = new DateTimeZone($tz);
} catch(Exception $e) {
echo $e->getMessage() . '<br />';
}
}
?>
L'exemple ci-dessus va afficher :
DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Mars/Phobos) DateTimeZone::__construct() [datetimezone.--construct]: Unknown or bad timezone (Jupiter/Europa)
(PHP 5 >= 5.3.0)
DateTimeZone::getLocation — Retourne les informations géographiques d'un fuseau horaire
Retourne les informations géographiques d'un fuseau horaire, comprenant le code du pays, la latitude et la longitude, et commentaires.
Cette fonction ne contient aucun paramètre.
Tableau contenant les informations de localisation du fuseau horaire.
Exemple #1 Exemple avec DateTimeZone::getLocation()
<?php
$tz = new DateTimeZone("Europe/Prague");
print_r($tz->getLocation());
?>
L'exemple ci-dessus va afficher :
Array
(
[country_code] => CZ
[latitude] => 50.08333
[longitude] => 14.43333
[comments] =>
)
(PHP 5 >= 5.2.0)
DateTimeZone::getName — Retourne le nom du fuseau horaire
Retourne le nom du fuseau horaire.
Cette fonction ne contient aucun paramètre.
Un des fuseaux horaires.
(PHP 5 >= 5.2.0)
DateTimeZone::getOffset — Retourne le décalage GMT d'un fuseau horaire
timezone_offset_get() retourne le décalage horaire par rapport au GMT pour le paramètre datetime . Le décalage GMT est calculé à partir des informations de fuseau horaire contenu dans l'objet DateTime.
Seulement en style procédural : un DateTimeZone objet retourné par timezone_open()
Objet DateTime qui contient la date dont il faut calculer le décalage.
Retourne le décalage horaire, exprimé en secondes, en cas de succès, et FALSE en cas d'erreur.
Exemple #1 Exemple avec DateTimeZone::getOffset()
<?php
// Crée deux objets fuseau horaire, un pour Taipei (Taiwan) et un pour
// Tokyo (Japon)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");
// Crée deux objets DateTime qui contiennent le même timestampe Unix,
// mais sont situés dans deux fuseaux horaires différents.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);
// Calcule le décalage horaire GMT pour l'objet $dateTimeTaipei
// mais en utilisant le fuseau horaire de Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);
// Devrait afficher int(32400) (pour les dates après le Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>
(PHP 5 >= 5.2.0)
DateTimeZone::getTransitions — Retourne toutes les transitions d'un fuseau horaire
Seulement en style procédural : un DateTimeZone objet retourné par timezone_open()
Début du timestamp.
Fin du timestamp.
Retourne un tableau numérique, contenant des tableaux associatifs avec toutes les transitions, en cas de succès, et FALSE sinon.
| Version | Description |
|---|---|
| 5.3.0 | Les paramètres optionnels timestamp_begin et timestamp_end ont été ajouté. |
Exemple #1 Exemple avec timezone_transitions_get()
<?php
$timezone = new DateTimeZone("CET");
print_r(reset($timezone->getTransitions()));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[ts] => -1693706400
[time] => 1916-04-30T22:00:00+0000
[offset] => 7200
[isdst] => 1
[abbr] => CEST
)
(PHP 5 >= 5.2.0)
DateTimeZone::listAbbreviations — Retourne un tableau associatif, décrivant un fuseau horaire
Retourne un tableau en cas de succès, et FALSE sinon.
Exemple #1 Exemple avec timezone_abbreviations_list()
<?php
$timezone_abbreviations = DateTimeZone::listAbbreviations();
print_r($timezone_abbreviations["acst"]);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Porto_Acre
)
[1] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Eirunepe
)
[2] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => America/Rio_Branco
)
[3] => Array
(
[dst] => 1
[offset] => -14400
[timezone_id] => Brazil/Acre
)
)
(PHP 5 >= 5.2.0)
DateTimeZone::listIdentifiers — Retourne un tableau numérique de tous les fuseaux horaires
Seulement en style procédural : un objet DateTime retourné par date_create()
Une des constantes de classe DateTimeZone, qui vaut par défaut DateTimeZone::ALL.
Un code de pays en deux lettres, compatible ISO 3166-1.
Note: Cette option n'est dispoinble que lorsque le paramètre what prend la valeur de DateTimeZone::PER_COUNTRY.
Retourne un tableau en cas de succès, ou FALSE en cas d'erreur.
| Version | Description |
|---|---|
| 5.3.0 | Ajout des paramètres optionnels what et country . |
Exemple #1 Exemple avec timezone_identifiers_list()
<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
for ($i=0; $i < 5; $i++) {
echo "$timezone_identifiers[$i]\n";
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmera
Représentation d'un intervalle de dates.
(PHP 5 >= 5.3.0)
DateInterval::__construct — Crée un nouvel objet DateInterval
Spécification d'intervalle.
(PHP 5 >= 5.3.0)
DateInterval::createFromDateString — Configure un objet DateInterval à partir des parties d'une chaîne
Utilise les analyseurs de dates natifs et configure un objet DateInterval à partir d'une chaîne de caractères.
Une date, avec des portions relatives.
Retourne un nouvel objet DateInterval, en cas de succès.
(PHP 5 >= 5.3.0)
DateInterval::format — Formate l'intervalle
Format l'intervalle.
| Caractère de format | Description | Valeur d'exemple |
|---|---|---|
| Y | Années, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03 |
| y | Années, numérique | 1, 3 |
| M | Mois, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 12 |
| m | Mois, numérique | 01, 03, 12 |
| D | Jours, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 31 |
| d | Jours, numérique | 1, 3, 31 |
| a | Nombre total de jours | 4, 18, 8123 |
| H | Heures, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 23 |
| h | Heures, numérique | 1, 3, 23 |
| I | Minutes, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 59 |
| i | Minutes, numérique | 1, 3, 59 |
| S | Secondes, numérique, au moins 2 chiffres avec zéros initiaux | 01, 03, 57 |
| s | Secondes, numérique | 1, 3, 57 |
| R | Signe "-" lorsque négatif, "+" si positif | -, + |
| r | Signe "-" lorsque négatif, vide si positif | -, |
| % | Caractère % littéral | % |
Note: Le préfixe % est nécessaire pour que les spécificateurs de formats fonctionnent correctement.
Retourne l'intervalle formaté.
Représentation d'une période de dates.
Exclut la date de début, utilisé par DatePeriod::__construct().
Crée un nouvel objet DatePeriod.
Date de début.
Intervalle.
Nombre de récurrences.
Date de fin.
Chaîne contenant l'intervalle ISO.
Peut être configuré à DateTime::EXCLUDE_START_DATE.
(PHP 4, PHP 5)
checkdate — Valide une date grégorienne
Vérifie la validité d'une date formée par les arguments. Une date est considérée comme valide si chaque paramètre est défini correctement.
Le mois doit être compris entre 1 et 12.
Le jour doit être un jour autorisé par le mois donné. Les années bissextiles sont prises en comptes.
L'année est comprise entre 1 et 32767 inclus.
Retourne TRUE si la date fournie est valide, sinon FALSE.
Exemple #1 Exemple avec checkdate()
<?php
var_dump(checkdate(12, 31, 2000));
var_dump(checkdate(2, 29, 2001));
?>
L'exemple ci-dessus va afficher :
bool(true) bool(false)
(PHP 5 >= 5.3.0)
date_create_from_format — Alias de DateTime::createFromFormat
Cette fonction est un alias de : DateTime::createFromFormat
Une chaîne de caractères dans le format accepté par strtotime(), la valeur par défaut est maintenant "now".
Fuseau horaire.
Retourne un objet DateTime en cas de succès, ou FALSE en cas d'échec.
Exemple #1 Exemple avec date_create()
<?php
date_default_timezone_set('Europe/London');
$datetime = date_create('2008-08-03 14:52:10');
echo date_format($datetime, DATE_ATOM);
?>
L'exemple ci-dessus va afficher :
2008-08-03T14:52:10+01:00
(PHP 5 >= 5.1.0)
date_default_timezone_get — Récupère le décalage horaire par défaut utilisé par toutes les fonctions date/heure dans un script
Cette fonction retourne le décalage horaire en suivant l'ordre de préférences suivant :
Lecture du décalage horaire définie en utilisant la fonction date_default_timezone_set() (si elle existe)
Lecture de la variable d'environnement TZ (si elle n'est pas vide)
Lecture de la valeur de l'option de configuration date.timezone (si elle est définie)
Interrogation du système d'exploitation (si le système le supporte et l'autorise)
Si tout ce qui précède échoue, date_default_timezone_get retournera le décalage horaire par défaut de UTC.
Retourne une chaîne de caractères.
Exemple #1 Récupération du décalage horaire par défaut
<?php
date_default_timezone_set('Europe/London');
if (date_default_timezone_get()) {
echo 'date_default_timezone_set : ' . date_default_timezone_get() . '<br />';
}
if (ini_get('date.timezone')) {
echo 'date.timezone : ' . ini_get('date.timezone');
}
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
date_default_timezone_set : Europe/London date.timezone : Europe/London
Exemple #2 Récupération de l'abréviation d'un décalage horaire
<?php
date_default_timezone_set('America/Los_Angeles');
echo date_default_timezone_get() . ' => ' . date('e') . ' => ' . date('T');
?>
L'exemple ci-dessus va afficher :
America/Los_Angeles => America/Los_Angeles => PST
(PHP 5 >= 5.1.0)
date_default_timezone_set — Définit le décalage horaire par défaut de toutes les fonctions date/heure
date_default_timezone_set() définit le décalage horaire par défaut utilisé par toutes les fonctions date/heure.
Note: Depuis PHP 5.1.0 (lorsque les fonctions date/heure ont été écrites), chaque appel à une fonction date/heure génère une E_NOTICE si le décalage horaire n'est pas valide et/ou un message E_WARNING si vous utilisez des configurations système ou la variable d'environnement TZ.
Au lieu d'utiliser cette fonction pour définir le décalage horaire par défaut dans votre script, vous pouvez également utiliser la configuration INI date.timezone.
L'identifiant de décalage horaire, comme UTC ou Europe/Lisbon. La liste des identifiants valides est disponible dans le Liste des Fuseaux Horaires Supportés.
Cette fonction retourne FALSE si timezone_identifier n'est pas valide, TRUE sinon.
Exemple #1 Récupération du décalage horaire par défaut
<?php
date_default_timezone_set('America/Los_Angeles');
$script_tz = date_default_timezone_get();
if (strcmp($script_tz, ini_get('date.timezone'))){
echo 'Le décalage horaire du script diffère du décalage horaire défini dans le fichier ini.';
} else {
echo 'Le décalage horaire du script est équivalent à celui défini dans le fichier ini.';
}
?>
| Version | Description |
|---|---|
| 5.3.0 | Émet maintenant une alerte de type E_WARNING plutôt qu'une alerte de type E_STRICT. |
| 5.1.2 | La fonction commence à valider le paramètre timezone_identifier . |
(PHP 5 >= 5.3.0)
date_interval_create_from_date_string — Alias de DateInterval::createFromDateString
Cette fonction est un alias de : DateInterval::createFromDateString
(PHP 5 >= 5.3.0)
date_parse_from_format — Récupère les informations d'une date donnée
Retourne un tableau associatif contenant des informations détaillées sur une date donnée.
Format accepté par la fonction date() avec quelques ajouts.
Chaîne représentant la date.
Retourne un tableau associatif avec des informations détaillées sur la date donnée.
Exemple #1 Exemple avec date_parse_from_format()
<?php
$date = "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>
L'exemple ci-dessus va afficher :
Array
(
[year] => 2009
[month] => 1
[day] => 6
[hour] => 13
[minute] => 0
[second] => 0
[fraction] =>
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] => 1
[zone_type] => 1
[zone] => -60
[is_dst] =>
)
(PHP 5 >= 5.2.0)
date_parse — Retourne un tableau associatif avec des informations détaillées sur une date donnée
Retourne un tableau contenant des informations sur la date analysée en cas de succès ou FALSE en cas d'échec.
Dans le cas où la fonction retourne une erreur, l'élément "errors" contiendra les messages d'erreur.
Exemple #1 Exemple avec date_parse()
<?php
print_r(date_parse("2006-12-12 10:00:00.5"));
?>
L'exemple ci-dessus va afficher :
Array
(
[year] => 2006
[month] => 12
[day] => 12
[hour] => 10
[minute] => 0
[second] => 0
[fraction] => 0.5
[warning_count] => 0
[warnings] => Array()
[error_count] => 0
[errors] => Array()
[is_localtime] =>
)
(PHP 5 >= 5.1.2)
date_sun_info — Retourne un tableau avec les informations sur lever/coucher du soleil ainsi que le début et la fin de l'aube
Timestamp.
Latitude en degrés.
Longitude en degrés.
Retourne un tableau en cas de succès ou FALSE en cas d'échec.
Exemple #1 Exemple avec date_sun_info()
<?php
$sun_info = date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
foreach ($sun_info as $key => $val) {
echo "$key: " . date("H:i:s", $val) . "\n";
}
?>
L'exemple ci-dessus va afficher :
sunrise: 05:52:11 sunset: 15:41:21 transit: 10:46:46 civil_twilight_begin: 05:24:08 civil_twilight_end: 16:09:24 nautical_twilight_begin: 04:52:25 nautical_twilight_end: 16:41:06 astronomical_twilight_begin: 04:21:32 astronomical_twilight_end: 17:12:00
(PHP 5)
date_sunrise — Retourne l'heure de levé du soleil pour un jour et un endroit donnés
date_sunrise() retourne l'heure de levé du soleil pour un jour (spécifié par le paramètre timestamp ) et un endroit donnés.
Le timestamp Unix du jour pour lequel l'heure de levé du soleil est donné.
| Constante | Description | Exemple |
|---|---|---|
| SUNFUNCS_RET_STRING | Retourne le résultat en tant que chaîne de caractères | 16:46 |
| SUNFUNCS_RET_DOUBLE | Retourne le résultat en tant que nombre décimal | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Retourne le résultat en tant qu'entier (timestamp) | 1095034606 |
Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.
Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.
Par défaut : date.sunrise_zenith
Spécifié en heures.
Retourne l'heure de levé du soleil dans un format spécifié en cas de succès, FALSE si une erreur survient.
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemple #1 Exemple avec date_sunrise()
<?php
/* Calcul l'heure du levé du soleil pour Lisbonne, Portugal
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/
echo date("D M d Y"). ', sunrise time : ' .date_sunrise(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon Dec 20 2004, sunrise time : 08:54
(PHP 5)
date_sunset — Retourne l'heure de coucher du soleil pour un jour et un endroit donnés
date_sunset() retourne l'heure de couché du soleil pour un jour (spécifié en tant que timestamp Unix) et un endroit donnés.
Le timestamp Unix du jour pour lequel l'heure du couché du soleil est donnée.
| Constante | Description | Exemple |
|---|---|---|
| SUNFUNCS_RET_STRING | Retourne le résultat sous la forme d'une chaîne de caractères | 16:46 |
| SUNFUNCS_RET_DOUBLE | Retourne le résultat sous la forme d'un nombre décimal | 16.78243132 |
| SUNFUNCS_RET_TIMESTAMP | Retourne le résultat sous la forme d'un entier (timestamp) | 1095034606 |
Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.
Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.
Par défaut : date.sunrise_zenith
Spécifié en heures.
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Retourne l'heure de couché du soleil dans un format spécifié, FALSE en cas d'échec.
Exemple #1 Exemple avec date_sunset()
<?php
/* Calcul l'heure du couché du soleil pour Lisbonne, Portugal
Latitude: 38.4 North
Longitude: 9 West
Zenith ~= 90
offset: +1 GMT
*/
echo date("D M d Y"). ', sunset time : ' .date_sunset(time(), SUNFUNCS_RET_STRING, 38.4, -9, 90, 1);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Mon Dec 20 2004, sunset time : 18:13
(PHP 4, PHP 5)
date — Formate une date/heure locale
Retourne une date sous forme d'une chaîne, au format donné par le paramètre format , fournie par le paramètre timestamp ou la date et l'heure courantes si aucun timestamp n'est fourni. En d'autres termes, le paramètre timestamp est optionnel et vaut par défaut la valeur de la fonction time().
Le format de la date désirée. Voir les options de formatage ci-dessous. Il existe aussi de nombreuses constantes de dates qui peuvent être utilisées, ce qui fait que DATE_RSS va remplacer le format "D, d M Y H:i:s".
| Caractères pour le paramètre format | Description | Exemple de valeurs retournées |
|---|---|---|
| Jour | --- | --- |
| d | Jour du mois, sur deux chiffres (avec un zéro initial) | 01 à 31 |
| D | Jour de la semaine, en trois lettres (et en anglais) | Mon à Sun |
| j | Jour du mois sans les zéros initiaux | 1 à 31 |
| l ('L' minuscule) | Jour de la semaine, textuel, version longue, en anglais | Sunday à Saturday |
| N | Représentation numérique ISO-8601 du jour de la semaine (ajouté en PHP 5.1.0) | 1 (pour Lundi) à 7 (pour Dimanche) |
| S | Suffixe ordinal d'un nombre pour le jour du mois, en anglais, sur deux lettres | st, nd, rd ou th. Fonctionne bien avec j |
| w | Jour de la semaine au format numérique | 0 (pour dimanche) à 6 (pour samedi) |
| z | Jour de l'année | 0 à 366 |
| Semaine | --- | --- |
| W | Numéro de semaine dans l'année ISO-8601, les semaines commencent le lundi (ajouté en PHP 4.1.0) | Exemple : 42 (la 42ème semaine de l'année) |
| Mois | --- | --- |
| F | Mois, textuel, version longue; en anglais, comme January ou December | January à December |
| m | Mois au format numérique, avec zéros initiaux | 01 à 12 |
| M | Mois, en trois lettres, en anglais | Jan à Dec |
| n | Mois sans les zéros initiaux | 1 à 12 |
| t | Nombre de jours dans le mois | 28 à 31 |
| Année | --- | --- |
| L | Est ce que l'année est bissextile | 1 si bissextile, 0 sinon. |
| o | L'année ISO-8601. C'est la même valeur que Y, excepté que si le numéro de la semaine ISO (W) appartient à l'année précédente ou suivante, cette année sera utilisé à la place. (ajouté en PHP 5.1.0) | Exemples : 1999 ou 2003 |
| Y | Année sur 4 chiffres | Exemples : 1999 ou 2003 |
| y | Année sur 2 chiffres | Exemples : 99 ou 03 |
| Heure | --- | --- |
| a | Ante meridiem et Post meridiem en minuscules | am ou pm |
| A | Ante meridiem et Post meridiem en majuscules | AM ou PM |
| B | Heure Internet Swatch | 000 à 999 |
| g | Heure, au format 12h, sans les zéros initiaux | 1 à 12 |
| G | Heure, au format 24h, sans les zéros initiaux | 0 à 23 |
| h | Heure, au format 12h, avec les zéros initiaux | 01 à 12 |
| H | Heure, au format 24h, avec les zéros initiaux | 00 à 23 |
| i | Minutes avec les zéros initiaux | 00 à 59 |
| s | Secondes, avec zéros initiaux | 00 à 59 |
| u | Microsecondes (ajouté en PHP 5.2.2) | Exemple : 54321 |
| Fuseau horaire | --- | --- |
| e | L'identifiant du fuseau horaire (ajouté en PHP 5.1.0) | Exemples : UTC, GMT, Atlantic/Azores |
| I (i majuscule) | L'heure d'été est activée ou pas | 1 si oui, 0 sinon. |
| O | Différence d'heures avec l'heure de Greenwich (GMT), exprimée en heures | Exemple : +0200 |
| P | Différence avec l'heure Greenwich (GMT) avec un deux-points entre les heures et les minutes (ajouté dans PHP 5.1.3) | Exemple : +02:00 |
| T | Abréviation du fuseau horaire | Exemples : EST, MDT ... |
| Z | Décalage horaire en secondes. Le décalage des zones à l'ouest de la zone UTC est négative, et à l'est, il est positif. | -43200 à 50400 |
| Date et Heure complète | --- | --- |
| c | Date au format ISO 8601 (ajouté en PHP 5) | 2004-02-12T15:19:21+00:00 |
| r | Format de date » RFC 2822 | Exemple : Thu, 21 Dec 2000 16:01:07 +0200 |
| U | Secondes depuis l'époque Unix (1er Janvier 1970, 0h00 00s GMT) | Voir aussi time() |
Les caractères non reconnus seront imprimés tels quel. "Z" retournera toujours 0 lorsqu'il est utilisé avec gmdate().
Note: Sachant que cette fonction n'accepte que des entiers sous la forme de timestamp, le caractère u n'est utile que lors de l'utilisation de la fonction date_format() avec un timestamp utilisateur créé avec la fonction date_create().
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne une date formatée. Si une valeur non-numérique est utilisée dans le paramètre timestamp , FALSE sera retourné et une erreur de niveau E_WARNING est émise.
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | L'intervalle de validité d'un timestamp va généralement du Vendredi 13 Décembre 1901 20:45:54 GMT au Mardi 19 Janvier 2038 03:14:07 GMT. (Ces dates correspondent aux valeurs minimales et maximales des entiers 32 bits non-signés). Cependant, avant PHP 5.1.0, cette intervalle va du 01-01-1970 au 19-01-2038 sur quelques systèmes (e.g. Windows). |
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
| 5.1.1 | Il y a plusieurs constantes utiles de formats date/heure standards qui peuvent être utilisées pour spécifier le paramètre format . |
Exemple #1 Exemple avec date()
<?php
// Définit le fuseau horaire par défaut à utiliser. Disponible depuis PHP 5.1
date_default_timezone_set('UTC');
// Affichage de quelque chose comme : Monday
echo date("l");
// Affichage de quelque chose comme : Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
// Affiche : July 1, 2000 is on a Saturday
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* utilise les constantes dans le paramètre format */
// Affichage de quelque chose comme : Mon, 15 Aug 2005 15:12:46 UTC
echo date(DATE_RFC822);
// Affichage de quelque chose comme : 2000-07-01T00:00:00+00:00
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
Vous pouvez faire afficher un caractère spécial dans la chaîne de format en le protégeant par un antislash. Si le caractère est lui-même une séquence incluant un antislash, vous devrez protéger aussi l'antislash.
Exemple #2 Protection des caractères dans la fonction date()
<?php
// Affichage de quelque chose comme : Wednesday the 15th
echo date("l \\t\h\e jS");
?>
Il est possible d'utiliser date() et mktime() ensemble pour générer des dates dans le futur ou dans le passé.
Exemple #3 Exemple avec date() et mktime()
<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Note: Cette méthode est plus sûre que simplement ajouter ou retrancher le nombre de secondes dans une journée ou un mois à un timestamp, à cause des heures d'hiver et d'été.
Voici maintenant quelques exemples de formatage avec date(). Notez que vous devriez échapper tous les autres caractères, car s'ils ont une signification spéciale, ils risquent de produire des effets secondaires indésirables. Notez aussi que les versions futures de PHP peuvent attribuer une signification à des lettres qui sont actuellement inertes. Lorsque vous échappez les caractères, pensez à utiliser des guillemets simples, pour que les séquences \n ne deviennent pas des nouvelles lignes.
Exemple #4 Exemple avec date()
<?php
// Aujourd'hui, le 12 Mars 2001, 5:16:18 pm, Fuseau horaire
// Mountain Standard Time (MST)
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day'); // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day (10ème jour du mois).
$today = date("D M j G:i:s T Y"); // Sat Mar 10 17:16:18 MST 2001
$today = date('H:m:s \m \e\s\t\ \l\e\ \m\o\i\s'); // 17:16:18 m est le mois
$today = date("H:i:s"); // 17:16:18
?>
Pour formater des dates dans d'autres langues, utilisez les fonctions setlocale() et strftime() au lieu de la fonction date().
Note: Pour générer un timestamp à partir d'une représentation de date, vous pouvez utiliser la fonction strtotime(). De plus, certaines bases de données disposent de fonctions pour convertir leurs propres formats de date en timestamp (par exemple, MySQL et sa fonction » UNIX_TIMESTAMP()).
Un timestamp représentant le début de la requête est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.
(PHP 4, PHP 5)
getdate — Retourne la date/heure
Retourne un tableau associatif contenant les informations de date et d'heure du timestamp timestamp lorsqu'il est fourni, sinon, le timestamp de la date/heure courante locale.
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne un tableau associatif contenant les informations de date et d'heure du timestamp timestamp . Les éléments du tableau associatif retourné sont les suivants :
| Clé | Description | Exemple de valeur retournée |
|---|---|---|
| "seconds" | Représentation numérique des secondes | 0 à 59 |
| "minutes" | Représentation numérique des minutes | 0 à 59 |
| "hours" | Représentation numérique des heures | 0 à 23 |
| "mday" | Représentation numérique du jour du mois courant | 1 à 31 |
| "wday" | Représentation numérique du jour de la semaine courante | 0 (pour Dimanche) à 6 (pour Samedi) |
| "mon" | Représentation numérique du mois | 1 à 12 |
| "year" | Année, sur 4 chiffres | Exemples : 1999 ou 2003 |
| "yday" | Représentation numérique du jour de l'année | 0 à 365 |
| "weekday" | Version texte du jour de la semaine | Sunday à Saturday |
| "month" | Version texte du mois, comme January ou March | January à December |
| 0 | Nombre de secondes depuis l'époque Unix, similaire à la valeur retournée par la fonction time() et utilisée par date(). | Dépend du système, typiquement de -2147483648 à 2147483647. |
Exemple #1 Exemple avec getdate()
<?php
$today = getdate();
print_r($today);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Tuesday
[month] => June
[0] => 1055901520
)
(PHP 4, PHP 5)
gettimeofday — Retourne l'heure actuelle
C'est une interface avec gettimeofday(2). Elle retourne un tableau associatif qui contient les informations retournées par le système.
Lorsque défini à TRUE, un nombre décimal est retourné à la place d'un tableau.
Par défaut, un tableau est retourné. Si le paramètre return_float est défini, alors un nombre décimal sera retourné.
Clés du tableau :
| Version | Description |
|---|---|
| 5.1.0 | Le paramètre return_float a été ajouté. |
Exemple #1 Exemple avec gettimeofday()
<?php
print_r(gettimeofday());
echo gettimeofday(true);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array ( [sec] => 1073504408 [usec] => 238215 [minuteswest] => 0 [dsttime] => 1 ) 1073504408.23910
(PHP 4, PHP 5)
gmdate — Formate une date/heure GMT/CUT
gmdate() est identique à la fonction date(), hormis le fait que le temps retourné est GMT (Greenwich Mean Time).
Le format de la date en sortie. Voir les options de formatage pour la fonction date().
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne une date formatée. Si une valeur non numérique est utilisée pour le paramètre timestamp , FALSE est retourné et une erreur de niveau E_WARNING sera émise.
| Version | Description |
|---|---|
| 5.1.0 | L'intervalle de validité d'un timestamp est typiquement depuis le Vendredi 13 Décembre 1901 20:45:54 GMT au 19 Janvier 2038 03:14:07 GMT. (ce qui correspond aux valeurs minimales et maximales d'un entier 32 bits signé). Cependant, avant PHP 5.1.0, cet intervalle était limité de 01-01-1970 à 19-01-2038 sous quelques systèmes (e.g. Windows). |
| 5.1.1 | Il y a quelques constants utiles pour les formats standards date/heure qui peuvent être utilisées dans le paramètre format . |
Exemple #1 Exemple avec gmdate()
Lorsque cette fonction est exécutée en Finlande (GMT +0200), la première ligne ci-dessous affichera "Jan 01 1998 00:00:00", tandis que la seconde affichera "Dec 31 1997 22:00:00".
<?php
echo date("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
echo gmdate("M d Y H:i:s", mktime(0, 0, 0, 1, 1, 1998));
?>
(PHP 4, PHP 5)
gmmktime — Retourne le timestamp UNIX d'une date GMT
Identique à la fonction mktime() excepté le fait que les paramètres passés sont GMT. gmmktime() utilise en interne la fonction mktime(), donc, seuls les temps valides dans la zone locale dérivée peuvent être utilisés.
Comme mktime(), les arguments restants peuvent être ignorés. Ils prendront alors leurs valeurs GMT actuelles.
Les heures
Les minutes
Les secondes
Le mois
Le jour
L'année
Les paramètres représentent toujours une date GMT donc, le paramètre is_dst n'influence pas le résultat.
Retourne un timestamp Unix de type entier.
| Version | Description |
|---|---|
| 5.1.0 | Depuis PHP 5.1.0, le paramètre is_dst est devenu obsolète. Comme résultat, le nouveau gestionnaire de fuseau horaire doit être utilisé à la place. |
Exemple #1 Exemple avec gmmktime()
<?php
gmmktime(0, 0, 0, 1, 1, 1970); // valide en GMT et l'ouest, invalide à l'est
?>
(PHP 4, PHP 5)
gmstrftime — Formate une date/heure GMT/CUT en fonction de la configuration locale
gmstrftime() se comporte exactement comme strftime() hormis le fait que l'heure utilisée est celle de Greenwich (Greenwich Mean Time, GMT). Par exemple, dans la zone Eastern Standard Time (est des USA) est GMT -0500, la première ligne de l'exemple ci-dessous affiche "Dec 31 1998 20:00:00", tandis que la seconde affiche "Jan 01 1999 01:00:00".
Voir la description de la fonction strftime().
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne une chaîne de caractères formatée suivant le format donné par le paramètre timestamp ou la date courante si aucun paramètre timestamp n'est fourni. Les noms des mois, des jours de la semaine et des autres chaînes dépendant d'une localisation donnée, respectent la localisation courante définie par la fonction setlocale().
Exemple #1 Exemple avec gmstrftime()
<?php
setlocale(LC_TIME, 'en_US');
echo strftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
echo gmstrftime("%b %d %Y %H:%M:%S", mktime(20, 0, 0, 12, 31, 98)) . "\n";
?>
(PHP 5)
idate — Formate une date/heure locale en tant qu'entier
idate() retourne une nombre formaté avec le format format et représentant le timestamp timestamp ou l'heure courant si timestamp est omis. En d'autres termes, le paramètre timestamp est optionnel et la valeur par défaut est la valeur retournée par la fonction time().
À l'inverse de la fonction date(), idate() accepte juste un caractère comme paramètre format .
| Caractères de format | Description |
|---|---|
| B | Temps Internet Swatch Beat |
| d | Le jour du mois |
| h | Heure (format 12 heures) |
| H | Heure (format 24 heures) |
| i | Minutes |
| I(i, en majuscule) | Retourne 1 si l'heure d'été est activée, 0 sinon |
| L(l, en majuscule) | Retourne 1 pour une année bissextile, 0 sinon |
| m | Numéro du mois |
| s | Secondes |
| t | Jour du mois courant |
| U | Secondes depuis l'époque Unix - 1 Janvier 1970 00:00:00 UTC - c'est la même chose que la fonction time() |
| w | Jour de la semaine (0 pour Dimanche) |
| W | Le numéro de semaine de l'année ; selon l'ISO-8601, les semaines débutent le Lundi |
| y | Année sur 1 ou 2 chiffres, voir la note plus bas |
| Y | Année sur 4 chiffres |
| z | Jour de l'année |
| Z | Décalage horaire, en secondes |
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne un entier.
Sachant que idate() retourne toujours un entier et qu'il ne peut commencer par 0, idate() peut retourner moins de chiffres que ce dont on pourrait espérer. Voir l'exemple ci-dessous.
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemple #1 Exemple avec idate()
<?php
$timestamp = strtotime('1st January 2004'); //1072915200
// ceci affiche l'année sur deux chiffres
// néanmoins, vu que ce chiffre va commencer par "0",
// seul "4" sera affiché
echo idate('y', $timestamp);
?>
(PHP 4, PHP 5)
localtime — Récupère l'heure locale
localtime() retourne un tableau identique à la structure retournée par la fonction C localtime.
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
si défini à FALSE ou ignoré, force localtime() à retourner un tableau à index numérique. S'il est mis à TRUE, localtime() retourne un tableau associatif, avec tous les éléments de la structure C, accessible avec les clés. Les noms des différentes clés du tableau associatif sont les suivants :
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemple #1 Exemple avec localtime()
<?php
$localtime = localtime();
$localtime_assoc = localtime(time(), true);
print_r($localtime);
print_r($localtime_assoc);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Array
(
[0] => 24
[1] => 3
[2] => 19
[3] => 3
[4] => 3
[5] => 105
[6] => 0
[7] => 92
[8] => 1
)
Array
(
[tm_sec] => 24
[tm_min] => 3
[tm_hour] => 19
[tm_mday] => 3
[tm_mon] => 3
[tm_year] => 105
[tm_wday] => 0
[tm_yday] => 92
[tm_isdst] => 1
)
(PHP 4, PHP 5)
microtime — Retourne le timestamp UNIX actuel avec les microsecondes
microtime() retourne le timestamp Unix, avec les microsecondes. Cette fonction est uniquement disponible sur les systèmes qui supportent la fonction gettimeofday().
Lorsque cette fonction est appelée sans l'argument optionnel, elle retourne la chaîne "msec sec" avec sec qui est mesurée en secondes depuis le début de l'époque UNIX, (1er janvier 1970 00:00:00 GMT), et msec qui est le nombre de microsecondes de cette heure. Les deux parties de la chaîne sont retournées sous la forme de secondes.
Si le paramètre optionnel get_as_float est défini à TRUE alors microtime() retourne un nombre à virgule.
| Version | Description |
|---|---|
| 5.0.0 | Le paramètre get_as_float a été ajouté. |
Exemple #1 Durée d'exécution d'un script avec la fonction microtime()
<?php
/**
* Fonction simple identique à celle en PHP 5 qui va suivre
*/
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
// Attend pendant un moment
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Ne rien faire pendant $time secondes\n";
?>
Exemple #2 Durée d'exécution d'un script en PHP 5
<?php
$time_start = microtime(true);
// Sleep for a while
usleep(100);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
?>
(PHP 4, PHP 5)
mktime — Retourne le timestamp UNIX d'une date
mktime() retourne un timestamp UNIX correspondant aux arguments fournis. Ce timestamp est un entier long, contenant le nombre de secondes entre le début de l'époque UNIX (1er Janvier 1970 00:00:00 GMT) et le temps spécifié.
Les arguments peuvent être omis, de droite à gauche, et tous les arguments manquants sont utilisés avec la valeur courante de l'heure et du jour.
L'heure.
Les minutes
Les secondes.
Le nombre représentant le mois.
Le nombre représentant le jour.
L'année, peut être sur deux ou quatre chiffres, avec des valeurs allant de 0 à 69, correspondant au valeur 2000 à 2069 et 70 à 100, correspondant au valeur 1970 à 2000. Sur les systèmes où time_t un entier signé sur 32bits, ce qui est le plus courant de nos jours, la période valide pour year est quelque part près de 1901 et 2038. Cependant, avant PHP 5.1.0, cette intervalle était limitée de 1970 à 2038 sur quelques systèmes (i.e. Windows).
Ce paramètre peut être mis à 1 si l'heure d'hiver est appliquée (DST), 0 si elle ne l'est pas, et -1 (par défaut) si on ne sait pas. Si l'on ne sait pas, PHP tente de le traiter lui-même. Ceci peut occasionner des résultats inattendus (mais néanmoins correct). Quelques temps sont invalides si DST est activé sur les systèmes où PHP fonctionne ou is_dist est défini à 1. Si DST est activé e.g. 2:00, tous les temps entre 2:00 et 3:00 sont invalides et la fonction mktime() retourne une valeur indéfinie (généralement une valeur négative). Quelques systèmes (e.g. Solaris 8) activent DST à minuit, donc, le temps 0:30 du jour lorsque DST est activé est évalué à 23:30 du jour précédent.
Note: Depuis PHP 5.1.0, ce paramètre est déprécié. Comme résultat, le nouveau gestionnaire de fuseau horaire doit être utilisé à la place.
mktime() retourne un timestamp Unix des arguments donnés. Si les arguments ne sont pas valides, la fonction retournera FALSE (avant PHP 5.1, elle retournait -1).
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.3.0 | mktime() lance maintenant une alerte de type E_DEPRECATED si le paramètre is_dst est utilisé. |
| 5.1.0 | Le paramètre is_dst est déprécié. Fait que la fonction retourne FALSE en cas d'erreur, au lieu de -1. |
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemple #1 Exemple simple avec mktime()
<?php
// Configuration du fuseau horaire. Disponible depuis PHP 5.1
date_default_timezone_set('UTC');
// Affiche : July 1, 2000 est un Saturday
echo "July 1, 2000 est un " . date("l", mktime(0, 0, 0, 7, 1, 2000));
// Affiche quelque chose comme : 2006-04-05T01:02:03+00:00
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>
Exemple #2 Exemple avec mktime()
mktime() est pratique pour faire des calculs de dates et des validations, car elle va automatiquement corriger les valeurs invalides. Par exemple, toutes les lignes suivantes vont retourner la même date : "Jan-01-1998".
<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>
Exemple #3 Dernier jour du mois suivant
Le dernier jour d'un mois peut être décrit comme le jour "0" du mois suivant, et non pas le jour -1. Les deux exemples suivants vont donner : "Le dernier jour de Février 2000 est: 29".
<?php
$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Le dernier jour de Fevrier 2000 est : %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Le dernier jour de Fevrier 2000 est : %d", $lastday);
?>
Avant PHP 5.1.0, les valeurs négatives des timestamp ne sont pas supportées sous toutes les versions actuelles de Microsoft Windows. De ce fait, l'intervalle valide pour les années est de 1970 à 2038, inclus.
(PHP 4, PHP 5)
strftime — Formate une date/heure locale avec la configuration locale
Formate une date et/ou une heure suivant la localisation locale. Les noms des mois, des jours de la semaine mais aussi d'autres chaînes dépendant de la location, respecteront la localisation courante définie par la fonction setlocale().
Tous les caractères modificateurs ne sont pas toujours supportés par toutes les bibliothèques C. Dans ce cas, ils ne seront pas supportés par PHP non plus. De plus, toutes les plates-formes ne supportent pas les timestamps négatifs, et vos dates pourraient être limitées par le début de l'époque Unix. Cela signifie que %e, %T, %R et %D (et peut être d'autres) et les dates antérieures au 1er Janvier 1970 ne fonctionneront pas sous Windows, sur certaines distributions de Linux, et sur certains systèmes d'exploitation. Pour Windows, une liste complète des options de conversion est disponible sur le » site de MSDN.
| format | Description | Exemple de valeurs retournées |
|---|---|---|
| Jour | --- | --- |
| %a | Nom abrégé du jour de la semaine | De Sun à Sat |
| %A | Nom complet du jour de la semaine | De Sunday à Saturday |
| %d | Jour du mois en numérique, sur 2 chiffres (avec le zéro initial) | De 01 à 31 |
| %e | Jour du mois, avec un espace précédant le premier chiffre | De 1 à 31 |
| %j | Jour de l'année, sur 3 chiffres avec un zéro initial | 001 à 366 |
| %u | Représentation ISO-8601 du jour de la semaine | De 1 (pour Lundi) à 7 (pour Dimanche) |
| %w | Représentation numérique du jour de la semaine | De 0 (pour Dimanche) à 6 (pour Samedi) |
| Semaine | --- | --- |
| %U | Numéro de la semaine de l'année donnée, en commençant par le premier Lundi comme première semaine | 13 (pour la 13ème semaine pleine de l'année) |
| %V | Numéro de la semaine de l'année, suivant la norme ISO-8601:1988, en commençant comme première semaine, la semaine de l'année contenant au moins 4 jours, et où Lundi est le début de la semaine | De 01 à 53 (où 53 compte comme semaine de chevauchement) |
| %W | Une représentation numérique de la semaine de l'année, en commençant par le premier Lundi de la première semaine | 46 (pour la 46ème semaine de la semaine commençant par un Lundi) |
| Mois | --- | --- |
| %b | Nom du mois, abrégé, suivant la locale | De Jan à Dec |
| %B | Nom complet du mois, suivant la locale | De January à December |
| %h | Nom du mois abrégé, suivant la locale (alias de %b) | De Jan à Dec |
| %m | Mois, sur 2 chiffres | De 01 (pour Janvier) à 12 (pour Décembre) |
| Année | --- | --- |
| %C | Représentation, sur 2 chiffres, du siècle (année divisée par 100, réduit à un entier) | 19 pour le 20ème siècle |
| %g | Représentation, sur 2 chiffres, de l'année, compatible avec les standards ISO-8601:1988 (voyez %V) | Exemple : 09 pour la semaine du 6 janvier 2009 |
| %G | La version complète à quatre chiffres de %g | Exemple : 2008 pour la semaine du 3 janvier 2009 |
| %y | L'année, sur 2 chiffres | Exemple : 09 pour 2009, 79 pour 1979 |
| %Y | L'année, sur 4 chiffres | Exemple : 2038 |
| Heure | --- | --- |
| %H | L'heure, sur 2 chiffres, au format 24 heures | De 00 à 23 |
| %I | Heure, sur 2 chiffres, au format 12 heures | De 01 à 12 |
| %l ('L' minuscule) | Heure, au format 12 heures, avec un espace précédant de complétion pour les heures sur un chiffre | De 1 à 12 |
| %M | Minute, sur 2 chiffres | De 00 à 59 |
| %p | 'AM' ou 'PM', en majuscule, basé sur l'heure fournie | Exemple : AM pour 00:31, PM pour 22:23 |
| %P | 'am' ou 'pm', en minuscule, basé sur l'heure fournie | Exemple : am pour 00:31, pm pour 22:23 |
| %r | Identique à "%I:%M:%S %p" | Exemple : 09:34:17 PM pour 21:34:17 |
| %R | Identique à "%H:%M" | Exemple : 00:35 pour 12:35 AM, 16:44 pour 4:44 PM |
| %S | Seconde, sur 2 chiffres | De 00 à 59 |
| %T | Identique à "%H:%M:%S" | Exemple : 21:34:17 pour 09:34:17 PM |
| %X | Représentation de l'heure, basée sur la locale, sans la date | Exemple : 03:59:16 ou 15:59:16 |
| %z | Soit le décalage horaire depuis UTC, ou son abréviation (suivant le système d'exploitation) | Exemple : -0500 ou EST pour l'heure de l'Est |
| %Z | Le décalage horaire ou son abréviation NON fournie par %z (suivant le système d'exploitation) | Exemple : -0500 ou EST pour l'heure de l'Est |
| L'heure et la date | --- | --- |
| %c | Date et heure préférées, basées sur la locale | Exemple : Tue Feb 5 00:45:10 2009 pour le 4 Février 2009 à 12:45:10 AM |
| %D | Identique à "%m/%d/%y" | Exemple : 02/05/09 pour le 5 Février 2009 |
| %F | Identique à "%Y-%m-%d" (utilisé habituellement par les bases de données) | Exemple : 2009-02-05 pour le 5 février 2009 |
| %s | Timestamp de l'époque Unix (identique à la fonction time()) | Exemple : 305815200 pour le 10 Septembre 1979 08:40:00 AM |
| %x | Représentation préférée de la date, basée sur la locale, sans l'heure | Exemple : 02/05/09 pour le 5 Février 2009 |
| Divers | --- | --- |
| %n | Une nouvelle ligne ("\n") | --- |
| %t | Une tabulation ("\t") | --- |
| %% | Le caractère de pourcentage ("%") | --- |
La longueur maximale de ce paramètre est de 1023 caractères.
Contrairement à la norme ISO-9889:1999, Sun Solaris commence avec le Dimanche à 1. Aussi, le format %u ne fonctionnera pas tel que décrit dans ce manuel.
Le paramètre optionnel timestamp est un timestamp Unix de type entier qui vaut par défaut l'heure courante locale si le paramètre timestamp n'est pas fourni. En d'autres termes, il faut par défaut la valeur de la fonction time().
Retourne une chaîne de caractères formatée suivant le paramètre format donné, en utilisant le paramètre timestamp ou la date locale courante si aucun timestamp n'est fourni. Les noms des mois, des jours de la semaine mais aussi d'autres chaînes dépendant de la location, respecteront la localisation courante définie par la fonction setlocale().
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Cet exemple ne fonctionnera que si vous avez les locales respectives installées sur votre système.
Exemple #1 Exemple avec strftime()
<?php
setlocale(LC_TIME, "C");
echo strftime("%A");
setlocale(LC_TIME, "fi_FI");
echo strftime(" in Finnish is %A,");
setlocale(LC_TIME, "fr_FR");
echo strftime(" in French %A and");
setlocale(LC_TIME, "de_DE");
echo strftime(" in German %A.\n");
?>
Exemple #2 Exemple au format de date ISO 8601:1988
<?php
/* December 2002 / January 2003
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 16 17 18 19 20 21 22
52 23 24 25 26 27 28 29
1 30 31 1 2 3 4 5
2 6 7 8 9 10 11 12
3 13 14 15 16 17 18 19 */
// Affiche : 12/28/2002 - %V,%G,%Y = 52,2002,2002
echo "12/28/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/28/2002")) . "\n";
// Affiche : 12/30/2002 - %V,%G,%Y = 1,2003,2002
echo "12/30/2002 - %V,%G,%Y = " . strftime("%V,%G,%Y", strtotime("12/30/2002")) . "\n";
// Affiche : 1/3/2003 - %V,%G,%Y = 1,2003,2003
echo "1/3/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2003")) . "\n";
// Affiche : 1/10/2003 - %V,%G,%Y = 2,2003,2003
echo "1/10/2003 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/10/2003")) . "\n";
/* December 2004 / January 2005
ISOWk M Tu W Thu F Sa Su
----- ----------------------------
51 13 14 15 16 17 18 19
52 20 21 22 23 24 25 26
53 27 28 29 30 31 1 2
1 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 */
// Affiche : 12/23/2004 - %V,%G,%Y = 52,2004,2004
echo "12/23/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/23/2004")) . "\n";
// Affiche : 12/31/2004 - %V,%G,%Y = 53,2004,2004
echo "12/31/2004 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("12/31/2004")) . "\n";
// Affiche : 1/2/2005 - %V,%G,%Y = 53,2004,2005
echo "1/2/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/2/2005")) . "\n";
// Affiche : 1/3/2005 - %V,%G,%Y = 1,2005,2005
echo "1/3/2005 - %V,%G,%Y = " . strftime("%V,%G,%Y",strtotime("1/3/2005")) . "\n";
?>
Note: %G et %V, qui sont basées sur la semaine ISO 8601:1988, peut conduire à des résultat inattendus (bien que corrects) si le système de numérotation n'est pas connu. Voir l'exemple %V de cette page.
strptime() retourne un tableau après avoir analysé date , ou FALSE en cas d'erreur.
Les noms des mois et jour de la semaine dépendent de la configuration locale, choisie avec setlocale() (LC_TIME).
La chaîne à analyser (e.g. retourné par strftime())
Le format utilisé par date (e.g. le même que celui qui a été utilisé par strftime()).
Pour plus d'informations sur les spécificateurs de formats, voyez la fonction strftime().
Retourne un tableau, ou FALSE en cas d'erreur.
| Paramètres | Description |
|---|---|
| "tm_sec" | Secondes après la minute (0-61) |
| "tm_min" | Minutes après l'heure (0-59) |
| "tm_hour" | Heure depuis minuit (0-23) |
| "tm_mday" | Jour du mois (1-31) |
| "tm_mon" | Mois depuis janvier (0-11) |
| "tm_year" | Années depuis 1900 |
| "tm_wday" | Jours depuis dimanche (0-6) |
| "tm_yday" | Jours depuis le 1er janvier (0-365) |
| "unparsed" | La partie de date qui n'a pas été reconnue par l'analyseur avec le format spécifié. |
Exemple #1 Exemple avec strptime()
<?php
$format = '%d/%m/%Y %H:%M:%S';
$strf = strftime($format);
echo "$strf\n";
print_r(strptime($strf, $format));
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
03/10/2004 15:54:19
Array
(
[tm_sec] => 19
[tm_min] => 54
[tm_hour] => 15
[tm_mday] => 3
[tm_mon] => 9
[tm_year] => 104
[tm_wday] => 0
[tm_yday] => 276
[unparsed] =>
)
Note: Cette fonction n'est pas implémentée sous Windows.
(PHP 4, PHP 5)
strtotime — Transforme un texte anglais en timestamp
strtotime() essaye de lire une date au format anglais US dans la chaîne time , et de la transformer en timestamp Unix (le nombre de secondes depuis le 1er Janvier 1970 à 00:00:00 UTC), relativement au timestamp now , ou à la date courante si ce dernier est omis.
Cette fonction devrait utiliser la variable d'environnement TZ (si disponible) pour calculer le timestamp. Depuis PHP 5.1.0, il y a une façon simple de définir un fuseau horaire à utiliser avec toutes les fonctions de date/heure. Le processus est expliqué dans la page du manuel de la fonction date_default_timezone_get().
Note: Si l'année est spécifiée sur deux chiffres, les valeurs entre 00 et 69 correspondent aux années entre 2000 et 2069 et les valeurs entre 70 et 99 correspondent aux années entre 1970 et 1999. Voyez les notes ci-dessous pour les cas particuliers sur les systèmes 32 bits (les dates sont peut être limitées au 19 janvier 2038, 03:14:07).
La chaîne à analyser. Avant PHP 5.0.0, les microsecondes n'étaient pas autorisées dans l'heure ; depuis PHP 5.0.0, elles sont autorisées, mais seront ignorées.
Le timestamp, représentant la date courante, utilisé pour le calcul relative des dates.
Retourne un timestamp en cas de succès, FALSE sinon. Avant PHP 5.1.0, cette fonction retournait -1 en cas d'échec.
Chaque appel à une fonction date/heure générera un message de type E_NOTICE si le fuseau horaire n'est pas valide., et/ou un message de type E_STRICT ou E_WARNING si vous utilisez la configuration du système ou la variable d'environnement TZ. Voir aussi date_default_timezone_set()
| Version | Description |
|---|---|
| 5.1.0 | La fonction retourne maintenant FALSE en cas d'échec, au lieu de -1. |
| 5.1.0 | Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires. |
Exemple #1 Exemple avec strtotime()
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
Exemple #2 Vérification d'erreur
<?php
$str = 'Pas bon';
// Avant PHP 5.1.0, vous devez comparer avec -1, au lieu de false
if (($timestamp = strtotime($str)) === false) {
echo "La chaîne ($str) est boguée";
} else {
echo "$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}
?>
En PHP 5 supérieur à 5.0.2, "now" et les autres valeurs de temps relatives sont incorrectement calculées depuis minuit du jour courant. Ce comportement diffère des versions antérieures où elles étaient correctement calculées depuis l'heure courante.
Dans les versions antérieures à PHP 4.4.0, "next" est calculé de façon incorrecte comme +2. Une solution consiste à utiliser "+1".
Note: L'intervalle de validité d'un timestamp va du Vendredi 13 Décembre 1901 20:45:54 UTC au Mardi 19 Janvier 2038 03:14:07 UTC. (Cela correspond aux dates maximales et minimales pour un entier de 32 bits signé.) Toutes les plates-formes ne supportent pas les timestamp négatifs et dans ce cas, l'intervalle de date sera limitée à environs l'époque Unix. Cela signifie que les dates antérieures au 1 Janvier 1970 ne fonctionneront pas sous Windows, quelques distributions Linux et quelques autres systèmes. PHP 5.1.0 ainsi que les versions plus récentes outrepassent cette limitation.
(PHP 4, PHP 5)
time — Retourne le timestamp UNIX actuel
time() retourne l'heure courante, mesurée en secondes depuis le début de l'époque UNIX, (1er janvier 1970 00:00:00 GMT).
Exemple #1 Exemple avec time()
<?php
$nextWeek = time() + (7 * 24 * 60 * 60);
// 7 jours; 24 heures; 60 minutes; 60secondes
echo 'Aujourd\'hui : '. date('Y-m-d') ."\n";
echo 'Semaine prochaine : '. date('Y-m-d', $nextWeek) ."\n";
// ou en utilisant strtotime():
echo 'Semaine prochaine : '. date('Y-m-d', strtotime('+1 week')) ."\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Aujourd'hui : 2005-03-30 Semaine prochaine : 2005-04-06 Semaine prochaine : 2005-04-06
Un timestamp représentant le début de la demande est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.
(PHP 5 >= 5.1.0)
timezone_abbreviations_list — Alias de DateTimeZone::listAbbreviations
Cette fonction est un alias de : DateTimeZone::listAbbreviations
(PHP 5 >= 5.1.0)
timezone_identifiers_list — Alias de DateTimeZone::listIdentifiers
Cette fonction est un alias de : DateTimeZone::listIdentifiers
(PHP 5 >= 5.1.3)
timezone_name_from_abbr — Retourne le nom du fuseau horaire à partir de son abréviation
Abréviation du fuseau horaire.
Décalage à partir du GMT en seconde. La valeur par défaut est -1 ce qui signifie que le premier fuseau horaire trouvé correspondant à abbr est retourné. Autrement, le décalage exact est recherché et seulement s'il n'est pas trouvé alors le premier fuseau horaire avec n'importe quel décalage est retourné.
Indicateur d'heure avancée. Si abbr n'existe pas, alors le fuseau horaire est recherché seulement par offset et isdst .
Retourne un nom de fuseau horaire en cas de succès ou FALSE en cas d'échec.
Exemple #1 Exemple avec timezone_name_from_abbr()
<?php
echo timezone_name_from_abbr("CET") . "\n";
echo timezone_name_from_abbr("", 3600, 0) . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Europe/Berlin Europe/Paris
Identifiant du fuseau horaire, sous forme de nom complet (par exemple Europe/Prague) ou son abréviation (par exemple CET).
Retourne un objet DateTimeZone en cas de succès ou FALSE en cas d'échec.
(PHP 5 >= 5.2.0)
timezone_transitions_get — Alias de DateTimeZone::getTransitions
Cette fonction est un alias de : DateTimeZone::getTransitions
(PHP 5 >= 5.3.0)
timezone_version_get — Lit la version de la timezonedb
timezone_version_get() lit la version de la timezonedb.
Retourne une chaîne de caractères.
Exemple #1 Lecture de la version de la timezonedb
<?php
echo timezone_version_get();
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
2009.7
Il s'agit d'une extension du langage PHP pour la bibliothèque RedHat Newt, une fenêtre basé sur un terminal et sur une bibliothèque de widget pour écrire des applications avec des interfaces conviviaux. Une fois que cette extension est activé dans PHP, vous aurez la possibilité d'utiliser des widgets, comme des fenêtres, des boutons, des boîtes à cocher, des boîtes radio, des labels, des boîtes texte, des barres de défilement, de grandes boîtes texte, des règles, etc. L'utilisation de cette extension est vraiment similaire à l'API original Newt du langage de programmation C.
Ce module utilise les fonctions de la bibliothèque RedHat Newt. Vous aurez besoin de la version libnewt >= 0.51.0.
Cette extension » PECL n'est pas intégrée à PHP. Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » http://pecl.php.net/package/newt.
En PHP 4, les sources de cette extension PECL peuvent être trouvées dans le dossier ext/ avec les sources de PHP ou sur le lien PECL ci-dessous. Afin d'utiliser ces fonctions, vous devez compiler le support newt en CGI ou en CLI PHP en utilisant l'option de configure --with-newt[=DIR].
Note: Cette extension n'est pas disponible pour la plate-forme Windows.
Vous aurez aussi besoin des bibliothèques curses et slang afin de compiler cette extension. Pour spécifier des emplacements de ces bibliothèques, utilisez les options de configuration suivante : --with-curses-dir=/path/to/libcurses --with-slang-dir=/path/to/libslang
Cette extension ne définit aucune directive de configuration.
Cette extension utilise deux types de ressources : "composant newt" et "grille newt".
Le type de ressource "composant newt" est retourné par les fonctions, qui créent les widgets communs newt (par exemple : newt_button()).
Le type de ressource "grille newt" est un lien spécial pour les identifiants des composants, retourné par la classe d'objet de grille de newt (par exemple : newt_create_grid())
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
| Constante | Signification |
|---|---|
| NEWT_EXIT_HOTKEY | touche rapide définie par newt_form_add_hot_key() a été appuyée |
| NEWT_EXIT_COMPONENT | certains composants ont demandé la sortie de la forme |
| NEWT_EXIT_FDREADY | le pointeur de fichier spécifié dans newt_form_watch_fd() est prêt à être lu ou écrit |
| NEWT_EXIT_TIMER | le temps spécifié dans newt_form_set_timer() s'est écoulé |
| Constante | Signification |
|---|---|
| NEWT_COLORSET_ROOT | |
| NEWT_COLORSET_BORDER | |
| NEWT_COLORSET_WINDOW | |
| NEWT_COLORSET_SHADOW | |
| NEWT_COLORSET_TITLE | |
| NEWT_COLORSET_BUTTON | |
| NEWT_COLORSET_ACTBUTTON | |
| NEWT_COLORSET_CHECKBOX | |
| NEWT_COLORSET_ACTCHECKBOX | |
| NEWT_COLORSET_ENTRY | |
| NEWT_COLORSET_LABEL | |
| NEWT_COLORSET_LISTBOX | |
| NEWT_COLORSET_ACTLISTBOX | |
| NEWT_COLORSET_TEXTBOX | |
| NEWT_COLORSET_ACTTEXTBOX | |
| NEWT_COLORSET_HELPLINE | |
| NEWT_COLORSET_ROOTTEXT | |
| NEWT_COLORSET_ROOTTEXT | |
| NEWT_COLORSET_EMPTYSCALE | |
| NEWT_COLORSET_FULLSCALE | |
| NEWT_COLORSET_DISENTRY | |
| NEWT_COLORSET_COMPACTBUTTON | |
| NEWT_COLORSET_ACTSELLISTBOX | |
| NEWT_COLORSET_SELLISTBOX |
| Constante | Signification |
|---|---|
| NEWT_ARG_LAST | |
| NEWT_ARG_APPEND |
| Constante | Signification |
|---|---|
| NEWT_FLAGS_SET | |
| NEWT_FLAGS_RESET | |
| NEWT_FLAGS_TOGGLE |
| Constante | Signification |
|---|---|
| NEWT_FLAG_RETURNEXIT | Sort de la forme, lorsque le composant est activé |
| NEWT_FLAG_HIDDEN | Le composant est caché |
| NEWT_FLAG_SCROLL | Le composant est flottant |
| NEWT_FLAG_DISABLED | Le composant est désactivé |
| NEWT_FLAG_BORDER | |
| NEWT_FLAG_WRAP | Enveloppe le texte |
| NEWT_FLAG_NOF12 | Ne sort pas de la forme en appuyant sur F12 |
| NEWT_FLAG_MULTIPLE | |
| NEWT_FLAG_SELECTED | Le composant est sélectionné |
| NEWT_FLAG_CHECKBOX | Le composant est une case à cocher |
| NEWT_FLAG_PASSWORD | Le composant est une boîte de mot de passe |
| NEWT_FLAG_SHOWCURSOR | Montre le curseur |
| Constante | Signification |
|---|---|
| NEWT_FD_READ | |
| NEWT_FD_WRITE | |
| NEWT_FD_EXCEPT |
| Constante | Signification |
|---|---|
| NEWT_CHECKBOXTREE_UNSELECTABLE | |
| NEWT_CHECKBOXTREE_HIDE_BOX | |
| NEWT_CHECKBOXTREE_COLLAPSED | |
| NEWT_CHECKBOXTREE_EXPANDED | |
| NEWT_CHECKBOXTREE_UNSELECTED | |
| NEWT_CHECKBOXTREE_SELECTED |
| Constante | Signification |
|---|---|
| NEWT_ENTRY_SCROLL | |
| NEWT_ENTRY_HIDDEN | |
| NEWT_ENTRY_RETURNEXIT | |
| NEWT_ENTRY_DISABLED |
| Constante | Signification |
|---|---|
| NEWT_LISTBOX_RETURNEXIT |
| Constante | Signification |
|---|---|
| NEWT_TEXTBOX_WRAP | Enveloppe le texte dans la boîte texte |
| NEWT_TEXTBOX_SCROLL | Défile le texte dans la boîte texte |
| Constante | Signification |
|---|---|
| NEWT_FORM_NOF12 | Ne sort pas de la forme en appuyant sur F12 |
| Constante | Signification |
|---|---|
| NEWT_KEY_TAB | |
| NEWT_KEY_ENTER | |
| NEWT_KEY_SUSPEND | |
| NEWT_KEY_ESCAPE | |
| NEWT_KEY_RETURN | |
| NEWT_KEY_EXTRA_BASE | |
| NEWT_KEY_UP | |
| NEWT_KEY_DOWN | |
| NEWT_KEY_LEFT | |
| NEWT_KEY_RIGHT | |
| NEWT_KEY_BKSPC | |
| NEWT_KEY_DELETE | |
| NEWT_KEY_HOME | |
| NEWT_KEY_END | |
| NEWT_KEY_UNTAB | |
| NEWT_KEY_PGUP | |
| NEWT_KEY_PGDN | |
| NEWT_KEY_INSERT | |
| NEWT_KEY_F1 | |
| NEWT_KEY_F2 | |
| NEWT_KEY_F3 | |
| NEWT_KEY_F4 | |
| NEWT_KEY_F5 | |
| NEWT_KEY_F6 | |
| NEWT_KEY_F7 | |
| NEWT_KEY_F8 | |
| NEWT_KEY_F9 | |
| NEWT_KEY_F10 | |
| NEWT_KEY_F11 | |
| NEWT_KEY_F12 | |
| NEWT_KEY_RESIZE |
| Constante | Signification |
|---|---|
| NEWT_ANCHOR_LEFT | |
| NEWT_ANCHOR_RIGHT | |
| NEWT_ANCHOR_TOP | |
| NEWT_ANCHOR_BOTTOM |
| Constante | Signification |
|---|---|
| NEWT_GRID_FLAG_GROWX | |
| NEWT_GRID_FLAG_GROWY | |
| NEWT_GRID_EMPTY | |
| NEWT_GRID_COMPONENT | |
| NEWT_GRID_SUBGRID |
Cet exemple est une utilisation du dialogue 'setup' de RedHat écrit en PHP, exécuté en mode texte.
Exemple #1 Exemple d'Utilisation Newt
<?php
newt_init ();
newt_cls ();
newt_draw_root_text (0, 0, "Test Mode Setup Utility 1.12");
newt_push_help_line (null);
newt_draw_root_text (-30, 0, "(c) 1999-2002 RedHat, Inc");
newt_get_screen_size ($rows, $cols);
newt_open_window ($rows/2-17, $cols/2-10, 34, 17, "Choose a Tool");
$form = newt_form ();
$list = newt_listbox (3, 2, 10);
foreach (array (
"Authentication configuration",
"Firewall configuration",
"Mouse configuration",
"Network configuration",
"Printer configuration",
"System services") as $l_item)
{
newt_listbox_add_entry ($list, $l_item, $l_item);
}
$b1 = newt_button (5, 12, "Run Tool");
$b2 = newt_button (21, 12, "Quit");
newt_form_add_component ($form, $list);
newt_form_add_components ($form, array($b1, $b2));
newt_refresh ();
newt_run_form ($form);
newt_pop_window ();
newt_pop_help_line ();
newt_finished ();
newt_form_destroy ($form);
?>
(PECL newt >= 0.1)
newt_bell — Envoie un beep au terminal
Cette fonction envoie un beep au terminal.
Note: Dépendemment des configurations du terminal, le beep peut être ou ne peut être audible.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_centered_window — Ouvre une fenêtre centrée de la taille spécifiée
Ouvre une fenêtre centrée de la taille spécifiée.
Largeur de la fenêtre
Hauteur de la fenêtre
Titre de la fenêtre
Valeur non définie.
(PECL newt >= 0.1)
newt_checkbox_get_value — Récupère la valeur de la ressource de boîte à cocher
Cette fonction retourne le caractère dans la séquence qui indique la valeur courante de la boîte à cocher.
Retourne le caractère indiquant la valeur de la boîte à cocher.
(PECL newt >= 0.1)
newt_checkbox_set_flags — Configure une ressource de boîte à cocher
Cette fonction permet de définir divers drapeaux d'une ressource de boîte à cocher.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_set_value — Définit la valeur de la boîte à cocher
Cette fonction permet de définir la valeur courante de la ressource de boîte à cocher.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_add_item — Ajout un nouvel élément à l'arbre des boîtes à cocher
Cette fonction permet d'ajout un nouvel élément l'arbre des boîtes à cocher.
Aucune valeur n'est retournée.
(PECL newt >= 0.1)
newt_checkbox_tree_find_item — Cherche un élément dans l'arbre des boîtes à cocher
Cherche un élément dans l'arbre des boîtes à cocher.
Retourne la ressource de l'élément de l'arbre de boîtes à cocher, ou NULL s'il n'a pas été trouvé.
(PECL newt >= 0.1)
newt_checkbox_tree_get_current — Retourne l'élément sélectionné de l'arbre des boîtes à cocher
Cette méthode retourne l'élément sélectionné de l'arbre des boîtes à cocher.
Retourne l'élément courant (sélectionné) de l'arbre des boîtes à cocher.
(PECL newt >= 0.1)
newt_checkbox_tree_get_entry_value —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PECL newt >= 0.1)
newt_checkbox_tree_get_multi_selection —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PECL newt >= 0.1)
newt_checkbox_tree_get_selection —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.
(PECL newt >= 0.1)
newt_checkbox_tree_multi —
Cette fonction n'est pas documentée et seule la liste des arguments est disponible.