Manuel PHP

par:
Mehdi Achour
Friedhelm Betz
Antony Dovgal
Nuno Lopes
Hannes Magnusson
Georg Richter
Damien Seguy
Jakub Vrana
2009-08-14
Édité par: Philip Olson
par:
Jean-Sébastien Goupil Traducteur
David Manusset Relecteur
Mickaël Perraud Relecteur
Guillaume Plessis Traducteur
Yannick Torrès Traducteur
par:
Mehdi Achour
Vincent Briet
Damien Seguy

Copyright

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.



Manuel PHP


Préface

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.

Auteurs et Contributeurs

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.

Auteurs et Éditeurs

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.

Mainteneurs des notes utilisateurs

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.




Au moment de commencer



Qu'est ce que PHP?

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.



Que peut faire PHP ?

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.

  • Langage de script coté serveur. C'est l'utilisation la plus traditionnelle, et aussi le principal objet de PHP. Vous aurez besoin de trois composants pour l'exploiter : un analyseur PHP (CGI ou module serveur), un serveur web et un navigateur web. Vous devez exécuter le serveur web en corrélation avec PHP. Vous pouvez accéder au programme PHP avec l'aide du navigateur web. Tout ceci peut fonctionner sur votre propre machine si vous êtes juste expérimenté dans la programmation en PHP. Voyez la section d'installation pour plus d'informations.
  • Langage de programmation en ligne de commande. Vous pouvez écrire des scripts PHP et l'exécuter en ligne de commande, sans l'aide du serveur web et d'un navigateur. Il vous suffit de disposer de l'exécutable PHP. Cette utilisation est idéale pour les scripts qui sont exécutés régulièrement (avec un cron sous Unix ou Linux), ou un Task Scheduler (sous Windows). Ces scripts peuvent aussi être utilisés pour réaliser des opérations sur des fichiers texte. Voyez la section sur l'utilisation de PHP en ligne de commande pour plus d'informations.
  • Ecrire des applications clientes graphiques. PHP n'est probablement pas le meilleur langage pour écrire des applications clientes graphiques, mais si vous connaissez bien PHP et que vous souhaitez exploiter des fonctionnalités avancées dans vos applications clientes, vous pouvez utiliser PHP-GTK pour écrire de tels programmes. Vous avez aussi la possibilité d'écrire des applications très portables avec ce langage. PHP-GTK est une extension de PHP, qui n'est pas fournie dans la distribution de base. Si vous êtes intéressé par PHP-GTK, visitez » son site web.

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 :

  • 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

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.

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.




Une introduction à PHP

Sommaire

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.


Le nécessaire

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.



Votre première page PHP

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(); ?>



Trucs pratiques

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 :


Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

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.



Utiliser un formulaire

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.



Utiliser des codes anciens avec les nouvelles versions de PHP

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 :

  • Les anciennes variables $HTTP_*_VARS (qui devaient être indiquées comme globales pour être utilisées dans une fonction ou une méthode) sont obsolètes. Les nouveaux tableaux superglobaux ont été introduits en » PHP 4.1.0. Ce sont les variables suivantes : $_GET, $_POST, $_FILES, $_COOKIE, $_SERVER, $_ENV, $_REQUEST et $_SESSION. Les vieux tableaux $HTTP_*_VARS, tels que $HTTP_POST_VARS existent également. Depuis PHP 5.0.0, les tableaux prédéfinis PHP peuvent être désactivés avec l'option de configuration register_long_arrays.
  • Les variables externes ne sont plus enregistrées dans l'environnement par défaut. En d'autres termes, depuis PHP » 4.2.0, la directive PHP register_globals vaut off par défaut dans le php.ini. La méthode recommandée pour accéder à ces valeurs est via les tableaux superglobaux mentionnés ci-dessus. Les anciens scripts, livres et tutoriel continuent de considérer que cette directive devrait être à on. Lorsque cette directive est à on, vous pouvez utiliser la variable $id, si l'URL http://www.example.com/foo.php?id=42 a été appelée. Quelle que soit la valeur de la directive, $_GET['id'] est toujours disponible.

Pour plus de détails sur ces modifications, reportez-vous à la section sur les variables pré-définies.



Et après ?

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/.





Installation et configuration


Considérations générales sur l'installation

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 ? :

  • Sites Web et applications Web (script côté serveur)
  • Scripts en ligne de commande
  • Applications à interface graphique (GUI)

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.



Installation sur les systèmes UNIX

Sommaire

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 :

  • Connaissance de base d'UNIX (savoir faire un "make" et compiler en C, si besoin).
  • Un compilateur ANSI C (pour les codes sources)
  • flex : Version 2.5.4 (pour compiler)
  • bison : Version 1.28 (préféré), 1.35, or 1.75 (pour compiler)
  • Un serveur Web
  • Tous les composants nécessaires aux extensions (bibliothèque GD, PDF, etc.)

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.


Apache 1.3.x sur les systèmes Unix

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.



Apache 2.0 sur les systèmes Unix

Cette section contient les notes et conseils d'installation de PHP avec le serveur Apache 2.0 sur les systèmes Unix.

Avertissement

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 :

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.



Lighttpd 1.4 sur les systèmes Unix

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).

Appel de PHP par Lighttpd

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).

Appel avec spawn-fcgi

Lighttpd fournit un programme appelé spawn-fcgi afin de rendre plus facile les appels des processus fastcgi.

Appel de php-cgi

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"

Connexion à des instances FCGI distantes

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 ))
)


Caudium

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.



Installation avec les serveurs fhttpd

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.



Installation sous Netscape et iPlanet Enterprise Serveur sur un système Sun Solaris

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.

  1. Installez les packages suivants depuis le serveur » http://www.sunfreeware.com/ ou un miroir ad hoc :

    • autoconf-2.13
    • automake-1.4
    • bison-1_25-sol26-sparc-local
    • flex-2_5_4a-sol26-sparc-local
    • gcc-2_95_2-sol26-sparc-local
    • gzip-1.2.4-sol26-sparc-local
    • m4-1_4-sol26-sparc-local
    • make-3_76_1-sol26-sparc-local
    • mysql-3.23.24-beta (si vous voulez le support MySQL)
    • perl-5_005_03-sol26-sparc-local
    • tar-1.13 (GNU tar)

  2. Assurez-vous que le path inclut bien les dossiers nécessaires : PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin et rendez-le accessible à votre système avec export PATH .
  3. gunzip php-x.x.x.tar.gz (si vous avez une distribution .gz, ou bien allez en 4).
  4. tar xvf php-x.x.x.tar
  5. Passez dans votre dossier d'extraction PHP : cd ../php-x.x.x
  6. 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

  7. Faites un make puis un make install.

Après avoir fait l'installation de base et lu les fichiers readme.txt, vous pouvez avoir besoin de faire des configurations supplémentaires.

Instructions de configuration pour Sun/iPlanet/Netscape

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/.

  1. Ajoutez les lignes suivantes dans mime.types en tant qu'administrateur :

    type=magnus-internal/x-httpd-php exts=php
    

  2. É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.

  3. 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"

  4. 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.

  5. 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>
    

  6. 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".

Environnement CGI et modifications recommandées du php.ini

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

Utilisation particulière pour les pages d'erreurs ou les listages spécifiques de dossier (PHP >= 4.3.3)

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...]

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'].

Note au sujet de nsapi_virtual() et des requêtes (PHP >= 4.3.3)

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 !



CGI et configuration en ligne de commande

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.

Avertissement

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.

Tests

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.

Utiliser les variables prédéfinies

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.



Installation sous HP-UX

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



Installation sur les systèmes OpenBSD

Cette section contient les notes spécifiques à l'installation de PHP sous » OpenBSD 3.6.

Utilisation des paquets binaires

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.

Utilisation des ports

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.

Problèmes courants

  • L'installation par défaut d'Apache fonctionne dans un » contexte chroot(2), qui va limiter l'accès des scripts PHP au dossier /var/www. Vous devez donc créer un dossier /var/www/tmp pour que les sessions PHP soient stockées, ou bien utiliser une autre solution de sauvegarde. De plus, les sockets de bases de données doivent être placés dans ce dossier, ou bien utiliser l'interface localhost. Si vous utilisez des fonctions de réseau avec des fichiers comme /etc, par exemple /etc/resolv.conf, et /etc/services, vous devrez les rendre accessibles aussi dans /var/www/etc. Le paquet OpenBSD PEAR installe automatiquement les bons dossiers, ce qui fait que rien n'est nécessaire. Plus d'informations sur OpenBSD Apache sont disponibles sur » OpenBSD FAQ.
  • Le paquet OpenBSD 3.6 pour l'extension » gd requiert XFree86. Si vous n'avez pas besoin des fonctionnalités de polices qui demandent X11, installez le paquet php4-gd-4.3.8-no_x11.tgz.

Versions plus anciennes

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).



Installation sous Solaris

Cette section contient les notes et conseils d'installation de PHP sur les distributions Solaris.

Logiciels nécessaires

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 :

  • gcc (recommandé, mais d'autres compilateurs C peuvent fonctionner)
  • make
  • flex
  • bison
  • m4
  • autoconf
  • automake
  • perl
  • gzip
  • tar
  • GNU sed

De plus, vous devrez aussi installer (et peut être aussi compiler) toutes les bibliothèques nécessaires aux extensions comme MySQL, Oracle, etc.

Utilisation des paquets

Vous pouvez simplifier l'installation Solaris en utilisant pkgadd pour installer la plupart des composants.



Notes d'installation sous Debian GNU/Linux

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.

Utilisation de APT

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

Un meilleur contrôle de la configuration

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.

Problèmes courants

  • Si les scripts PHP ne sont pas interprétés par le serveur web, il est probable que PHP n'ait pas été ajouté aux fichier de configuration du serveur web, c'est-à-dire, sous Debian, /etc/apache2/apache2.conf ou équivalent. Consultez le manuel Debian pour davantage de détails.
  • Si une extension a apparemment été installée mais que ses fonctions ne sont pas définies, assurez vous que les lignes adéquates ont été insérées dans les fichiers .ini et/ou que le serveur web a été redémarré après l'installation.
  • Il y a deux commandes de base pour installer des paquets sous Debian (et d'autres variantes de Linux) : apt-get et aptitude. Expliquer les différences subtiles entre les deux sort du cadre de ce manuel.



Installation sur un système Mac OS X

Sommaire

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.


Utilisation des paquets

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 :



Utilisation de PHP embarqué

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 :

  1. Trouvez et ouvrez le fichier de configuration d'Apache. Par défaut, ce sera : /etc/httpd/httpd.conf Utilisez le programme Finder ou Spotlight pour trouver ce fichier peut s'avérer difficile, sachant que, par défaut, il appartient à l'utilisateur root.

    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.

  2. 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
    
    Notez le chemin. Dans le futur, lorsque vous compilerez PHP, les fichiers ci-dessus doivent être remplacés ou commentés.

  3. 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.

  4. Assurez-vous que DirectoryIndex charge le fichier index par défaut. Ceci est également définit dans le fichier httpd.conf. Normalement, les fichiers index.php et index.html sont utilisés. Par défaut, index.php est activé car il est également dans la vérification de PHP ci-dessus. Ajustez-le suivant votre besoin.
  5. Définissez le chemin vers le fichier php.ini ou utilisez le chemin par défaut. Le chemin par défaut sur Mac OS X is /usr/local/php/php.ini et un appel à la fonction phpinfo() révèlera cette information. Si aucun fichier php.ini n'est utilisé, PHP utilisera toutes les valeurs par défaut. Reportez-vous à la FAQ sur "trouver le fichier php.ini".
  6. Trouvez et définissez le DocumentRoot C'est le dossier principal pour tous les fichiers Web. Les fichiers dans ce dossier seront servis par le serveur Web, et donc, les fichiers PHP seront analysés par PHP avant de les envoyer au navigateur. Le chemin par défaut est /Library/WebServer/Documents mais peut être défini à n'importe quelle valeur dans le fichier httpd.conf. De plus, le dossier DocumentRoot pour les différentes utilisateurs est /Users/yourusername/Sites
  7. Créez un fichier phpinfo().

    La fonction phpinfo() affiche les informations sur PHP. Créez un fichier dans le DocumentRoot avec le code PHP suivant :

    <?php phpinfo(); ?>

  8. Redémarrez Apache et chargez le fichier PHP que nous venons de créer. Pour redémarrez, exécutez la commande sudo apachectl graceful dans un terminal ou arrêter/démarrer l'option "Personal Web Server" dans les préférences systèmes OS X. Par défaut, le chargement de fichiers locaux dans le navigateur s'effectue via des URL comme ceci : http://localhost/info.php ou, si vous utilisez le DocumentRoot d'un dossier utilisateur, l'URL ressemblera à : http://localhost/~yourusername/info.php

CLI (ou CGI dans les anciennes versions) est nommé php et réside normalement dans /usr/bin/php. Ouvrez un terminal, lisez la section sur la ligne de commande du manuel PHP, et exécutez la commande php -v pour vérifier la version PHP de ce binaire. Un appel à la fonction phpinfo() pourra également vous révéler cette information.



Compilation pour les serveurs OS X

Compilation pour les serveurs OS X

  1. Téléchargez les dernières distributions d'Apache et PHP.
  2. 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

  3. Si vous voulez que le compilateur fasse certaines optimisations, ajoutez cette ligne :

    setenv OPTIM=-O2

  4. 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.

  5. Tapez make puis make install. Cela va ajouter un dossier à votre distribution Apache, sous src/modules/php4.
  6. 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.

  7. Copiez et renommez le fichier php.ini-dist dans votre dossier bin de votre dossier PHP : 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 .



Installation pour Apache sur les clients MacOS X

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.

Avertissement

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 :

  1. Pour Apache 1.3, téléchargez : http://www2.entropy.ch/download/entropy-php-5.2.4-1.tar.gz
  2. Pour Apache 2, téléchargez : wget http://www2.entropy.ch/download/entropy-php-5.2.4-1-apache2.tar.gz
  3. Décompressez le fichier .tar.gz, mais N'UTILISEZ PAS StuffIt Expander. À la place, utilisez BOMArchiveHelper d'Apple ou la ligne de commande.
  4. Double-cliquez sur l'installeur du paquet et suivez les instructions.

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.




Installation sur les système Windows

Sommaire

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.

Avertissement

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 (PHP version 5.1.0 et inférieures)

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.

Avertissement

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.



Installeur Windows (PHP 5.2 et suivant)

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.

Installation normale

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).

Avertissement

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.

Installation silencieuse

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 utiliser la même syntaxe pour spécifier le dossier de configuration d'Apache (APACHEDIR), le dossier du serveur Sambar (SAMBARDIR), et le dossier du serveur Xitami (XITAMIDIR).

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

Mise à jour de PHP avec l'installeur

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.



Installation manuelle sous Windows

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".

Avertissement

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

  • Choisissez les extensions que vous voulez charger au démarrage de PHP. Lisez la section sur les extensions Windows, sur la manière de les configurer et celles qui sont déjà intégrées à PHP. Notez que sur les nouvelles installations, il est préférable de faire fonctionner PHP et de le tester avec aucune extension avant d'en activer dans votre fichier php.ini.
  • Sous PWS et IIS, vous pouvez définir le paramètre de configuration browscap pour pointer vers c:\windows\system\inetsrv\browscap.ini sous Windows 9x/Me, c:\winnt\system32\inetsrv\browscap.ini sous NT/2000 et c:\windows\system32\inetsrv\browscap.ini sous XP. Pour un fichier browscap.ini à jour, lisez cette entrée de la FAQ.

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.



ActiveScript

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.



Installation avec les serveurs IIS/PWS

Cette section contient des notes sur l'installation de PHP avec IIS ( Microsoft Internet Information Server).

Avertissement

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.

Considérations générales pour toutes les installations de PHP avec IIS ou PWS

  • Tout d'abord, lisez les instructions d'installation du manuel. Ne négligez pas cette étape, elle fournit des informations essentielles sur l'installation de PHP sur Windows.
  • Les utilisateurs de CGI doivent définir la directive PHP cgi.force_redirect à 0 dans le php.ini. Lisez la faq sur cgi.force_redirect qui vous apprendra des détails importants. De même, les utilisateurs de CGI peuvent vouloir définir la directive cgi.redirect_status_env. Lorsque vous utilisez les directives, assurez-vous qu'elles ne soient pas commentées dans le php.ini.
  • Le CGI de PHP 4 est nommé php.exe tandis qu'en PHP 5, il est nommé php-cgi.exe. En PHP 5, php.exe est le CLI et non le CGI.
  • Modifiez la variable d'environnement PATH de Windows afin d'inclure le dossier de PHP. De cette façon, les fichiers DLLs de PHP, et les exécutables de PHP peuvent tous résider dans le dossier de PHP sans être dans le dossier système de Windows. Pour plus de détails, lisez la FAQ sur la façon de définir le PATH.
  • L'utilisateur IIS (habituellement IUSR_MACHINENAME) a besoin de permission pour lire les différents fichiers et dossiers, comme le php.ini, docroot ainsi que le dossier temporaire hébergeant les sessions.
  • Assurez-vous que les directives PHP extension_dir et doc_root soient correctement définies dans le php.ini. Ces directives dépendent du système sur lequel PHP est installé. En PHP 4, extension_dir vaut extensions tandis qu'en PHP 5, il vaut ext. Donc, un exemple de valeur pour extensions_dir en PHP 5 est "c:\php\ext" et un exemple de valeur pour doc_root pour IIS est "c:\Inetpub\wwwroot".
  • Les fichiers d'extensions DLL de PHP, comme php_mysql.dll et php_curl.dll, peuvent être trouvés dans le paquet compressé de PHP (et non dans l'installeur de PHP). En PHP 5, beaucoup d'extensions font parties de PECL et peuvent être téléchargées dans le paquet "Collection de modules PECL". Les fichiers comme php_zip.dll et php_ssh2.dll. » Téléchargez les fichiers PHP ici.
  • Lors de la définition de l'exécutable, la case "Vérifier que ce fichier existe" doit également être cochée. Pour un faible coût au niveau performance, IIS (ou PWS) vérifiera que le fichier de script existe et proposera l'identification avant d'appeler PHP. Cela signifie que le serveur web fournira des messages d'erreur sensiblement identiques à des erreurs 404 au lieu des erreurs CGI stipulant que PHP n'a pu afficher aucune donnée.
  • L'exécutable PHP est distribué en tant qu'application 32bit. Si vous utilisez une version 64bit de Windows, vous devez, soit recompiler l'exécutable vous-même, soit vous assurez qu'IIS est configuré pour exécuter des extensions 32bit. Vous pouvez activer ce comportement en utilisant le script d'administration d'IIS comme ceci : Cscript.exe adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

Windows NT/200x/XP et IIS 4 ou plus récent

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 :

  • Sous "Home Directory", "Virtual Directory", ou "Directory", faites ce qui suit :
  • Modifier les permissions d'exécution en "Scripts only"
  • Cliquez sur le boutton "Configuration", et choisissez l'onglet "Application Mappings". Cliquez sur "Add" et définissez le chemin vers l'exécutable vers le fichier CGI approprié. Un exemple de valeur pour PHP 5 : C:\php\php-cgi.exe. Ajoutez .php en tant qu'extension. Laissez "Method exclusions" vide, et cochez la case "Script engine". Maintenant, cliquez sur Ok plusieurs fois.
  • Définissez la sécurité appropriée. (Ceci est fait dans 'Internet Service Manager'), et, si votre serveur NT utilise le système de fichiers NTFS, ajoutez le droit à l'exécution pour I_USR_ pour le dossier qui contient php.exe / php-cgi.exe.

Pour utiliser le module SAPI, faites ce qui suit :

  • Si vous ne souhaitez pas faire d'identification HTTP en utilisant PHP, vous pouvez (et vous devez) ignorer cette étape. Dans les filtres ISAPI, ajoutez un nouveau filtre ISAPI. Utilisez PHP en tant que nom de filtre, et ajoutez un chemin vers les fichiers php4isapi.dll / php5isapi.dll.
  • Sous "Home Directory", "Virtual Directory", ou "Directory", faites ce qui suit :
  • Modifiez les permissions d'exécution en "Scripts only"
  • Cliquez sur le bouton "Configuration" et ajoutez une nouvelle entrée dans "Application Mappings". Cliquez sur "Add" et définissez le chemin d'exécution vers la bibliothèque DLL ISAPI appropriée. Un exemple de valeur pour PHP 5 est : C:\php\php5isapi.dll. Ajoutez .php en tant qu'extension. Laissez "Method exclusions" vide, et cochez la case "Script engine". Maintenant, cliquez que Ok plusieurs fois.
  • Arrêtez totalement IIS (NET STOP iisadmin)
  • Démarrez IIS (NET START w3svc)

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.

Windows et PWS 4

PWS 4 ne supporte pas ISAPI, uniquement PHP CGI doit être utilisé.

  • Éditez le fichier pws-php4cgi.reg / pws-php5cgi.reg (regardez dans le dossier SAPI pour PHP4 ou dans le dossier principal pour PHP 5) pour indiquer la localisation de votre fichier php.exe / php-cgi.exe. Les slash doivent être échappés. Par exemple : [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="C:\\php\\php.exe" (modifiez en C:\\php\\php-cgi.exe si vous utilisez PHP 5). Maintenant, intégrez ce fichier de registre dans votre système ; vous devriez juste avoir à double-cliquer dessus.
  • Dans le gestionnaire PWS Manager, faites un clic droit sur les dossiers qui supporteront PHP, et sélectionnez "Properties". Cochez l'option "Execute" et confirmez.

Windows et PWS/IIS 3

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.

Avertissement

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.

  • Lancez Regedit.
  • Naviguez jusqu'à : HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /W3Svc /Parameters /ScriptMap.
  • Dans le menu "edit", sélectionnez : New->String Value.
  • Entrez l'extension que vous voulez utiliser pour les scripts PHP. Par exemple : .php
  • Double-cliquez sur la chaîne, et entrez le chemin jusqu'à php.exe dans le champ "value data". Exemple : C:\php\php.exe "%s" %s pour PHP 4 ou C:\php\php-cgi.exe "%s" %s pour PHP 5.
  • Répétez ces étapes pour chaque extension que vous désirez associer à vos scripts PHP.

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.

  • Naviguez jusqu'à : HKEY_CLASSES_ROOT
  • Dans le menu edit, sélectionnez : New->Key.
  • Donnez le nom de votre extension à la clé. Par exemple : .php
  • Sélectionnez le nom de la nouvelle clé dans le panneau de droite, et double-cliquez dans "default value", puis entrez phpfile.
  • Répétez ces instructions pour toutes les extensions que vous avez associé aux scripts PHP.
  • Créez une autre New->Key sous HKEY_CLASSES_ROOT et nommez-la phpfile.
  • Sélectionnez la nouvelle clé phpfile et, dans le panneau de droite, double-cliquez dans "default value" et entrez PHP Script.
  • Faites un clic droit dans phpfile et sélectionnez New->Key, appelez-la Shell.
  • Faites un clic droit dans Shell et sélectionnez New->Key, appelez-la open.
  • Faites un clic droit dans open et sélectionnez New->Key, appelez-la command.
  • Sélectionnez la nouvelle clé command et dans le panneau de droite, faites un double-clic dans "default value", puis entrez le chemin jusqu'à php.exe. Par exemple : c:\php\php.exe -q %1 (n'oubliez pas le %1).
  • Quittez Regedit.
  • Si vous utilisez PWS sous Windows, redémarrez pour prendre en compte le nouveau registre.

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.



Installer PHP sous Microsoft Windows avec Apache 1.3.x

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.

Installation de PHP en tant que module Apache

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

Installation comme binaire CGI

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.

Avertissement

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'); ?>.



Installation des serveurs Apache 2.0.x sur les systèmes Microsoft Windows

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/

Avertissement

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 :

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.

Avertissement

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.

Installation de PHP en mode CGI

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"

Avertissement

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.

Installation de PHP en tant que module Apache

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.

Avertissement

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.



Serveurs Sun, iPlanet et Netscape servers sur Microsoft Windows

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.

Configuration en CGI sur les serveurs Sun, iPlanet et Netscape

Pour installer PHP en CGI, suivez ce qui suit :

  • Copiez le fichier php4ts.dll dans votre dossier principal (le dossier où vous avez installé Windows)
  • Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :

    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • Dans le serveur Netscape Enterprise Administration Server, créez un dossier shellcgi et supprimez-le aussitôt (cette opération crée 5 lignes importantes dans le fichier obj.conf et permet au serveur de gérer les scripts CGI).
  • Dans le serveur Netscape Enterprise Administration Server, créez un nouveau type MIME : Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php.
  • Recommencez pour chaque instance de serveur web qui devra exécuter PHP.

Plus de détails sur la configuration de PHP comme CGI sont disponibles à » http://benoit.noss.free.fr/php/install-php.html

Configuration NSAPI sur les serveurs Sun, iPlanet et Netscape

Pour installer PHP avec l'interface NSAPI, faites ceci :

  • Copiez le fichier php4ts.dll dans votre dossier systemroot (le dossier où vous avez installé windows)
  • Faites un fichier d'association depuis la ligne de commande. Tapez les lignes suivantes :

    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • Dans le serveur Netscape Enterprise Administration Server, créez un nouveau type MIME : Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php.
  • É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.

  • Redémarrez votre serveur web pour que les modifications prennent effet.
  • Faites cela pour chaque instance du serveur web où vous voulez exécuter PHP.

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".

Environnement CGI et modifications recommandées du php.ini

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

Utilisation particulière pour les pages d'erreurs ou les listages spécifiques de dossiers (PHP >= 4.3.3)

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...]

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'].

Note au sujet de nsapi_virtual() et des requêtes (PHP >= 4.3.3)

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"

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.



Installation pour les serveurs OmniHTTPd

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 !

Avertissement

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.

  1. Installation du serveur OmniHTTPd.

  2. Faites un clic droit sur l'icône bleue d'OmniHTTPd sur le système, et sélectionnez Properties

  3. Cliquez sur Web Server Global Settings

  4. 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).

  5. Dans l'onglet Mime, entrez : virtual = wwwserver/stdcgi | actual = .php, et utilisez le bouton "Add" (ajout).

  6. 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.



Sambar Server on Microsoft Windows

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.



Installation Xitami sur Microsoft 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.

Avertissement

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.



Compilation des sources

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 :



Installation des extensions sous Windows

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.

Extensions PHP
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




Installation d'extensions PECL

Sommaire


Introduction aux installations PECL

» 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.



Télécharger des extensions PECL

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.

  • » http://pecl.php.net/ Le site Web de PECL contient diverses informations sur les différentes extensions offertes par l'équipe de développement de PHP. Vous pourrez consulter les modifications entre les versions, les notes de versions, ce qui est requis pour faire fonctionner l'extension ainsi que d'autres détails similaires.
  • pecl download extname Les extensions PECL listées sur le site web de PECL sont disponibles et peuvent être téléchargées et installées en utilisant la » commande pecl. La version spécifique de l'extension peut également être spécifiée.
  • CVS La plupart des fichiers PECL sont conservés dans le serveur CVS. Une interface Web est disponible à » http://cvs.php.net/pecl/. Pour télécharger directement depuis CVS, suivez la séquence d'instructions ci-dessous. Notez que phpfi est le mot de passe de l'utilisateur cvsread :


    $ cvs -d:pserver:cvsread@cvs.php.net:/repository login
    $ cvs -d:pserver:cvsread@cvs.php.net:/repository co pecl/extname

  • Téléchargements pour Windows Pour le moment, le projet PHP ne compile pas les binaires Windows pour les extensions PECL. Cepdendant, pour compiler PHP sous Windows, reportez-vous au chapitre intitulé Compiler PHP sous Windows.


Installer une extension PHP sous Windows

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.

Où trouver une extension ?

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.

Quelles extensions télécharger ?

Souvent, vous trouverez plusieurs versions de chaque DLL :

  • Différents numéros de versions (au moins, les deux premiers chiffres doivent être les mêmes)
  • Différentes configurations de sécurité de threads
  • Différentes architectures de processeurs (x86, x64...)
  • Différentes configurations de débogage
  • etc.

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

Charger une extension

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.

Résolution de problèmes

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.



Compilation d'extensions PECL partagées avec la commande pecl

PECL facilite la création d'extension PHP partagées. En utilisant la » commande pecl, faites ceci :


$ pecl install extname

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 :


$ pecl install extname-beta

Vous pouvez également installer une version spécifique en utilisant la commande :


$ pecl install extname-0.1

Note: Après avoir activée cette extension dans le php.ini, relancez le serveur Web afin de la prendre en compte.



Compilation des extensions partagées avec phpize

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.



Compilation des extensions PECL statiquement dans PHP

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 :


/your/phpsrcdir/ext/extname

À partir de la, forcez PHP à reconstruire le script de configuration, puis, suivez le processus classique de compilation de PHP :


$ cd /your/phpsrcdir
$ rm configure
$ ./buildconf --force
$ ./configure --help
$ ./configure --with-extname --enable-someotherext --with-foobar
$ make
$ make install

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 :


$ ./configure --help | grep extname




Des problèmes ?

Sommaire


Lisez la FAQ

Certains problèmes sont récurrents : les plus communs sont listés dans la FAQ PHP, disponible dans ce manuel.



Autres problèmes

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.



Rapports de Bogue

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 !




Configuration

Sommaire


Le fichier de configuration

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".



Où une directive de configuration peut être modifiée

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().

Définition des modes PHP_INI_*
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ù



Comment modifier la configuration

Exécuter PHP comme module Apache

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_value pour 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>

Attention

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

Modifier la configuration de PHP dans la base de registre Windows

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.

Autres interfaces de configuration de PHP

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().





Référence du langage


La syntaxe de base

Sommaire


Passer du HTML au PHP

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.



Séparation des instructions

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.



Commentaires

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 */
 
*/
?>




Les types

Sommaire


Introduction

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.



Booléen

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.

Syntaxe

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";
}
?>

Conversion en booléen

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).

Avertissement

-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)
?>


Les entiers

Un entier est un nombre appartenant à la classe Z = {..., -2, -1, 0, 1, 2, ...}.

Voir aussi :

Syntaxe

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.

Avertissement

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
?>

Débordement d'entier

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_dump0xffffffff );
// Affiche : float(4294967295)

// N'est pas vrai pour les héxadécimaux supérieures à 2^32-1:
var_dump0x100000000 );
// Affiche : int(2147483647)

$million 1000000;
$large_number =  50000 $million;
var_dump($large_number);
// Affiche : float(50000000000)
?>
Avertissement

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) 
?>

Conversion en entier

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.

Depuis un booléen

FALSE correspond à 0 (zéro), et TRUE correspond à 1 (un).

Depuis un nombre à virgule flottante

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 !

Avertissement

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.

Depuis des chaînes de caractères

Voir la section sur la conversion des chaînes en nombres

Depuis d'autres types

Attention

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.



Nombres décimaux

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).

Avertissement

Précision des nombres décimaux

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.

Conversion en un nombre décimal

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.



Les chaînes de caractères

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.

Syntaxe

Une chaîne de caractères littérale peut être spécifiée de 4 façons différentes :

Entourée de simple guillemet

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';
?>

Entourée de guillemet double

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 :

Caractères échappés
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.

Syntaxe Heredoc

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").

Avertissement

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

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': \x41

Note: 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.

Analyse des variables

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.

Syntaxe simple

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.

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.

Accès et modification d'une chaîne, par caractère

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.

Avertissement

É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.

Fonctions et opérateurs utiles

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".

Conversion en chaîne 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.

Conversion de chaînes en nombres

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 
"10.5";                // $foo est un nombre à virgule flottante (11.5)
$foo "-1.3e3";              // $foo est un nombre à virgule flottante (-1299)
$foo "bob-1.3e3";           // $foo est un entier (1)
$foo "bob3";                // $foo est un entier (1)
$foo "10 Small Pigs";       // $foo est un entier (11)
$foo "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.



Les tableaux

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.

Syntaxe

Syntaxe d'un tableau

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(=> 513 => 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(=> 433256"b" => 12);

// ...ce tableau
array(=> 43=> 32=> 56"b" => 12);
?>
Avertissement

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.

Création/modification avec des crochets

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(=> 112 => 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(12345);
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
)

Fonctions utiles

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(=> 'one'=> 'two'=> '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.

Ce qu'il est possible de faire ou non avec un tableau

Pourquoi $foo[bar] est incorrect ?

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(12);
$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.

Alors, pourquoi est-ce une mauvaise pratique ?

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.

Conversion en un tableau

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 {
    private 
$A// Ceci devient '\0A\0A'
}

class 
extends {
    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.

Comparaison

Il est possible de comparer plusieurs tableaux avec la fonction array_diff() ainsi qu'avec les opérateurs de tableaux.

Exemples

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(=> '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",
                                       
=> "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(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 est modifié,
             // $arr1 vaut toujours array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4// maintenant, $arr1 et $arr3 sont identiques
?>


Les objets

Initialisation des objets

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.

Conversion en un objet

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'
?>


Les ressources

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().

Conversion en ressource

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.

Libération des ressources

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.



NULL

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().

Syntaxe

Il y a une seule valeur de type null, et c'est le mot clé insensible à la casse NULL.

<?php
$var 
NULL;
?>

Voir aussi les fonctions is_null() et unset().

Transtyper vers NULL

Transtyper une variable vers null supprimera la variable et effacera sa valeur.



Variables et pseudo-types utilisés dans cette documentation

mixed

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

number indique qu'un paramètre peut être soit un nombre entier, soit un nombre décimal (nombre décimal).

callback

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 {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
extends {
    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(15);

// 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

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.



Manipulation des types

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 "10 Little Piggies"// $foo est un entier (15)
$foo "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.

Modification de types

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 :

  • (int), (integer) : modification en integer
  • (bool), (boolean) : modification en boolean
  • (float), (double), (real) : modification en float
  • (string) : modification en string
  • (binary) : modification en string binaire (PHP 6)
  • (array) : modification en array
  • (object) : modification en object
  • (unset) : modification en NULL (PHP 5)

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 :




Les variables

Sommaire


Essentiel

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.

Astuce

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.



Variables pré-définies

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.

Avertissement

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.



Portée des variables

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.

Le mot clé global

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'];
}
?>

Utilisation des variables static

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;
}
?>


Les références avec les variables global et static

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 :


NULL
object(stdClass)(0) {
}

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 :


Objet statique : NULL
Objet statique : NULL

Objet statique : NULL
Objet statique : object(stdClass)(1) {
["property"]=>
int(1)
}

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.



Les variables dynamiques

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.

Avertissement

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.



Variables externes à PHP

Formulaires HTML (GET et POST)

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($_POSTtrue));
    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>

Nom de variables IMAGE de type SUBMIT

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.

Cookies HTTP

PHP supporte les cookies HTTP de manière totalement transparente, comme défini dans les » spécifications de Netscape. Les cookies sont un mécanisme permettant de stocker des données sur la machine cliente à des fins d'identification de l'utilisateur. Vous pouvez établir un cookie grâce à la fonction setcookie(). Les cookies font partie intégrante des en-têtes HTTP et donc la fonction setcookie() doit être appelée avant que le moindre affichage ne soit envoyé au navigateur. C'est la même restriction que pour la fonction header(). Les données contenus dans les cookies sont alors disponibles dans les tableaux de cookies appropriés, comme $_COOKIE, $HTTP_COOKIE_VARS mais aussi $_REQUEST. Lisez la page de la documentation sur la fonction setcookie() pour plus de détails ainsi que des exemples.

Si vous souhaitez assigner plusieurs valeurs à un seul cookie, il devait l'assigner sous forme de tableau. Par exemple :

<?php
setcookie
("MyCookie[foo]"'Test 1'time()+3600);
setcookie("MyCookie[bar]"'Test 2'time()+3600);
?>

Cela va créer deux cookies distincts bien que MyCookie est maintenant un simple tableau dans votre script. Si vous voulez définir seulement un cookie avec plusieurs valeurs, utilisez la fonction serialize() ou explode() sur la première valeur.

Il est à noter qu'un cookie remplace le cookie précédent par un cookie de même nom tant que le chemin ou le domaine sont identiques. Donc, pour une application de panier, vous devez implémenter un compteur et l'incrémenter au fur et à mesure. C'est-à-dire :

Exemple #4 Exemple avec setcookie()

<?php
if (isset($_COOKIE['compte'])) {
    
$compte $_COOKIE['compte'] + 1;
} else {
    
$compte 1;
}
setcookie('Panier'$comptetime()+3600);
setcookie("Panier[$compte]"$itemtime()+3600);
?>

Cas des points dans les noms de variables

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.

Détermination du type des variables

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.




Les constantes

Sommaire

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]*

Astuce

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.


Syntaxe

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 :

  • Les constantes ne commencent pas par le signe ($).
  • Les constantes ne peuvent être définies qu'en utilisant la fonction define(), pas par simple assignement.
  • Les constantes sont définies et accessibles à tout endroit du code, globalement.
  • Les constantes ne peuvent pas être redéfinies ou indéfinies une fois qu'elles ont été définies.
  • Les constantes ne peuvent contenir que des scalaires.

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.



Constantes magiques

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.

Quelques constantes PHP magiques
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

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.



Les opérateurs

Sommaire

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 précédence des opérateurs

La priorité des opérateurs spécifie l'ordre dans lequel les valeurs doivent être analysées. Par exemple, dans l'expression 1 + 5 * 3, le résultat est 16 et non 18, car la multiplication ("*") a une priorité supérieure par rapport à l'addition ("+"). Des parenthèses peuvent être utilisées pour forcer la priorité, si nécessaire. Par exemple : (1 + 5) * 3 donnera 18. 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.

Précédence des opérateurs
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 
5// (3 * 3) % 5 = 4
$a true true 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.



Les opérateurs arithmétiques

Vous rappelez-vous des opérations élémentaires apprises à l'école ? Les opérateurs arithmétiques fonctionnent comme elles.

Opérations élémentaires
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.



Les opérateurs d'assignation

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.



Opérateurs sur les bits

Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier.

Les opérateurs sur les bits
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(01248);
$test 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 "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 à gauchey 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

Avertissement

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()



Opérateurs de comparaison

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.

Opérateurs de comparaison
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
(== "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).

Comparaison avec plusieurs types
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.

L'opérateur ternaire

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.
?>




Opérateur de contrôle d'erreur

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.

Avertissement

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.



Opérateur d'exécution

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.



Opérateurs d'incrémentation et décrémentation

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.

Opérateurs d'incrémentation et décrémentation
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.



Les opérateurs logiques

Les opérateurs logiques
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)


Opérateurs de chaînes

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.



Opérateurs de tableaux

Opérateurs de tableaux
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(=> "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.



Opérateurs de types

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().




Les structures de contrôle

Sommaire


Introduction

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.



if

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.



else

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/else if

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;

?>



Syntaxe alternative

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;
?>

Voir aussi while, for, et if pour d'autres exemples.



while

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;
?>



do-while

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é.



for

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(000000999999);
}
?>

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(000000999999);
}
?>



foreach

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(1234);
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(1234) as &$value) {
    
$value $value 2;
}

?>

Avertissement

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(12317);

foreach (
$a as $v) {
    echo 
"Valeur courante de \$a: $v.\n";
}

/* exemple foreach 2 : la valeur et sa clé d'index */

$a = array(12317);

$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(12345) as $v) {
    echo 
"$v\n";
}
?>



break

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;
    }
}
?>



continue

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 
"&nbsp;&nbsp;Milieu<br />\n";
        while (
1) {
            echo 
"&nbsp;&nbsp;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.



switch

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;
}
?>



declare

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
?>

Ticks

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

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
?>

Attention

Combinée avec les espaces de nommage, la seule syntaxe valable pour declare est declare(encoding='...');... 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.



return

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()

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.



include()

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.

Avertissement

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.

?>

Avertissement

Alerte de sécurité

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.



require_once()

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.



include_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.



goto

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.

Image gracieuseté de » xkcd




Les fonctions

Sommaire


Les fonctions définies par l'utilisateur

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]*.

Astuce

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 ($makefoofoo();

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



Les arguments de fonction

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

Passage d'arguments par référence

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.

Valeur par défaut des arguments

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.

Nombre d'arguments variable

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 de retour

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 (
012);
}
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.



Fonctions variables

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().



Fonctions internes

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().



Fonctions anonymes

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($total2);;
    }
}

$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.




Les classes et les objets (PHP 4)

Sommaire


Les classes : class

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.

Avertissement

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.

Attention

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.

Attention

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.

Attention

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.



extends : héritage

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.



Constructeur

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 
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.

Attention

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.



Opérateur de contexte de classe (::)

Attention

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 {
    function 
example() {
        echo 
"Je suis la fonction originale A::example().<br />\n";
    }
}

class 
extends {
    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.



parent

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 {
    function 
example() {
        echo 
"Je suis A::example() et je fournis une fonctionnalité de base.<br />\n";
    }
}

class 
extends {
    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();
?>


Sauvegarde d'objets - cas des sessions

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 {
      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.



Les fonctions magiques __sleep et __wakeup

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.



Références dans un constructeur

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 {
    function 
A($i) {
        
$this->value $i;
        
// Essayez de comprendre on n'a pas besoin de
        // référence ici
        
$this->= new B($this);
    }

    function 
createRef() {
        
$this->= new B($this);
    }

    function 
echoValue() {
        echo 
"<br />","class ",get_class($this),': ',$this->value;
    }
}


class 
{
    function 
B(&$a) {
        
$this->= &$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



Comparer des objets

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




Les classes et les objets (PHP 5)

Sommaire


Introduction

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.

Astuce

Vous pourriez également avoir besoin de jeter un oeil sur Guide de nommage de l'espace utilisateur.



Syntaxe de base

class

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(truefalse);
}
?>

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.

Le mot-clé new

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"
}

Le mot-clé extends

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


Auto-chargement de classes

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 ...
*/
?>



Constructeurs et destructeurs

Constructeurs

void __construct ([ mixed $args [, $... ]] )

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.

Destructeurs

void __destruct ( void )

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.



Visibilité

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.

Visibilité des membres

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.

Visibilité des méthodes

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 (::)

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();
?>


Statique

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
?>


Constantes de classe

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.



Abstraction de classes

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.



Interfaces

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.

implements

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 constantes

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.

Exemples

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 
extends a
{
    public function 
baz(Baz $baz);
}

// Ceci ne fonctionnera pas
class implements b
{
    public function 
foo()
    {
    }

    public function 
baz(Baz $baz)
    {
    }
}

// Ceci ne fonctionnera pas et soulèvera une erreur fatale
class 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 
extends ab
{
    public function 
baz();
}

class 
implements c
{
    public function 
foo()
    {
    }

    public function 
bar()
    {
    }

    public function 
baz()
    {
    }
}
?>

Exemple #4 Les interfaces avec des constantes

<?php
interface a
{
    const 
'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 implements a
{
    const 
'Constante de classe';
}
?>

Voir aussi l'opérateur instanceof.



Surcharge

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.

Historique

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().

Surcharge des propriétés

void __set ( string $name , mixed $value )
mixed __get ( string $name )
bool __isset ( string $name )
void __unset ( string $name )

__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->1;
echo 
$obj->"\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

Surcharge de méthode

mixed __call ( string $name , array $arguments )
mixed __callStatic ( string $name , array $arguments )

__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


Parcours d'objets

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.



Masques

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.

Usine

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');
?>

Singleton

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;

?>


Méthodes magiques

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.

Attention

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.

__sleep et __wakeup

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();
    }
}
?>

__toString

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.

__invoke

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)

__set_state

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($atrue) . ';'); // $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"
}


Mot-clé "final"

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.



Clonage d'objets

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
        )

)


Comparaison d'objets

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.



Réflexion

Introduction

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

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

ReflectionException étend le standard Exception et est lancé par l'API Reflection. Aucune méthode spécifique ni de propriété ne sont introduites.

ReflectionFunction

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 namebool 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($statics1));
}

// 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().

ReflectionParameter

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 parameterbool 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'
    
);
}
?>

ReflectionClass

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 namemixed 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').

ReflectionObject

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 objectbool return)
}
?>

ReflectionMethod

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 namebool 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($statics1));
}

// Invocation de la méthode
printf("---> Résultat de l'invocation dans : ");
var_dump($method->invoke(NULL));
?>

ReflectionProperty

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 namebool 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 objectmixed 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($obj10);
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.

ReflectionExtension

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 namebool 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)
);
?>

Extension des classes de réflexion

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 {
  protected function 
x() {}
}

/**
 * Démo classe #2
 *
 */
class extends {
  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



Typage objet

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é.



Late Static Bindings (Résolution statique à la volée)

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.

Limitations de self::

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 {
    public static function 
qui() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::qui();
    }
}

class 
extends {
    public static function 
qui() {
         echo 
__CLASS__;
    }
}

B::test();
?>

L'exemple ci-dessus va afficher :

A

Utilisation de la résolution statique à la volée

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 {
    public static function 
qui() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        static::
qui(); // Ici, résolution à la volée
    
}
}

class 
extends {
    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 {
    public static function 
foo() {
        static::
qui();
    }

    public static function 
qui() {
        echo 
__CLASS__."\n";
    }
}

class 
extends {
    public static function 
test() {
        
A::foo();
        
parent::foo();
        
self::foo();
    }

    public static function 
qui() {
        echo 
__CLASS__."\n";
    }
}
class 
extends {
    public static function 
qui() {
        echo 
__CLASS__."\n";
    }
}

C::test();
?>

L'exemple ci-dessus va afficher :

A
C
C

Cas limites

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 {

   protected static function 
qui() {
        echo 
__CLASS__."\n";
   }

   public function 
__get($var) {
       return static::
qui();
   }
}

class 
extends {

   protected static function 
qui() {
        echo 
__CLASS__."\n";
   }
}

$b = new B;
$b->foo;
?>

L'exemple ci-dessus va afficher :

B


Objets et références

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 {
    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



Les espaces de noms

Sommaire


Introduction aux espaces de noms

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 :

  1. Collisions de noms entre le code que vous créez, les classes, fonctions ou constantes internes de PHP, ou celle de bibliothèques tierces.
  2. La capacité de faire des alias ou de raccourcir des Noms_Extremement_Long pour aider à la résolution du premier problème, et améliorer la lisibilité du code.

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.



Définition des espaces de noms

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.



Déclaration d'un sous espace de noms

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.



Définition de plusieurs espaces de noms dans le même fichier

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();
}
?>



Utilisation des espaces de noms : introduction

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 :

  1. Un nom relatif de fichier, tel que foo.txt. Cela est résolu en dossiercourant/foo.txt où dossiercourant est le dossier de travail. Si le dossier courant est /home/foo, ce nom se résout en /home/foo/foo.txt.
  2. Un chemin relatif, tel que sous-dossier/foo.txt. Cela se résout en dossiercourant/sous-dossier/foo.txt.
  3. Un chemin absolu, tel que /main/foo.txt. Cela se résout en /main/foo.txt.

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 :

  1. Un nom sans qualificatif, ou une classe sans préfixe, telle que $a = new foo(); ou foo::methodestatique();. Si l'espace de noms courant est espacedenomscourant, ceci se résout en espacedenomscourant\foo. Si l'espace de noms est global, soit encore l'espace de noms sans nom, cela devient foo. Une mise en garde : les noms sans qualificatif pour les fonctions et les constantes vont être pris dans l'espace de noms global, si la fonction n'est pas définie dans l'espace de noms courant. Voyez Utilisation des espaces de noms : retour à l'espace de noms global pour les fonctions et les constantes pour plus de détails.
  2. Un nom qualifié, ou une classe préfixée telle que $a = new sousespacedenoms\foo(); or sousespacedenoms\foo::methodestatique();. Si l'espace de noms courant est espacedenomscourant, cela devient espacedenomscourant\sousespacedenoms\foo. Si le code est global, c'est à dire l'espace de noms sans nom, cela devient sousespacedenoms\foo.
  3. Un nom absolu, ou un nom préfixé avec un opérateur global tel que $a = new \espacedenomscourant\foo(); ou \espacedenomscourant\foo::methodestatique();. Cela fait toujours référence au nom littéral spécificé dans le code : espacedenomscourant\foo.

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
?>



Espaces de noms et langage dynamique

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.



La commande namespace et la constante __NAMESPACE__

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
?>



Utilisation des espaces de noms : importation et alias

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 AnotherMy\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 AnotherMy\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 AnotherMy\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
?>



Espace de noms global

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;

?>



Utilisation des espaces de noms : retour à l'espace global

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";
}
?>



Règles de résolutions de noms

Dans le cadre des règles de résolution, il y a plusieurs définitions importantes :

Définitions pour les espaces de noms
nom non qualifié

Ceci est un identifiant ne contenant pas un séparateur d'espace de noms. Par exemple : Foo

nom qualifié

Ceci est un identifiant contenant un séparateur d'espace de noms. Par exemple : Foo\Bar

Nom absolu

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 :

  1. Les appels à des espaces de noms absolus pour des fonctions, classes ou constantes sont résolus à la compilation. Par exemple, new \A\B utilise la classe A\B.
  2. Tous les noms qui ne sont pas absolus sont traduits durant la compilation à l'aide des règles d'importation. Par exemple, si le nom A\B\C est importé sous l'alias C, un appel à C\D\e() est traduit en un appel à A\B\C\D\e().
  3. Dans un nom de domaine, tous les noms qualifiés qui ne sont pas traduits à l'aide des règles d'importation sont préfixés avec l'espace de noms courant. Par exemple, si un appel à C\D\e() est effectué dans l'espace de noms A\B, il est traduit en A\B\C\D\e().
  4. Les classes non qualifiées sont traduites durant la compilation en fonction des règles d'importations (le nom complet remplace les noms courts). Par exemple, si l'espace de noms A\B\C est importé sous le nom C, new C() est remplacé par new A\B\C().
  5. Dans un espace de noms, tel que A\B, les appels à des fonctions sans qualification sont résolus à la compilation. Voici comment un appel à foo() est résolu :
    1. Il recherche une fonction dans l'espace de noms courant : A\B\foo().
    2. Il essaie de trouver et appeler la fonction globale foo().
  6. Dans un espace de noms, e.g. A\B, un appel à une classe qualifiée ou non qualifiée (pas absolue), est résolu à l'exécution. Voici comment un appel à new C() ou à new D\E() est résolu. Pour new C() :
    1. Il recherche une classe dans l'espace de noms courant : A\B\C.
    2. Il appelle l'autoload pour A\B\C.
    Pour new D\E():
    1. Il recherche une classe dans l'espace de noms courant : A\B\D\E.
    2. Il appelle l'autoload pour A\B\D\E.
    Pour référencer une classe globale dans l'espace de noms global, son nom absolu new \C() doit être utilisé.

Exemple #1 Exemples de résolutions d'espaces de noms

<?php
namespace A;
use 
B\DC\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"
?>


Foire aux questions : ce que vous devez savoir des espaces de noms

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.

  1. Si je n'utilise pas d'espaces de noms, est-ce que je dois m'en soucier ?
  2. Comment utiliser une classe globale ou interne depuis un espace de noms ?
  3. Comment utiliser les classes d'espaces de noms, les fonctions ou les constantes dans leur propre espace ?
  4. Comment est-ce qu'un nom comme \mon\nom ou \nom est résolu ?
  5. Comment est-ce qu'un nom tel que mon\nom est résolu ?
  6. Comment un nom de classe sans qualification, tel que nom, est résolu ?
  7. Comment une fonction sans qualification ou une constante de nom nom est résolue ?

Voici les points particuliers de l'implémentation, qui peuvent être utile à la compréhension globale.

  1. Les noms importés ne doivent pas entrer en conflit avec les classes définies dans le même fichier
  2. Les espaces de noms imbriqués sont interdits
  3. Ni les fonctions, ni les constantes ne peuvent être importées avec la commande use
  4. Les noms d'espaces de noms dynamiques doivent protéger l'anti-slash
  5. Des constantes indéfinies référencées avec un anti-slash produisent une erreur fatale
  6. Impossible de remplacer des constantes spéciales comme NULL, TRUE, FALSE, ZEND_THREAD_SAFE ou ZEND_DEBUG_BUILD

Si je n'utilise pas d'espaces de noms, est-ce que je dois m'en soucier ?

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;

Comment utiliser une classe globale ou interne depuis un espace de noms ?

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 {}
?>

Comment utiliser les classes d'espaces de noms, les fonctions ou les constantes dans leur propre espace ?

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;
?>

Comment est-ce qu'un nom comme \mon\nom ou \nom est résolu ?

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"
?>

Comment est-ce qu'un nom tel que mon\nom est résolu ?

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"
?>

Comment un nom de classe sans qualification, tel que nom, est résolu ?

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"
?>

Comment une fonction sans qualification ou une constante de nom nom est résolue ?

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"
?>

Les noms importés ne doivent pas entrer en conflit avec les classes définies dans le même fichier

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;
?>

Les espaces de noms imbriqués sont interdits

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 {}
}
?>

Ni les fonctions, ni les constantes ne peuvent être importées avec la commande use

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();
?>

Les noms d'espaces de noms dynamiques doivent protéger l'anti-slash

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.

Des constantes indéfinies référencées avec un anti-slash produisent une erreur fatale

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
?>

Impossible de remplacer des constantes spéciales comme NULL, TRUE, FALSE, ZEND_THREAD_SAFE ou ZEND_DEBUG_BUILD

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.
?>




Les exceptions

Sommaire

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.

Astuce

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!"

Exceptions étendues

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=NULLint 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";
?>



Les références

Sommaire


Qu'est ce qu'une référence ?

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.



Que font les références ?

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.

Avertissement

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(
123) 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.



Ce que les références ne sont pas

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.



Passage par référence

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 variable, i.e. foo($a)
  • Un nouvel objet, i.e. foo(new foobar())
  • 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

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.



Détruire une référence

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.



Repérer une référence

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 :

Références globales

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.

$this

Dans une méthode d'objet, $this est toujours une référence sur l'objet courant.




Variables prédéfinies

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 SuperglobalesLes Superglobales sont des variables internes qui sont toujours disponibles, quelque soit le contexte

Description

É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 :

Historique

Version Description
4.1.0 Les superglobales sont introduites en PHP.

Notes

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

$GLOBALSRéférence toutes les variables disponibles dans un contexte global

Description

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.

Exemples

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

Notes

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]

$_SERVER -- $HTTP_SERVER_VARS [Obsolète]Variables de serveur et d'exécution

Description

$_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.)

Indices

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.

'PHP_SELF'
Le nom du fichier du script en cours d'exécution, par rapport à la racine web. Par exemple, $_SERVER['PHP_SELF'] dans le script situé à l'adresse http://www.monsite.com/test.php/foo.bar sera /test.php/foo.bar. La constante __FILE__ contient le chemin complet ainsi que le nom du fichier (i.e. inclut) courant. Si PHP fonctionne en ligne de commande, cette variable contient le nom du script depuis PHP 4.3.0. Dans les versions antérieures, cette variable n'était pas disponible.
'argv'
Tableau des arguments passés au script. Lorsque le script est appelé en ligne de commande, cela donne accès aux arguments, comme en langage C. Lorsque le script est appelé avec la méthode GET, ce tableau contiendra la chaîne de requête.
'argc'
Contient le nombre de paramètres de la ligne de commande passés au script (si le script fonctionne en ligne de commande).
'GATEWAY_INTERFACE'
Numéro de révision de l'interface CGI du serveur : i.e. 'CGI/1.1'.
'SERVER_ADDR'
L'adresse IP du serveur sous lequel le script courant est en train d'être exécuté.
'SERVER_NAME'
Le nom du serveur hôte qui exécute le script suivant. Si le script est exécuté sur un hôte virtuel, ce sera la valeur définie pour cet hôte virtuel.
'SERVER_SOFTWARE'
Chaîne d'identification du serveur, qui est donnée dans les en-têtes lors de la réponse aux requêtes.
'SERVER_PROTOCOL'
Nom et révision du protocole de communication : i.e. 'HTTP/1.0';
'REQUEST_METHOD'
Méthode de requête utilisée pour accéder à la page; i.e. 'GET', 'HEAD', 'POST', 'PUT'.

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.

'REQUEST_TIME'
Le temps Unix depuis le début de la requête. Disponible depuis PHP 5.1.0.
'QUERY_STRING'
La chaîne de requête, si elle existe, qui est utilisée pour accéder à la page.
'DOCUMENT_ROOT'
La racine sous laquelle le script courant est exécuté, comme défini dans la configuration du serveur.
'HTTP_ACCEPT'
Contenu de l'en-tête Accept: de la requête courante, s'il y en a une.
'HTTP_ACCEPT_CHARSET'
Contenu de l'en-tête Accept-Charset: de la requête courante, si elle existe. Par exemple : 'iso-8859-1,*,utf-8'.
'HTTP_ACCEPT_ENCODING'
Contenu de l'en-tête Accept-Encoding: de la requête courante, si elle existe. Par exemple : 'gzip'.
'HTTP_ACCEPT_LANGUAGE'
Contenu de l'en-tête Accept-Language: de la requête courante, si elle existe. Par exemple : 'fr'.
'HTTP_CONNECTION'
Contenu de l'en-tête Connection: de la requête courante, si elle existe. Par exemple : 'Keep-Alive'.
'HTTP_HOST'
Contenu de l'en-tête Host: de la requête courante, si elle existe.
'HTTP_REFERER'
L'adresse de la page (si elle existe) qui a conduit le client à la page courante. Cette valeur est affectée par le client, et tous les clients ne le font pas. Certains navigateurs permettent même de modifier la valeur de HTTP_REFERER, sous forme de fonctionnalité. En bref, ce n'est pas une valeur de confiance.
'HTTP_USER_AGENT'
Contenu de l'en-tête User_Agent: de la requête courante, si elle existe. C'est une chaîne qui décrit le client HTML utilisé pour voir la page courante. Par exemple : Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Entre autres choses, vous pouvez utiliser cette valeur avec get_browser() pour optimiser votre page en fonction des capacités du client.
'HTTPS'
Définissez à une valeur non-vide si le script nécessite d'utiliser le protocole HTTPS.

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.

'REMOTE_ADDR'
L'adresse IP du client qui demande la page courante.
'REMOTE_HOST'
Le nom de l'hôte qui lit le script courant. La résolution DNS inverse est basée sur la valeur de REMOTE_ADDR.

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().

'REMOTE_PORT'
Le port utilisé par la machine cliente pour communiquer avec le serveur web.
'SCRIPT_FILENAME'

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.

'SERVER_ADMIN'
La valeur donnée à la directive SERVER_ADMIN (pour Apache), dans le fichier de configuration. Si le script est exécuté par un hôte virtuel, ce sera la valeur définie par l'hôte virtuel.
'SERVER_PORT'
Le port de la machine serveur utilisé pour les communications. Par défaut, c'est "80". En utilisant SSL, par exemple, il sera remplacé par le numéro de port HTTP sécurisé.
'SERVER_SIGNATURE'
Chaîne contenant le numéro de version du serveur et le nom d'hôte virtuel, qui sont ajoutés aux pages générées par le serveur, si cette option est activée.
'PATH_TRANSLATED'
Chemin dans le système de fichiers (pas le document-root) jusqu'au script courant, une fois que le serveur a fait une traduction chemin virtuel -> réel.

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.

'SCRIPT_NAME'
Contient le nom du script courant. Cela sert lorsque les pages doivent s'appeler elles-mêmes. La constante __FILE__ contient le chemin complet ainsi que le nom du fichier (i.e. inclut) courant.
'REQUEST_URI'
L'URI qui a été fourni pour accéder à cette page. Par exemple : '/index.html'.
'PHP_AUTH_DIGEST'
Lorsque vous utilisez PHP avec Apache en tant que module faisant une identification HTTP Digest, cette variable est définie dans l'en-tête "Authorization" envoyé par le client (que vous devez donc utiliser pour réaliser la validation appropriée).
'PHP_AUTH_USER'
Lorsque vous utilisez PHP avec Apache ou IIS (ISAPI en PHP 5) en tant que module faisant une identification HTTP, cette variable est définie à l'utilisateur fourni par l'utilisateur.
'PHP_AUTH_PW'
Lorsque vous utilisez PHP avec Apache ou IIS (ISAPI en PHP 5) en tant que module faisant une identification HTTP, cette variable est définie au mot de passe fourni par l'utilisateur.
'AUTH_TYPE'
Lorsque vous utilisez PHP avec Apache en tant que module faisant une identification HTTP, cette variable est définie au type d'identification.

Historique

Version Description
4.1.0 Introduction de $_SERVER, rendant obsolète $HTTP_SERVER_VARS.

Exemples

Exemple #1 Exemple avec $_SERVER

<?php
echo $_SERVER['SERVER_NAME'];
?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

www.example.com

Notes

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]

$_GET -- $HTTP_GET_VARS [Obsolète]Variables HTTP GET

Description

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.)

Historique

Version Description
4.1.0 Introduction de $_GET, rendant obsolète $HTTP_GET_VARS.

Exemples

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 !

Notes

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]

$_POST -- $HTTP_POST_VARS [Obsolète]Variables HTTP POST

Description

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.)

Historique

Version Description
4.1.0 Introduction de $_POST, rendant obsolète $HTTP_POST_VARS.

Exemples

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 !

Notes

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]

$_FILES -- $HTTP_POST_FILES [Obsolète]Variable de téléchargement de fichier via HTTP

Description

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)

Historique

Version Description
4.1.0 Introduction de $_FILES, rendant obsolète $HTTP_POST_FILES.

Notes

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.

Voir aussi



$_REQUEST

$_REQUESTVariables de requête HTTP

Description

Un tableau associatif qui contient par défaut le contenu des variables $_GET, $_POST et $_COOKIE.

Historique

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.

Notes

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.

Voir aussi



$_SESSION

$HTTP_SESSION_VARS [obsolète]

$_SESSION -- $HTTP_SESSION_VARS [obsolète]Variables de session

Description

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)

Historique

Version Description
4.1.0 Introduction de $_SESSION, rendant obsolète $HTTP_SESSION_VARS.

Notes

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.

Voir aussi



$_ENV

$HTTP_ENV_VARS [Obsolète]

$_ENV -- $HTTP_ENV_VARS [Obsolète]Variables d'environnement

Description

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.)

Historique

Version Description
4.1.0 Introduction de $_ENV, rendant obsolète $HTTP_ENV_VARS.

Exemples

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 !

Notes

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.

Voir aussi



$_COOKIE

$HTTP_COOKIE_VARS [Obsolète]

$_COOKIE -- $HTTP_COOKIE_VARS [Obsolète]Cookies HTTP

Description

Un tableau associatif de variables, passé au script courant, via des cookies HTTP.

$HTTP_COOKIE_VARS contient les mêmes informations, mais n'est pas superglobale. (Notez que $HTTP_COOKIE_VARS et $_COOKIE sont des variables différentes et que PHP les traite comme telles.)

Historique

Version Description
4.1.0 Introduction de $_COOKIE, rendant obsolète $HTTP_COOKIE_VARS.

Exemples

Exemple #1 Exemple avec $_COOKIE

<?php
echo 'Bonjour ' htmlspecialchars($_COOKIE["name"]) . '!';
?>

En supposant que le cookie "name" a été définit précédemment

L'exemple ci-dessus va afficher quelque chose de similaire à :

Bonjour Yannick !

Notes

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

$php_errormsgLe dernier message d'erreur

Description

$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.

Avertissement

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.

Exemples

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

$HTTP_RAW_POST_DATADonnées POST brutes

Description

$HTTP_RAW_POST_DATA contient les données POST brutes. Voir always_populate_raw_post_data.



$http_response_header

$http_response_headerEn-têtes de réponse HTTP

Description

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.

Exemples

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

$argcLe nombre d'arguments passé au script

Description

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é.

Exemples

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

$argvTableau d'arguments passé au script

Description

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é.

Exemples

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"
}


Sommaire

  • Les Superglobales — Les Superglobales sont des variables internes qui sont toujours disponibles, quelque soit le contexte
  • $GLOBALS — Référence toutes les variables disponibles dans un contexte global
  • $_SERVER — Variables de serveur et d'exécution
  • $_GET — Variables HTTP GET
  • $_POST — Variables HTTP POST
  • $_FILES — Variable de téléchargement de fichier via HTTP
  • $_REQUEST — Variables de requête HTTP
  • $_SESSION — Variables de session
  • $_ENV — Variables d'environnement
  • $_COOKIE — Cookies HTTP
  • $php_errormsg — Le dernier message d'erreur
  • $HTTP_RAW_POST_DATA — Données POST brutes
  • $http_response_header — En-têtes de réponse HTTP
  • $argc — Le nombre d'arguments passé au script
  • $argv — Tableau d'arguments passé au script


Exceptions prédéfinies

Sommaire

Voir aussi les exceptions SPL.


Exception

Introduction

Exception est la classe de base pour toutes les exceptions.

Synopsis de la classe

Exception
Exception {
/* Propriétés */
protected string $message ;
private string $string ;
protected int $code ;
protected string $file ;
protected int $line ;
private array $trace ;
/* Méthodes */
public __construct ([ string $message= "" [, int $code= 0 [, Exception $previous= NULL ]]] )
final public string getMessage ( void )
final public Exception getPrevious ( void )
final public int getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}

Propriétés

message

Le message de l'exception

string

Nom interne de l'exception

code

Le code de l'exception

file

Le nom du fichier dans lequel l'exception a été lancée

line

La ligne où l'exception a été lancée

trace

La trace dans la pile


Exception::__construct

(PHP 5 >= 5.1.0)

Exception::__constructConstruit l'exception

Description

public Exception::__construct ([ string $message= "" [, int $code= 0 [, Exception $previous= NULL ]]] )

Construit l'exception.

Liste de paramètres

message

Le message de l'exception à lancer.

code

Le code de l'exception.

previous

L'exception précédente, utilisée pour le chaînage d'exception.

Historique

Version Description
5.3.0 Le paramètre previous a été ajouté.



Exception::getMessage

(PHP 5 >= 5.1.0)

Exception::getMessageRécupère le message de l'exception

Description

final public string Exception::getMessage ( void )

Retourne le message de l'exception.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le message de l'exception, sous la forme d'une chaîne de caractères.

Exemples

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



Exception::getPrevious

(PHP 5 >= 5.3.0)

Exception::getPreviousRetourne l'exception précédente

Description

final public Exception Exception::getPrevious ( void )

Retourne l'exception précédente (le troisième paramètre de la méthode Exception::__construct).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la précédente Exception si disponible, NULL sinon.

Exemples

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]



Exception::getCode

(PHP 5 >= 5.1.0)

Exception::getCodeRécupère le code de l'exception

Description

final public int Exception::getCode ( void )

Retourne le code de l'exception.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le code de l'exception, sous la forme d'un entier.

Exemples

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



Exception::getFile

(PHP 5 >= 5.1.0)

Exception::getFileRécupère le fichier dans lequel l'exception est survenue

Description

final public string Exception::getFile ( void )

Récupère le nom du fichier dans lequel l'exception a été lancée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nom du fichier dans lequel l'exception a été lancée.

Exemples

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



Exception::getLine

(PHP 5 >= 5.1.0)

Exception::getLineRécupère la ligne dans laquelle l'exception est survenue

Description

final public int Exception::getLine ( void )

Retourne le numéro de la ligne où l'exception a été lancée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le numéro de la ligne où l'exception a été lancée.

Exemples

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



Exception::getTrace

(PHP 5 >= 5.1.0)

Exception::getTraceRécupère la trace de la pile

Description

final public array Exception::getTrace ( void )

Retourne la trace de la pile de l'exception.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la trace de la pile de l'exception sous la forme d'un tableau.

Exemples

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) {
    }
  }
}



Exception::getTraceAsString

(PHP 5 >= 5.1.0)

Exception::getTraceAsStringRécupère la trace de la pile en tant que chaîne

Description

final public string Exception::getTraceAsString ( void )

Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la trace de la pile de l'exception, sous la forme d'une chaîne de caractères.

Exemples

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}



Exception::__toString

(PHP 5 >= 5.1.0)

Exception::__toStringReprésente l'exception sous la forme d'une chaîne

Description

public string Exception::__toString ( void )

Retourne une représentation de l'exception sous forme d'une chaîne de caractères.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la représentation de l'exception, sous la forme d'une chaîne de caractères.

Exemples

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}



Exception::__clone

(PHP 5 >= 5.1.0)

Exception::__cloneClone l'exception

Description

final private void Exception::__clone ( void )

Tenter de cloner l'exception, qui résulte en une erreur fatale.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Les exceptions ne sont pas clonables.


Sommaire



ErrorException

Introduction

Une exception pour les erreurs.

Synopsis de la classe

ErrorException
ErrorException extends Exception {
/* Propriétés */
protected int $severity ;
/* Méthodes */
public __construct ([ string $message [, int $code [, int $severity [, string $filename [, int $lineno ]]]]] )
final public int getSeverity ( void )
/* Méthodes héritées */
final public string Exception::getMessage ( void )
final public Exception Exception::getPrevious ( void )
final public int Exception::getCode ( void )
final public string Exception::getFile ( void )
final public int Exception::getLine ( void )
final public array Exception::getTrace ( void )
final public string Exception::getTraceAsString ( void )
public string Exception::__toString ( void )
final private void Exception::__clone ( void )
}

Propriétés

severity

La sévérité de l'exception

Exemples

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($errstr0$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


ErrorException::__construct

(PHP 5 >= 5.1.0)

ErrorException::__constructConstruit l'exception

Description

public ErrorException::__construct ([ string $message [, int $code [, int $severity [, string $filename [, int $lineno ]]]]] )

Construit l'exception.

Liste de paramètres

message

Le message de l'exception à lancer.

code

Le code de l'exception.

severity

Le degré de sévérité de l'exception.

filename

Le fichier depuis lequel l'exception est lancée.

lineno

Le numéro de ligne depuis laquelle l'exception est lancée.



ErrorException::getSeverity

(PHP 5 >= 5.1.0)

ErrorException::getSeverityRécupère la sévérité de l'exception

Description

final public int ErrorException::getSeverity ( void )

Retourne la sévérité de l'exception.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le degré de sévérité de l'exception.

Exemples

Exemple #1 Exemple avec ErrorException::ErrorException()

<?php
try {
    throw new 
ErrorException("Exception message"075);
} 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


Sommaire




Interfaces prédéfinies

Sommaire

Voir aussi les interfaces SPL.


L'interface Traversable

Introduction

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.

Sommaire de l'Interface

Traversable
Traversable {
}

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.



L'interface Iterator

Introduction

Interface pour les itérateurs ou les objets externes qui peuvent être itérés eux-mêmes en interne.

Sommaire de l'Interface

Iterator
Iterator extends Traversable {
/* Méthodes */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}

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"

Iterator::current

(PHP 5 >= 5.1.0)

Iterator::currentRetourne l'élément courant

Description

abstract public mixed Iterator::current ( void )

Retourne l'élément courant.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Peut retourner tout type.



Iterator::key

(PHP 5 >= 5.1.0)

Iterator::keyRetourne la clé de l'élément courant

Description

abstract public scalar Iterator::key ( void )

Retourne la clé de l'élément courant.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un scalaire en cas de succès, un entier 0 si une erreur survient.

Erreurs / Exceptions

Émet une alerte de type E_WARNING si une erreur survient.



Iterator::next

(PHP 5 >= 5.1.0)

Iterator::nextSe déplace sur l'élément suivant

Description

abstract public void Iterator::next ( void )

Se déplace de la position courant à l'élément suivant.

Note: Cette méthode est appelée après chaque boucle foreach.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les valeurs retournées seront ignorées.



Iterator::rewind

(PHP 5 >= 5.1.0)

Iterator::rewindReplace l'itérateur sur le premier élément

Description

abstract public void Iterator::rewind ( void )

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.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Toutes les valeurs retournées sont ignorées.



Iterator::valid

(PHP 5 >= 5.1.0)

Iterator::validVérifie si la position courante est valide

Description

abstract public boolean Iterator::valid ( void )

Cette méthode est appelée après Iterator::rewind et Iterator::next pour vérifier si la position courante est valide.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

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.


Sommaire



L'interface IteratorAggregate

Introduction

Interface pour créer un itérateur externe.

Sommaire de l'Interface

IteratorAggregate
IteratorAggregate extends Traversable {
/* Méthodes */
abstract public Traversable getIterator ( void )
}

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é"


IteratorAggregate::getIterator

(PHP 5 >= 5.1.0)

IteratorAggregate::getIteratorRetourne un itérateur externe

Description

abstract public Traversable IteratorAggregate::getIterator ( void )

Retourne un itérateur externe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une instance d'un objet qui implémente un Iterator ou l'interface Traversable.

Erreurs / Exceptions

Émet une Exception en cas d'échec.


Sommaire



L'interface ArrayAccess

Introduction

Interface permettant d'accéder aux objets de la même façon que pour les tableaux.

Sommaire de l'Interface

ArrayAccess
ArrayAccess {
/* Méthodes */
abstract public boolean offsetExists ( string $offset )
abstract public mixed offsetGet ( string $offset )
abstract public void offsetSet ( string $offset , string $value )
abstract public void offsetUnset ( string $offset )
}

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"

ArrayAccess::offsetExists

(PHP 5 >= 5.1.0)

ArrayAccess::offsetExistsIndique si une position existe dans un tableau

Description

abstract public boolean ArrayAccess::offsetExists ( string $offset )

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.

Liste de paramètres

offset

Une position à vérifier.

Valeurs de retour

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.

Exemples

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)



ArrayAccess::offsetGet

(PHP 5 >= 5.1.0)

ArrayAccess::offsetGetPosition à lire

Description

abstract public mixed ArrayAccess::offsetGet ( string $offset )

Retourne la valeur à la position donnée.

Cette méthode est exécutée lorsque l'on vérifie si une position est empty().

Liste de paramètres

offset

La position à lire.

Valeurs de retour

Peut retourner n'importe quel type de valeur.

Voir aussi



ArrayAccess::offsetSet

(PHP 5 >= 5.1.0)

ArrayAccess::offsetSetPosition à assigner

Description

abstract public void ArrayAccess::offsetSet ( string $offset , string $value )

Assigne une valeur à une position donnée.

Liste de paramètres

offset

La position à laquelle assigner une valeur.

value

La valeur à assigner.

Valeurs de retour

Aucune valeur n'est retournée.



ArrayAccess::offsetUnset

(PHP 5 >= 5.1.0)

ArrayAccess::offsetUnsetPosition à supprimer

Description

abstract public void ArrayAccess::offsetUnset ( string $offset )

Supprime une position.

Note: Cette méthode ne sera pas appelée lors du transtypage en (unset).

Liste de paramètres

offset

La position à supprimer.

Valeurs de retour

Aucune valeur n'est retournée.


Sommaire



L'interface Serializable

Introduction

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.

Sommaire de l'Interface

Serializable
Serializable {
/* Méthodes */
abstract public string serialize ( void )
abstract public mixed unserialize ( string $serialized )
}

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"

Serializable::serialize

(PHP 5 >= 5.1.0)

Serializable::serializeReprésentation linéaire de l'objet

Description

abstract public string Serializable::serialize ( void )

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.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la représentation de l'objet en chaîne de caractères, ou bien NULL

Erreurs / Exceptions

Émet une Exception si un autre type que chaîne de caractères ou NULL est retourné.

Voir aussi



Serializable::unserialize

(PHP 5 >= 5.1.0)

Serializable::unserializeConstruit un objet

Description

abstract public mixed Serializable::unserialize ( string $serialized )

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.

Liste de paramètres

serialized

La représentation en chaîne de l'objet.

Valeurs de retour

Retourne la valeur originale délinéarisée.

Voir aussi


Sommaire




Options et paramètres de contexte

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

Options de contexte des socketsListe des options de contexte des sockets

Description

Les options de contexte des sockets sont disponibles pour tous les gestionnaires fonctionnant via les sockets, comme tcp, http et ftp.

Options

bindto

Utilisé pour spécifier l'adresse IP (soit IPv4 ou IPv6), et/ou le numéro du port que PHP utilisera pour accéder au réseau. La syntaxe est ip:port. Le fait de définir l'IP ou le port à 0 permettra au système de choisir lui-même le port et/ou l'IP.

Note: Vu que FTP crée 2 sockets de connexion lors d'une opération normale, le numéro du port ne peut être spécifié en utilisant cette option.

Historique

Version Description
5.1.0 Ajout du paramètre bindto.

Exemples

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

Options de contexte HTTPListe des options de contexte HTTP

Description

Options de contexte pour les protocoles http:// et https://.

Options

method chaîne de caractères

GET, POST, ou n'importe quelle autre méthode HTTP supportée par le serveur disant.

Par défaut, vaut GET.

header chaîne de caractères

En-têtes supplémentaires à envoyer lors de la requête. Les valeurs de cette option écraseront les autres valeurs (comme User-agent:, Host:, et Authentication:).

user_agent chaîne de caractères

Valeur à envoyer avec l'en-tête User-Agent:. Cette valeur ne doit être utilisée que si l'agent utilisateur n'est pas spécifié dans l'option de contexte header ci-dessus.

Par défaut, la valeur de l'option de configuration user_agent du fichier php.ini sera utilisée.

content chaîne de caractères

Les données supplémentaires à envoyer après les en-têtes. Typiquement utilisées lors des requêtes POST ou PUT.

proxy chaîne de caractères

URI de l'adresse du proxy. (e.g. tcp://proxy.example.com:5100).

request_fulluri booléen

Lorsque défini à TRUE, l'URI entière sera utilisée lors de la construction de la requête. (i.e. GET http://www.example.com/path/to/file.html HTTP/1.0). Bien que ce format de demande ne soit pas standard, certains serveurs de proxy le demandent.

Par défaut, vaut FALSE.

max_redirects integer

Le nombre maximal de redirection à suivre. La valeur 1 ou inférieure signifie qu'aucune redirection ne sera suivie.

Par défaut, vaut 20.

protocol_version nombre décimal

Version du protocole HTTP.

Par défaut, vaut 1.0.

Note: Dans les versions antérieures à 5.3.0, PHP n'implémente pas le décodage du transfert. Aussi, si la valeur est définie à 1.1, il est de votre responsabilité d'être conforme à 1.1.

timeout nombre décimal

Délai maximal d'attente pour la lecture, sous la forme d'un nombre décimal (e.g. 10.5).

Par défaut, la valeur de l'option de configuration default_socket_timeout du fichier php.ini sera utilisé.

ignore_errors booléen

Récupère le contenu même lors de la réception d'un code d'échec.

Par défaut, vaut FALSE

Historique

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 .

Exemples

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);

?>

Notes

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

Options de contexte FTPListe des options de contexte FTP

Description

Options de contexte pour les protocoles ftp:// et ftps://.

Options

overwrite booléen

Permet l'écrasement des fichiers existants sur le serveur distant. Ne s'applique qu'en mode écriture.

Par défaut, FALSE.

resume_pos entier

Position dans le fichier à partir de laquelle on commence le transfert. Ne s'applique qu'en mode écriture.

Par défaut, vaut 0 (Début du fichier).

proxy chaîne de caractères

URI de l'adresse du proxy FTP. Ne s'applique qu'aux opérations de lecture de fichiers. Par exemple : tcp://squid.example.com:8000.

Historique

Version Description
5.1.0 Ajout du paramètre proxy .
5.0.0 Ajout des paramètres overwrite et resume_pos .

Notes

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

Options de contexte SSLListe des options de contexte SSL

Description

Options de contexte pour les protocoles ssl:// et tls://.

Options

verify_peer booléen

Nécessite une vérification du certificat SSL utilisé.

Par défaut, vaut FALSE.

allow_self_signed booléen

Permet les certificats autosignés.

Par défaut, vaut FALSE

cafile string

Endroit où se trouve le fichier de l'autorité du certificat sur le système de fichiers local et qui devra être utilisé avec l'option de contexte verify_peer pour identifier le pair distant.

capath string

Si cafile n'est pas spécifié ou si le certificat n'a pas été trouvé, une recherche dans le dossier pointé par capath sera effectué afin d'y trouver un certificat valide. capath doit être un dossier de certificat valide.

local_cert string

Chemin vers le certificat local, sur le système de fichiers. Ce doit être un fichier encodé PEM qui contient votre certificat et votre clé privée. Il peut, optionnellement, contenir la chaîne de certification de l'émetteur.

passphrase string

La phrase passe avec laquelle votre fichier local_cert a été encodé.

CN_match string

Nom commun attendu. PHP effectuera un nombre limité de recherche sur les jokers. Si le nom commun ne correspond pas à celui-là, la connexion échouera.

verify_depth integer

Échoue si la chaîne de certification est trop profonde.

Par défaut, aucune vérification.

ciphers string

Définit la liste des chiffrements. Le format de la chaîne est décrite sur la page » ciphers(1).

Par défaut, vaut DEFAULT.

capture_peer_cert boolean

Si définit à TRUE, un option de contexte peer_certificate sera créée, contenant le certificat de l'émetteur.

capture_peer_chain boolean

Si définit à TRUE, une option de contexte peer_certificate_chain sera créée, contenant la chaîne de certification.

Historique

Version Description
5.0.0 Ajout des paramètres capture_peer_cert , capture_peer_chain et ciphers .

Notes

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

Options de contexte CURLListe des options de contexte CURL

Description

Les options de contexte CURL sont disponibles lorsque l'extension CURL a été compilée en utilisant l'option de configuration --with-curlwrappers.

Options

method chaîne de caractères

GET, POST, ou n'importe quelle méthode HTTP supportée par le serveur distant.

Par défaut, vaut GET.

header chaîne de caractères

En-têtes additionnels à envoyer lors de la requête. Les valeurs de cette option écraseront les autres valeurs (comme User-agent:, Host:, et Authentication:).

user_agent chaîne de caractères

Valeur à envoyer avec l'en-tête User-Agent:.

Par défaut, la valeur de la directive user_agent du fichier php.ini sera utilisée.

content chaîne de caractères

Les données additionnelles à envoyer après les en-têtes. Cette option n'est pas utilisée pour les requêtes GET ou HEAD.

proxy chaîne de caractères

URI spécifiant l'adresse du proxy. (e.g. tcp://proxy.exemple.com:5100).

max_redirects integer

Le nombre maximal de redirections à suivre. La valeur 1 ou inférieure signifie qu'il ne faut suivre aucune redirection.

Par défaut, vaut 20.

curl_verify_ssl_host booléen

Vérifie l'hôte.

Par défaut, vaut FALSE

Note: Cette option est disponible pour les protocoles http et ftp.

curl_verify_ssl_peer booléen

Demande une vérification du certificat SSL utilisé.

Par défaut, vaut FALSE

Note: Cette option est disponible pour les protocoles http et ftp.

Exemples

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

Les options du contexte PharListe des options du contexte Phar

Description

Les options de contexte pour le gestionnaire phar://.

Options

compress int

Une des constantes de compression Phar.

metadata mixed

Les méta-données Phar. Voir Phar::setMetadata().



Paramètres de contexte

Paramètres de contexteListe des paramètres de contexte

Description

Ces paramètres peuvent être définis sur un contexte, en utilisant la fonction stream_context_set_params().

Options

notification callback

Une fonction de rappel (callback), à appeler lorsqu'un événement survient sur le flux.

Voir la fonction stream_notification_callback() pour plus de détails.


Sommaire




Sécurité


Introduction

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.



Considérations générales

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.



Binaires CGI

Sommaire


Faiblesses connues

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.

  • Accès au système de fichier : http://ma.machine/cgi-bin/php?/etc/passwd Lorsque la requête est passée dans une url, après le point d'interrogation (?), elle est envoyée à l'interpréteur comme une ligne de commande par l'interface CGI. Habituellement, l'interpréteur ouvre le fichier spécifié et l'exécute. Lorsqu'il est invoqué comme exécutable CGI, PHP refuse d'interpréter les arguments de la ligne de commande.
  • Accès d'un document web sur le serveur : http://my.host/cgi-bin/php/secret/doc.html Le "path information" dans l'url, situé juste après le nom de l'exécutable PHP, /secret/doc.html est utilisé par convention pour spécifier le nom du fichier qui doit être ouvert et interprété par le programe CGI. Habituellement, des directives de configuration du serveur web (pour le serveur Apache : Action) sont utilisées pour rediriger les requêtes afin d'obtenir un document http://my.host/secret/script.php par l'interpréteur PHP. Dans une telle configuration, le serveur web vérifie d'abord s'il a accès au répertoire /secret, et après cette vérification redirige la requête vers http://my.host/cgi-bin/php/secret/script.php. Malheureusement, si la requête est faite directement sous cette forme, aucune vérification d'accès n'est faite par le serveur web pour le fichier /secret/script.php, mais uniquement pour le fichier /cgi-bin/php. De cette manière, n'importe quel utilisateur qui peut accéder au fichier /cgi-bin/php peut aussi accéder aux documents protégés sur le serveur web. Avec PHP, l'option de compilation --enable-force-cgi-redirect et les options d'exécution doc_root et user_dir peuvent être utilisées pour prévenir ce genre d'attaques, si des restrictions d'accès sont appliquées sur les documents du serveur. Voir ci-dessous pour des explications plus complètes sur les différentes combinaisons.


Cas 1 : Tous les fichiers sont publics

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).



Cas 2 : Utilisation de la directive de compilation --enable-force-cgi-redirect

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.



Cas 3 : Utilisation du "doc_root" ou du "user_dir"

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".



Cas 4 : L'exécutable PHP à l'extérieur de l'arborescence du serveur

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.




Installé en tant que module Apache

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.



Sécurité des fichiers

Sommaire

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 :

  • Limiter les permissions de l'utilisateur web PHP.
  • Vérifier toutes les variables liées aux chemins et aux fichiers qui sont fournis.

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($logstringENT_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.


Issue lors de l'utilisation des octets nuls

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';
}
?>



Sécurité des bases de données

Sommaire

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.


Schéma de base de données

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.



Connexions au serveur de base de données

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.



Modèle de stockage avec chiffrement

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.";
}
?>


Injection SQL

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.

Techniques de contournement

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.

  • Ne nous connectez jamais sur une base de données en tant que super utilisateur ou propriétaire de la base. Utilisez toujours un utilisateur adapté, avec des droits très limités.
  • Vérifiez que les données ont bien le type attendu. PHP dispose d'un éventail de fonction de validation large, depuis les plus simples, de la section Variables et la section Caractères (e.g. is_numeric(), ctype_digit() respectivement) aux fonctions avancées de Expression rationnelle Perl.
  • 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);
    ?>

  • Mettez entre guillemets toutes les valeurs non numériques qui sont passées à la base de données avec la fonction spécifique à la base de données d'échappement de caractères (e.g. mysql_real_escape_string(), sqlite_escape_string(), etc.). Si un mécanisme d'échappement spécifique à une base de données n'existe pas, les fonctions addslashes() et str_replace() peuvent être très utiles (en fonction du type de la base de données). Lisez le premier exemple. Comme le montre l'exemple, ajouter des guillemets à la partie statique de la requête n'est pas suffisant, rendant cette requête facile à pirater.
  • N'affichez jamais d'informations spécifiques à la base, et notamment des informations concernant le schéma. Voyez aussi la section Rapport d'erreur et le chapitre Gestion des erreurs.
  • Vous pouvez avoir des procédures stockées et des curseurs prédéfinis qui font que les utilisateurs n'ont pas un accès direct aux tables ou vues, mais cette solution a d'autres impacts.

À 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.




Rapport d'erreurs

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");
}
?>



Utilisation des variables super-globales

Avertissement

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



Données transmises par les internautes

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.

  • Est-ce que ce script n'affectera que les fichiers prévus?
  • Est-il possible que des valeurs incohérentes soient exploitées ici?
  • Est-ce que ce script peut être utilisé dans un but différent?
  • Est-ce que ce script peut être utilisé malicieusement, en conjonction avec d'autres?
  • Est-ce que toutes les actions seront notées?

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).



Guillemets magiques

Sommaire

Avertissement

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.


Qu'est-ce que les guillemets magiques?

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 :

  • magic_quotes_gpc Affecte les données issues des requêtes HTTP (GET, POST, et COOKIE). Ne peut pas être configurée durant l'exécution, et vaut par défaut on en PHP. Voir aussi get_magic_quotes_gpc().
  • magic_quotes_runtime Si activée, la plupart des fonctions qui retournent des données externes, y compris issues d'une base de données ou d'un fichier texte, verront les données protégées par des antislashs. Cette directive peut être modifiée durant l'exécution, et vaut par défaut off en PHP Voir aussi set_magic_quotes_runtime() et get_magic_quotes_runtime().
  • magic_quotes_sybase Si cette configuration est active, les guillemets simples sont protégés avec un autre guillemets simples, et non pas un antislash. Lorsqu'elle est active, cette directive remplace entièrement magic_quotes_gpc. Si vous activez ces deux directives, alors seuls les guillemets simples seront protégés, avec ''. Les guillemets doubles, les antislashs et les caractères nul seront laissés intacts. Voir aussi ini_get() pour lire la valeur de la directive.


Pourquoi utiliser les guillemets magiques?

Avertissement

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.

  • Il n'y a aucune raison d'utiliser les guillemets magiques, car ils ne sont plus supportés en PHP. Cependant, ils ont existés, et ont aidé quelques débutants, en le permettant de produire, sans le savoir et involontairement, du code plus sécuritaire. Lorsque vous tombez sur des scripts qui s'appuient sur ce type de comportements, il est recommandé de modifier ce code et de désactiver les guillemets magiques. Pour quelles raisons cette fonctionnalité est apparue? Simplement pour se protéger des injections SQL. Aujourd'hui, les développeurs sont plus conscients des problèmes de sécurité, et adoptent les mécanismes de protections de leur base de données, ou les commandes préparées, au lieu de passer par les guillemets magiques.


Pourquoi ne pas utiliser les guillemets magiques?

Avertissement

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.

  • Portabilité Cette directive peut être activée ou désactivée suivant les serveurs et cela affecte grandement la portabilité. Utilisez get_magic_quotes_gpc() pour vérifier s'ils sont actifs ou pas, et adaptez votre application.
  • Performances Comme ce n'est pas toutes les données qui sont finalement placées dans une base, il y a un coût en vitesse pour protéger toutes ces données. Le simple appel des fonctions de protections en fonction des besoins est plus efficace (addslashes()). Même si php.ini-dist active ces options par défaut, php.ini-recommended les désactive. Cette recommandation est surtout faite pour des raisons de vitesse.
  • Peu pratique Comme toutes les données n'ont pas forcément besoin de protection, il est souvent désagréable de voir des données protégées là où ça ne sert à rien. Par exemple, lorsque vous envoyez par mail un formulaire, et que vous voyez des antislashs parsemer le message. Pour corriger cela, il faut faire un usage fréquent de stripslashes().


Désactiver les guillemets magiques

Avertissement

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);
}
?>




Masquer PHP

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.



Être à jour

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.




Caractéristiques


Identification HTTP avec PHP

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$matchesPREG_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'] == && $_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.



Cookies

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().



Sessions

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.



Utiliser les XForms

» 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.



Gestion des chargements de fichiers

Sommaire


Chargements de fichiers par méthode POST

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.

$_FILES['userfile']['name']

Le nom original du fichier, tel que sur la machine du client web.

$_FILES['userfile']['type']

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.

$_FILES['userfile']['size']

La taille, en octets, du fichier téléchargé.

$_FILES['userfile']['tmp_name']

Le nom temporaire du fichier qui sera chargé sur la machine serveur.

$_FILES['userfile']['error']

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.



Explication sur les messages d'erreurs de chargement de fichiers

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'].

UPLOAD_ERR_OK

Valeur : 0. Aucune erreur, le téléchargement est correct.

UPLOAD_ERR_INI_SIZE

Valeur : 1. Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini.

UPLOAD_ERR_FORM_SIZE

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.

UPLOAD_ERR_PARTIAL

Valeur : 3. Le fichier n'a été que partiellement téléchargé.

UPLOAD_ERR_NO_FILE

Valeur : 4. Aucun fichier n'a été téléchargé.

UPLOAD_ERR_NO_TMP_DIR

Valeur : 6. Un dossier temporaire est manquant. Introduit en PHP 4.3.10 et PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE

Valeur : 7. Échec de l'écriture du fichier sur le disque. Introduit en PHP 5.1.0.

UPLOAD_ERR_EXTENSION

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.



Erreurs classiques

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.

Avertissement

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[]).



Télécharger plusieurs fichiers simultanément

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.



Chargement par méthode PUT

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($putdata1024))
fwrite($fp$data);

/* Fermeture du flux */
fclose($fp);
fclose($putdata);
?>




Utilisation des fichiers à distance

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 ($file1024);
    
/* 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().



Gestion des connexions

Le statut des connexions est conservé en interne par PHP. Il y a trois états possibles :

  • 0 - NORMAL (normal)
  • 1 - ABORTED (annulé)
  • 2 - TIMEOUT (périmé)

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.



Connexions persistantes aux bases de données

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.

Avertissement

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().



Safe mode

Sommaire

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".

Avertissement

Le "Safe Mode" est supprimé dans PHP 6.0.0.


Sécurité et "Safe Mode"

Options de configuration
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.

safe_mode booléen

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.

safe_mode_gid booléen

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.

safe_mode_include_dir chaîne de caractères

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.
safe_mode_exec_dir chaîne de caractères

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.

safe_mode_allowed_env_vars chaîne de caractères

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.

safe_mode_protected_env_vars chaîne de caractères

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.

open_basedir chaîne de caractères

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().

disable_functions chaîne de caractères
Cette directive vous permet de désactiver certaines fonctions pour des raisons de sécurité. Elle prend une liste de nom de fonctions, séparés par des virgules. disable_functions n'est pas affectée par le Safe Mode. Cette directive doit être configurée dans le fichier php.ini. Par exemple, vous ne pourrez pas la configurer dans le fichier httpd.conf.
disable_classes chaîne de caractères
Cette directive vous permet de désactiver certaines classes pour des raisons de sécurité. Elle prend une liste de nom de fonctions, séparées par des virgules. disable_functions n'est pas affectée par le Safe Mode. Cette directive doit être configurée dans le fichier php.ini. Par exemple, vous ne pourrez pas la configurer dans le fichier httpd.conf.

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

Avertissement

Ces restrictions de PHP sont bien sûr invalides en exécution binaire.



Fonctions désactivées par le Safe Mode

Voici une liste non-exhaustive des fonctions désactivées par le Safe Mode.

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.




Utiliser PHP en ligne de commande

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 :

    Directives php.ini ignorées
    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 :

    Constantes spécifiques au CLI
    Constante Description
    STDIN

    Un pointeur de fichier déjà disponible vers stdin. Cela évite de l'ouvrir avec

    <?php

    $stdin 
    fopen('php://stdin''r');

    ?>

    Si vous voulez lire une seule ligne depuis stdin, vous pouvez utiliser :

    <?php
    $line 
    trim(fgets(STDIN)); // lit une seule ligne depuis STDIN
    fscanf(STDIN"%d\n"$number); // lit les nombres depuis STDIN
    ?>

    STDOUT

    Un descripteur de fichier déjà disponible vers stdout. Cela évite de l'ouvrir avec

    <?php

    $stdout 
    fopen('php://stdout''w');

    ?>

    STDERR

    Un descripteur de fichier déjà disponible vers stderr. Cela évite de l'ouvrir avec

    <?php

    $stderr 
    fopen('php://stderr''w');

    ?>

    É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 :

  1. 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.

  2. 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.

  3. 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.

Options de ligne de commande
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.

Note: Les fichiers incluent dans auto_prepend_file et auto_append_file sont analysés dans ce mode avec quelques restrictions - par exemple, les fonctions doivent être définies avant d'être appelées.

Note: Autoloading n'est pas disponible si vous utilisez PHP en mode intéractif CLI.

-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.

Note: Pour passer des arguments à votre script, le premier argument doit être --, sinon, PHP les interprètera comme des options PHP.

-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.

Note: Cette option ne fonctionne pas avec l'option -r.

-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.

Note: Une attention toute particulière doit être portée lors de l'utilisation de cette option de PHP, pour qu'il n'y ait pas de collision avec les substitutions de variables en ligne de commande, réalisées par le shell.

Exemple conduisant à une erreur d'analyse :

$ php -r "$foo = get_defined_constants();"
Command line code(1) : Parse error - parse error, unexpected '='

Le problème ici est que le shell (sh/bash) effectue une substitution de variables, même avec les guillemets doubles ". puisque la variable $foo n'est probablement pas définie dans le shell, elle est remplacée par rien, ce qui fait que le code passé à PHP pour l'exécution est :

$ php -r " = get_defined_constants();"

La solution de ce problème est d'utiliser les guillemets simples '. Les variables de ces chaînes ne seront pas substituées par leurs valeurs par le shell.

$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
["E_ERROR"]=>
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]

Si vous utilisez un shell différent de sh/bash, vous pouvez rencontrer d'autres problèmes. N'hésitez pas à ouvrir un rapport de bogues à » http://bugs.php.net/. Il est toujours très facile d'avoir des problèmes lorsque vous essayez d'inclure des variables shell dans le code, ou d'utiliser les antislash pour la protection. Vous aurez été prévenu.

Note: -r est disponible avec le CLI SAPI et pas avec le CGI SAPI.

Note: Cette option est utilisée pour des choses vraiment de base. Ainsi, quelques directives de configuration (par exemple auto_prepend_file et auto_append_file) sont ignorées dans ce mode.

-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.

Note: Cette option ne fonctionne pas avec l'option -r.

-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.

Note: Cette option ne fonctionne pas avec l'option -r.

-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 != || 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.




Référence des fonctions


Affecte le comportement de PHP


Cache PHP alternatif


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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 .



Configuration à l'exécution

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.

Options de configuration APC
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 booléen

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).

apc.shm_segments entier

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.

apc.shm_size entier

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é.

apc.optimization entier

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.

apc.num_files_hint entier

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.

apc.user_entries_hint entier

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.

apc.ttl entier

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.

apc.user_ttl entier

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.

apc.gc_ttl entier

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.

apc.cache_by_default booléen

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.

apc.filters chaîne de caractères

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.

apc.mmap_file_mask chaîne de caractères

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.

apc.slam_defense entier

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.

apc.file_update_protection entier

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.

apc.enable_cli entier

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.

apc.max_file_size entier

Permet d'éviter la mise en cache des fichiers dont la taille est supérieure à cette valeur. Par défaut, 1Mo.

apc.stat entier

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.

apc.write_lock booléen

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.

apc.report_autofilter booléen

Logs tous les scripts qui sont automatiquement exclus de la mise en cache à cause de problèmes de liaison.

apc.include_once_override booléen

Optimise les appels aux fonctions include_once() et require_once() et évite ainsi de surcharger le système appelant.

apc.rfc1867 booléen

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_keykey 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
)

apc.rfc1867_prefix chaîne de caractères

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.

apc.rfc1867_name chaîne de caractères

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.

apc.rfc1867_freq chaîne de caractères

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.

apc.localcache booléen

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.

apc.localcache.size entier

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.

apc.coredump_unmap booléen

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é.

Avertissement

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.

apc.stat_ctime entier

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.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Cette extension ne définit aucune constante.



Fonctions APC


apc_add

(PECL apc >= 3.0.13)

apc_addMet en cache une variable dans le magasin de données

Description

bool apc_add ( string $key , mixed $var [, int $ttl= 0 ] )

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).

Liste de paramètres

key

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().)

var

La variable à stocker

ttl

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.).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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"

Voir aussi

  • apc_store() - Met en cache une variable dans le magasin
  • apc_fetch() - Récupère une variable stockée dans le cache
  • apc_delete() - Efface une variable stockée dans le cache



apc_cache_info

(PECL apc >= 2.0.0)

apc_cache_info Récupère les informations du cache dans l'entrepôt APC

Description

array apc_cache_info ([ string $cache_type [, bool $limited= false ]] )

Récupère les informations du cache et les métadonnées depuis le magasin APC.

Valeurs de retour

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é.

Liste de paramètres

cache_type

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.

limited

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.

Historique

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.

Exemples

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)
)



apc_clear_cache

(PECL apc >= 2.0.0)

apc_clear_cache Efface le cache APC

Description

bool apc_clear_cache ([ string $cache_type ] )

Efface le cache utilisateur/système.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Liste de paramètres

cache_type

Si cache_type vaut "user", le cache utilisateur sera nettoyé ; sinon, le cache système (les fichiers mis en cache) sera nettoyé.

Voir aussi



apc_compile_file

(PECL apc >= 3.0.13)

apc_compile_fileStocke un fichier dans le cache, en évitant tous les filtres

Description

bool apc_compile_file ( string $filename )

Stocke un fichier dans le cache, en évitant tous les filtres.

Liste de paramètres

filename

Chemin complet ou relatif vers un fichier PHP qui sera compilé et stocké dans le cache.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



apc_define_constants

(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

Description

bool apc_define_constants ( string $key , array $constants [, bool $case_sensitive= true ] )

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.

Liste de paramètres

key

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().

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.

case_sensitive

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec apc_define_constants()

<?php
$constants 
= array(
    
'UN'   => 1,
    
'DEUX'   => 2,
    
'TROIS' => 3,
);
apc_define_constants('numbers'$constants);
echo 
UNDEUXTROIS;
?>

L'exemple ci-dessus va afficher :

123

Voir aussi



apc_delete

(PECL apc >= 3.0.0)

apc_delete Efface une variable stockée dans le cache

Description

bool apc_delete ( string $key )

Efface une variable stockée dans le cache.

Liste de paramètres

key

La clé key utilisée pour stocker la valeur (avec apc_store()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec apc_delete()

<?php
$bar 
'BAR';
apc_store('foo'$bar);
apc_delete('foo');
// c'est évidemment inutile sous cette forme
?>

Voir aussi

  • apc_store() - Met en cache une variable dans le magasin
  • apc_fetch() - Récupère une variable stockée dans le cache



apc_fetch

(PECL apc >= 3.0.0)

apc_fetch Récupère une variable stockée dans le cache

Description

mixed apc_fetch ( string $key [, bool &$success ] )

Récupère une variable stockée dans le cache.

Liste de paramètres

key

La clé key utilisée pour stocker la valeur (avec apc_store()).

success

Vaut TRUE en cas de succès, et FALSE si une erreur survient.

Valeurs de retour

La variable stockée en cas de succès, FALSE si une erreur survient.

Exemples

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"

Voir aussi

  • apc_store() - Met en cache une variable dans le magasin
  • apc_delete() - Efface une variable stockée dans le cache



apc_load_constants

(PECL apc >= 3.0.0)

apc_load_constants Charge un jeu de constantes depuis le cache

Description

bool apc_load_constants ( string $key [, bool $case_sensitive= true ] )

Charge un jeu de constantes depuis le cache.

Liste de paramètres

key

Le nom du jeu de constantes (qui a été stocké avec la fonction apc_define_constants()) à récupérer.

case_sensitive

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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 
UNDEUXTROIS;
?>

L'exemple ci-dessus va afficher :

123

Voir aussi



apc_sma_info

(PECL apc >= 2.0.0)

apc_sma_info Récupère les informations d'allocation mémoire partagée d'APC

Description

array apc_sma_info ([ bool $limited= false ] )

Récupère les informations d'allocation mémoire partagée d'APC.

Liste de paramètres

limited

Lorsque défini à FALSE (défaut) apc_sma_info() retournera une information détaillée de chaque segment.

Valeurs de retour

Tableau de données d'allocation mémoire partagée ; FALSE si une erreur survient.

Exemples

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
                        )

                )

        )

)



apc_store

(PECL apc >= 3.0.0)

apc_store Met en cache une variable dans le magasin

Description

bool apc_store ( string $key , mixed $var [, int $ttl= 0 ] )

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).

Liste de paramètres

key

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.

var

La variable à stocker.

ttl

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.).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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"

Voir aussi

  • apc_add() - Met en cache une variable dans le magasin de données
  • apc_fetch() - Récupère une variable stockée dans le cache
  • apc_delete() - Efface une variable stockée dans le cache


Sommaire

  • apc_add — Met en cache une variable dans le magasin de données
  • apc_cache_info — Récupère les informations du cache dans l'entrepôt APC
  • apc_clear_cache — Efface le cache APC
  • apc_compile_file — Stocke un fichier dans le cache, en évitant tous les filtres
  • apc_define_constants — Définit un jeu de constantes pour la récupération et la définition en masse
  • apc_delete — Efface une variable stockée dans le cache
  • apc_fetch — Récupère une variable stockée dans le cache
  • apc_load_constants — Charge un jeu de constantes depuis le cache
  • apc_sma_info — Récupère les informations d'allocation mémoire partagée d'APC
  • apc_store — Met en cache une variable dans le magasin



Débogueur PHP avancé


Introduction

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.

Attention

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).



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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)



Building on Win32

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.



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration APD
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.

apd.dumpdir chaîne de caractères

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().

apd.statement_tracing booléen

Active ou désactive les traces à la ligne. En activant cette option (valeur de 1), l'application sera considérablement ralentie.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.

Constantes APD
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  


Exemples

Sommaire


Comment utiliser PHP-APD dans vos scripts

  1. À 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.

  2. Maintenant, exécutez votre script. L'affichage sera écrit dans le fichier apd.dumpdir/pprof_pid.ext.

    Astuce

    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

  3. 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.

  4. Pour générer un fichier "calltree" que vous pourrez importer dans l'application d'analyse de profil KCacheGrind, exécutez la commande pprof2calltree.




Fonctions APD

Informations de contact

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.


apd_breakpoint

(PECL apd >= 0.2)

apd_breakpointStoppe l'interpréteur et attend un CR depuis la socket

Description

bool apd_breakpoint ( int $debug_level )

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.

Liste de paramètres

debug_level

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

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);



apd_callstack

(PECL apd 0.2-0.4)

apd_callstackRetourne la pile d'appel courante dans un tableau

Description

array apd_callstack ( void )

apd_callstack() retourne la pile d'appel courante dans un tableau d'éléments.

Valeurs de retour

Un tableau contenant la pile d'appel courante.

Exemples

Exemple #1 Exemple avec apd_callstack()

<?php
print_r
(apd_callstack());
?>



apd_clunk

(PECL apd 0.2-0.4)

apd_clunkLance une alerte et un callstack

Description

void apd_clunk ( string $warning [, string $delimiter ] )

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.

Liste de paramètres

warning

L'alerte à lancer.

delimiter

Le délimiteur. Par défaut, <BR />.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec apd_clunk()

<?php
apd_clunk
("Quelques alertes""<br/>");
?>

Voir aussi



apd_continue

(PECL apd >= 0.2)

apd_continueRedémarre l'interpréteur

Description

bool apd_continue ( int $debug_level )

apd_continue() envoie une instruction via la socket pour redémarrer l'interpréteur.

Liste de paramètres

debug_level

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

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec apd_continue()

<?php
apd_continue
(0);
?>



apd_croak

(PECL apd 0.2-0.4)

apd_croakLance une erreur, un callstack et sort

Description

void apd_croak ( string $warning [, string $delimiter ] )

apd_croak() fonctionne comme son homologue Perl Carp::croak. apd_croak() lance une erreur, un callstack et sort.

Liste de paramètres

warning

L'alerte à lancer.

delimiter

Le délimiteur. Par défaut, <BR />.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec apd_croak()

<?php
apd_croak
("Quelques alertes","<P>");
?>

Voir aussi



apd_dump_function_table

(Unknown)

apd_dump_function_tableAffiche la table courante de fonction

Description

void apd_dump_function_table ( void )

apd_dump_function_table() affiche la table courante de fonction.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec apd_dump_function_table()

<?php
apd_dump_function_table
();
?>



apd_dump_persistent_resources

(PECL apd 0.2-0.4)

apd_dump_persistent_resourcesRetourne toutes les ressources persistantes dans un tableau

Description

array apd_dump_persistent_resources ( void )

apd_dump_persistent_resources() retourne toutes les ressources persistantes dans un tableau.

Valeurs de retour

Un tableau contenant toutes les ressources persistantes.

Exemples

Exemple #1 Exemple avec apd_dump_persistent_resources()

<?php
print_r
(apd_dump_persistent_resources());
?>

Voir aussi



apd_dump_regular_resources

(PECL apd 0.2-0.4)

apd_dump_regular_resourcesRetourne toutes les ressources régulières courantes dans un tableau

Description

array apd_dump_regular_resources ( void )

Retourne toutes les ressources régulières courantes dans un tableau.

Valeurs de retour

Un tableau contenant les ressources régulières courantes.

Exemples

Exemple #1 Exemple avec apd_dump_regular_resources()

<?php
print_r
(apd_dump_regular_resources());
?>

Voir aussi



apd_echo

(PECL apd >= 0.2)

apd_echoÉcrit dans la socket de déboguage

Description

bool apd_echo ( string $output )

apd_echo() envoie via la socket une demande d'information concernant le script exécuté.

Liste de paramètres

output

La variable de déboguage.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec apd_echo()

<?php
apd_echo
($i);
?>



apd_get_active_symbols

(PECL apd 0.2)

apd_get_active_symbolsRécupère un tableau contenant les noms des variables courantes de portée locale

Description

array apd_get_active_symbols ( void )

apd_get_active_symbols() récupère les noms de toutes les variables définies dans le contexte actif (et non leurs valeurs).

Valeurs de retour

Un tableau multidimensionnel contenant toutes les variables.

Exemples

Exemple #1 Exemple avec apd_get_active_symbols()

<?php
apd_echo
(apd_get_active_symbols());
?>



apd_set_pprof_trace

(PECL apd >= 0.2)

apd_set_pprof_traceDémarre la session de déboguage APD

Description

string apd_set_pprof_trace ([ string $dump_directory [, string $fragment= "pprof" ]] )

Démarre la session de déboguage dans le dossier dump_directory /pprof_{process_id}.

Liste de paramètres

dump_directory

Le dossier dans lequel le fichier sera écrit. S'il n'est pas fourni, la directive apd.dumpdir du php.ini sera utilisée.

fragment

Valeurs de retour

Retourne le chemin du fichier de destination.

Exemples

Exemple #1 Exemple avec apd_set_pprof_trace()

<?php
apd_set_pprof_trace
();
?>

Voir aussi



apd_set_session_trace_socket

(PECL apd >= 0.2)

apd_set_session_trace_socketDémarre la session de déboguage à distance

Description

bool apd_set_session_trace_socket ( string $tcp_server , int $socket_type , int $port , int $debug_level )

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.

Liste de paramètres

tcp_server

IP ou socket Unix (comme un fichier) du serveur TCP.

socket_type

Peut prendre les valeurs des constantes AF_UNIX, pour une socket à base de fichiers, ou APD_AF_INET, pour des sockets TCP/IP standard.

port

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.

debug_level

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

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec apd_set_socket_session_trace()

<?php
  apd_set_socket_session_trace
("127.0.0.1",APD_AF_INET,7112,0);
?>



apd_set_session_trace

(PECL apd 0.2-0.4)

apd_set_session_traceDémarre la session de déboguage APD

Description

void apd_set_session_trace ( int $debug_level [, string $dump_directory ] )

Démarre le déboguage de apd_dump_{process_id} dans le dossier dump_directory .

Liste de paramètres

debug_level

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

dump_directory

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.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec apd_set_session_trace()

<?php
apd_set_session_trace
(99);
?>



apd_set_session

(PECL apd 0.2-0.4)

apd_set_sessionModifie ou définit le degré de déboguage courant

Description

void apd_set_session ( int $debug_level )

apd_set_session() peut être utilisé pour augmenter ou diminuer le degré de déboguage dans un endroit particulier de votre application.

Liste de paramètres

debug_level

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

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec apd_set_session()

<?php
apd_set_session
(9);
?>



override_function

(PECL apd >= 0.2)

override_functionSurcharge les fonctions intégrées

Description

bool override_function ( string $function_name , string $function_args , string $function_code )

override_function() surcharge les fonctions intégrées (les remplace dans la table des symboles).

Liste de paramètres

function_name

La fonction à surcharger.

function_args

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.

function_code

Le nouveau code pour la fonction.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec override_function()

<?php
override_function
('test''$a,$b''echo "DOING TEST"; return $a * $b;');
?>



rename_function

(PECL apd >= 0.2)

rename_functionRenomme une fonction intégrée dans la table des fonctions globales

Description

bool rename_function ( string $original_name , string $new_name )

rename_function() renomme une fonction intégrée dans la table des fonctions globales. Utile pour surcharger temporairement une fonction intégrée.

Liste de paramètres

original_name

Le nom original de la fonction.

new_name

Le nouveau nom pour la fonction original_name .

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec rename_function()

<?php
rename_function
('mysql_connect''debug_mysql_connect' );
?>


Sommaire




Compilateur bytecode PHP


Introduction

Avertissement

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 :

  • Pour encoder un script entier dans une application PHP propriétaire
  • Pour encoder quelques fonctions / classes dans une application PHP propriétaire
  • Pour activer la production d'applications php-gtk qui peuvent être utilisées dans des applications bureautiques, sans avoir besoin d'un php.exe.
  • Pour faire la transition facilement du PHP au C

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

Note d'installation :

  • Vous avez besoin d'au moins PHP 4.3.0 pour que la compression fonctionne
  • Pour l'installer sur PHP 4.3.0 et suivant, à l'invite de commande Unix, tapez la commande : pear install bcompiler
  • Pour l'installer sous Windows, tant que le mécanisme de distribution de paquets n'est pas terminé, merci de rechercher dans les archives de la liste de diffusion pear-general les paquets précompilés. (Ou envoyer un message sur cette liste si vous ne trouvez aucune référence.)
  • Pour l'installer sur une version plus ancienne, vous devez effectuer quelques modifications à la compilation.
  • Décompressez l'archive bcompiler.tgz dans le dossier php4/ext. (récupérez-le directement depuis PECL » http://pecl.php.net/get/bcompiler)
  • Si le nouveau dossier porte un nom comme bcompiler-0.x, alors, renommez-le en bcompiler (mise à part si vous voulez le construire comme module php autonome).
  • Si vous utilisez une version plus ancienne que PHP 4.3.0, vous devez copier le fichier Makefile.in.old dans Makefile.in et le fichier config.m4.old dans config.m4.
  • Exécutez la commande phpize dans le dossier ext/bcompiler
  • Exécutez la commande ./buildconf dans le dossier php4
  • Exécutez la commande configure avec l'option --enable-bcompiler (ainsi que vos autres options)
  • make; make install
  • C'est fait !



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Cette extension ne définit aucune constante.



Fonctions bcompiler

Contact

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.


bcompiler_load_exe

(PECL bcompiler >= 0.4)

bcompiler_load_exeLit et crée des classes depuis un fichier exe bcompiler

Description

bool bcompiler_load_exe ( string $filename )

Lit les données depuis le fichier exe bcompiler appelé filename et crée les classes à partir du bytecode.

Liste de paramètres

filename

Le chemin vers le fichier exe, sous la forme d'une chaîne de caractères.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec bcompiler_load_exe()

<?php

bcompiler_load_exe
("/tmp/example.exe");
print_r(get_defined_classes());

?>

Notes

Avertissement

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.

Voir aussi

  • bcompiler_load() - Lit et crée les classes depuis un fichier compressé en bzip2



bcompiler_load

(PECL bcompiler >= 0.4)

bcompiler_loadLit et crée les classes depuis un fichier compressé en bzip2

Description

bool bcompiler_load ( string $filename )

Lit les données depuis le fichier compressé en bzip2 filename et crée les classes depuis le bytecode.

Liste de paramètres

filename

Le chemin vers le fichier compressé avec bzip2, sous la forme d'une chaîne de caractères.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec bcompiler_load()

<?php

bcompiler_load
("/tmp/example");

print_r(get_defined_classes());

?>

Notes

Avertissement

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.

Voir aussi



bcompiler_parse_class

(PECL bcompiler >= 0.4)

bcompiler_parse_classLit le bytecode d'une classe et revient à une fonction utilisateur

Description

bool bcompiler_parse_class ( string $class , string $callback )

Lit le bytecode d'une classe et revient à une fonction utilisateur.

Liste de paramètres

class

Le nom de la classe, sous la forme d'une chaîne de caractères.

callback

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec bcompiler_parse_class()

<?php

function readByteCodes($data) {
    
print_r($data);
}

bcompiler_parse_class("DB","readByteCodes");

?>

Notes

Avertissement

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.



bcompiler_read

(PECL bcompiler >= 0.4)

bcompiler_readLit et crée les classes depuis un pointeur de fichier

Description

bool bcompiler_read ( resource $filehandle )

Lit les données depuis un fichier ouvert représenté par la ressource filehandle et crée les classes depuis le bytecode.

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec bcompiler_read()

<?php
$fh 
fopen("/tmp/example","r");
bcompiler_read($fh);
fclose($fh);
print_r(get_defined_classes());

?>

Notes

Avertissement

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.



bcompiler_write_class

(PECL bcompiler >= 0.4)

bcompiler_write_classÉcrit une classe définie en bytecode

Description

bool bcompiler_write_class ( resource $filehandle , string $className [, string $extends ] )

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 .

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

className

Le nom de la classe, sous la forme d'une chaîne de caractères.

extends

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);

?>

Notes

Avertissement

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.

Voir aussi



bcompiler_write_constant

(PECL bcompiler >= 0.5)

bcompiler_write_constantÉcrit une constante définie comme bytecode

Description

bool bcompiler_write_constant ( resource $filehandle , string $constantName )

Lit le bytecode depuis PHP pour une constante existante constantName et écrit le bytecode dans le fichier ouvert désigné par filehandle .

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

constantName

Le nom de la constante définie, sous la forme d'une chaîne de caractères.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);

?>

Notes

Avertissement

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.

Voir aussi




bcompiler_write_file

(PECL bcompiler >= 0.6)

bcompiler_write_fileÉcrit un code source PHP sous forme de bytecode

Description

bool bcompiler_write_file ( resource $filehandle , string $filename )

Cette fonction compile le fichier filename en bytecodes, et écrit le résultat dans le fichier filename .

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

filename

Le chemin vers le fichier source, sous la forme d'une chaîne de caractères.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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";
*/
?>

Notes

Avertissement

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.

Voir aussi




bcompiler_write_function

(PECL bcompiler >= 0.5)

bcompiler_write_functionÉcrit une fonction définie sous forme de bytecode

Description

bool bcompiler_write_function ( resource $filehandle , string $functionName )

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).

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

functionName

Le nom de la fonction, sous la forme d'une chaîne de caractères.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>

Notes

Avertissement

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.

Voir aussi



bcompiler_write_functions_from_file

(PECL bcompiler >= 0.5)

bcompiler_write_functions_from_fileÉcrit toutes les fonctions définies dans un fichier sous forme de bytecode

Description

bool bcompiler_write_functions_from_file ( resource $filehandle , string $fileName )

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 .

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

fileName

Le fichier à compiler. Souvenez-vous de toujours include/require les fichiers que vous tentez de compiler.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);

?>

Notes

Avertissement

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.

Voir aussi



bcompiler_write_header

(PECL bcompiler >= 0.3)

bcompiler_write_headerÉcrit l'en-tête bcompiler

Description

bool bcompiler_write_header ( resource $filehandle [, string $write_ver ] )

Écrit l'en-tête bcompiler.

Liste de paramètres

filehandle

Une ressource de fichier retournée par la fonction fopen().

write_ver

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>

Notes

Avertissement

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.

Voir aussi



bcompiler_write_included_filename

(PECL bcompiler >= 0.5)

bcompiler_write_included_filenameÉcrit un fichier inclus en tant que bytecode

Description

bool bcompiler_write_included_filename ( resource $filehandle , string $filename )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Notes

Avertissement

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.


Sommaire




Gestion des erreurs et des journaux


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour la gestion d'erreurs
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.

error_reporting integer

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.

display_errors string

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.

display_startup_errors boolean

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.

log_errors boolean

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.

log_errors_max_len integer

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..
ignore_repeated_errors boolean

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_repeated_source boolean

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.

report_memleaks boolean

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.

track_errors boolean

Si cette option est activée, le dernier message d'erreur sera placé dans la variable $php_errormsg.

html_errors boolean

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.

xmlrpc_errors boolean

Désactive le rapport normal d'erreur et formate les erreurs comme des messages d'erreur XML-RPC.

xmlrpc_error_number integer

Utilisé comme valeur de l'élément XML-RPC faultcode.

docref_root string

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).

docref_ext string

Voir aussi docref_root.

Note: La valeur de docref_ext doit commencer par un point ".".

error_prepend_string string

La chaîne à placer avant les messages d'erreur.

error_append_string string

La chaîne à placer après les messages d'erreur.

error_log string

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.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.

Erreurs et historique
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.



Exemples

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_ERRORE_USER_WARNINGE_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($err3"/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 (23"foo");
$b = array (5.54.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";

?>



Fonctions sur la gestion des erreurs

Voir aussi

Voir aussi la fonction syslog().


debug_backtrace

(PHP 4 >= 4.3.0, PHP 5)

debug_backtraceGénère le contexte de déboguage

Description

array debug_backtrace ([ bool $provide_object= true ] )

debug_backtrace() génère un contexte de déboguage PHP.

Liste de paramètres

provide_object

Indique s'il faut remplir l'index "object". Par défaut, TRUE.

Valeurs de retour

Retourne un tableau associatif. Les éléments de retour possibles sont les suivants :

Éléments possibles de retour de la fonction debug_backtrace()
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.

Historique

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.

Exemples

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"
    }
}

Voir aussi



debug_print_backtrace

(PHP 5)

debug_print_backtrace Affiche la pile d'exécution PHP

Description

void debug_print_backtrace ( void )

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().

Liste de paramètres

Cette fonction n'a aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

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]

Voir aussi



error_get_last

(PHP 5 >= 5.2.0)

error_get_lastRécupère la dernière erreur survenue

Description

array error_get_last ( void )

Récupère la dernière erreur survenue.

Valeurs de retour

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.

Exemples

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
)



error_log

(PHP 4, PHP 5)

error_logStocke un message d'erreur

Description

bool error_log ( string $message [, int $message_type= 0 [, string $destination [, string $extra_headers ]]] )

Envoie un message d'erreur à l'historique du serveur web, à un port TCP ou un fichier.

Liste de paramètres

message

Le message d'erreur qui doit être stocké.

message_type

Spécifie la destination du message d'erreur. Les types possibles de messages sont :

error_log() log types
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.

destination

La destination. Cela dépend du paramètre message_type décrit ci-dessus.

extra_headers

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().

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Historique

Version Description
5.2.7 La valeur possible pour 4 a été ajoutée à message_type .

Exemples

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");
?>



error_reporting

(PHP 4, PHP 5)

error_reportingFixe le niveau de rapport d'erreurs PHP

Description

int error_reporting ([ int $level ] )

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.

Liste de paramètres

level

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.

Valeurs de retour

Retourne l'ancien niveau d'error_reporting.

Historique

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.

Exemples

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);

?>

Notes

Avertissement

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).

Astuce

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.

Voir aussi



restore_error_handler

(PHP 4 >= 4.0.1, PHP 5)

restore_error_handlerRéactive l'ancienne fonction de gestion des erreurs

Description

bool restore_error_handler ( void )

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).

Valeurs de retour

Cette fonction retourne toujours TRUE.

Exemples

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.

Notes

Note: L'appel de la fonction restore_error_handler() depuis la fonction error_handler est ignoré.

Voir aussi



restore_exception_handler

(PHP 5)

restore_exception_handler Réactive l'ancienne fonction de gestion d'exceptions

Description

bool restore_exception_handler ( void )

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).

Valeurs de retour

Cette fonction retourne toujours TRUE.

Exemples

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...

Voir aussi



set_error_handler

(PHP 4 >= 4.0.1, PHP 5)

set_error_handlerSpécifie une fonction utilisateur comme gestionnaire d'erreurs

Description

mixed set_error_handler ( callback $error_handler [, int $error_types= E_ALL | E_STRICT ] )

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é.

Liste de paramètres

error_handler

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 :

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )

errno
Le premier paramètre errno , contient le niveau d'erreur, sous la forme d'un entier.
errstr
Le second paramètre errstr , contient le message d'erreur, sous forme de chaîne.
errfile
Le troisième paramètre, optionnel, errfile , contient le nom du fichier dans lequel l'erreur a été identifiée.
errline
Le quatrième paramètre, optionnel, errline , contient le numéro de ligne à laquelle l'erreur a été identifiée.
errcontext
Le cinquième paramètre, optionnel, errcontext , est un tableau qui pointe sur la table des symboles actifs lors de l'erreur. En d'autres termes, errcontext contient un tableau avec toutes les variables qui existaient lorsque l'erreur a été déclenchée. La fonction de gestion d'erreurs de l'utilisateur ne doit pas modifier le contexte d'erreur.

Si la fonction retourne FALSE, alors le gestion d'erreurs normal continue.

error_types

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.

Valeurs de retour

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.

Historique

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.

Exemples

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(23"foo"5.543.321.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($aM_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 />

Voir aussi



set_exception_handler

(PHP 5)

set_exception_handler Définit une fonction utilisateur de gestion d'exceptions

Description

string set_exception_handler ( callback $exception_handler )

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 .

Liste de paramètres

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.

Valeurs de retour

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.

Exemples

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";
?>

Voir aussi



trigger_error

(PHP 4 >= 4.0.1, PHP 5)

trigger_errorDéclenche une erreur utilisateur

Description

bool trigger_error ( string $error_msg [, int $error_type= E_USER_NOTICE ] )

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.

Liste de paramètres

error_msg

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.

error_type

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.

Valeurs de retour

Cette fonction retourne FALSE si un paramètre incorrect est passé à error_type , TRUE sinon.

Exemples

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);
}
?>

Voir aussi



user_error

(PHP 4, PHP 5)

user_errorAlias de trigger_error()

Description

Cette fonction est un alias de : trigger_error().


Sommaire




Support du format .htaccess pour toutes les SAPI


Introduction

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.).



Installation/Configuration

Sommaire


Pré-requis

PHP version 5.2.0 ou plus récent.



Installation

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



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration htscanner
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.

htscanner.config_file string

Nom du fichier qui contient les configurations.

htscanner.default_docroot string

Racine Web par défaut.

htscanner.default_ttl int

Durée de vie des documents mis en cache, exprimé en secondes.

htscanner.stop_on_error int

Arrêt sur erreur (erreur d'analyse, ou d'affectation d'une directive INI).



Types de ressources

Cette extension ne définit aucune ressource.





Arbre d'inclusions


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

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.



Installation

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



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration inclued
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.

inclued.enabled int

Si oui ou non, inclued est activée.

inclued.dumpdir int

Chemin du dossier qui stocke les fichiers inclued. Si configuré, chaque requête PHP va créer un fichier dans ce dossier.

Attention

Comme chaque requête crée un fichier, ce dossier risque de se remplir très très vite!



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.



Exemples

Sommaire


Exemple qui implémente inclued dans une application

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($fpjson_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




Fonctions inclued


inclued_get_data

(PECL inclued >= 0.1.0)

inclued_get_dataGet the inclued data

Description

array inclued_get_data ( void )

Lit les données incluses.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les données incluses.

Exemples

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
        )
    )
)

Voir aussi


Sommaire




Options PHP et informations PHP


Introduction

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().



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration
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.

assert.active boolean

Active les évaluations de type assert().

assert.bail boolean

Termine le script si une assertion échoue.

assert.warning boolean

Émet une alerte PHP pour chaque assertion qui échoue.

assert.callback string

Fonction définie par le programmeur, à appeler pour chaque assertion échouée.

assert.quiet_eval boolean

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()

enable_dl boolean

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().

max_execution_time entier

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.

max_input_time entier

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.

max_input_nesting_level entier

Définit la profondeur maximale des variables d'entrées (i.e. $_GET, $_POST..)

magic_quotes_gpc boolean
Avertissement

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().

magic_quotes_runtime boolean
Avertissement

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.

zend.enable_gc boolean

Active ou désactive la collecte des références circulaires.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Les constantes listées ici sont toujours disponibles dans PHP.

Constantes prédéfinies de phpcredits()
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.
Constantes de phpinfo()
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().

Constantes d'assert()
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.

Constantes particulières à Windows
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.

Champs du masque Windows
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é.


Fonctions sur les options et les informations de PHP


assert_options

(PHP 4, PHP 5)

assert_optionsFixe et lit différentes options d'assertions

Description

mixed assert_options ( int $what [, mixed $value ] )

assert_options() permet de modifier les diverses options de la fonction assert(), ou simplement connaître la configuration actuelle.

Liste de paramètres

what

Options d'assertions
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

value

Une nouvelle valeur, optionnelle, pour l'option.

Valeurs de retour

Retourne la valeur originale de l'option, ou bien FALSE en cas d'erreur.

Exemples

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';
?>

Voir aussi

  • assert() - Vérifie si une assertion est fausse



assert

(PHP 4, PHP 5)

assertVérifie si une assertion est fausse

Description

bool assert ( mixed $assertion )

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).

Liste de paramètres

assertion

L'assertion.

Valeurs de retour

FALSE si l'assertion est fausse, TRUE sinon.

Exemples

Exemple #1 Gestion des assertions avec un gestionnaire personnalisé

<?php
// Activation des assertions et mise en mode discret
assert_options(ASSERT_ACTIVE1);
assert_options(ASSERT_WARNING0);
assert_options(ASSERT_QUIET_EVAL1);

// 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("")');
?>

Voir aussi



dl

(PHP 4, PHP 5)

dlCharge une extension PHP à la volée

Description

int dl ( string $library )

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()).

Liste de paramètres

library

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

  • Si PHP a été compilé avec l'option --enable-debug ou non
  • Si PHP a été compilé avec le support (expérimental) de ZTS (Zend Thread Safety) ou non
  • de la constante interne ZEND_MODULE_API_NO (version interne de module d'API Zend, qui est en réalité la date à laquelle une modification importante de l'API a été faite, par exemple 20010901)

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.

Valeurs de retour

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.

Exemples

Exemple #1 Exemples avec dl()

<?php
// Chargement pour toutes plates-formes
if (!extension_loaded('sqlite')) {
    if (
strtoupper(substr(PHP_OS03)) === '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);
}
?>

Historique

Version Description
5.3.0 Cette fonction lance maintenant une alerte de type E_DEPRECATED pour tous les SAPI, sauf CLI, CGI et interne.

Notes

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

Voir aussi



extension_loaded

(PHP 4, PHP 5)

extension_loadedDétermine si une extension est chargée ou non

Description

bool extension_loaded ( string $name )

Détermine si une extension est chargée ou non.

Liste de paramètres

name

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]

Valeurs de retour

Retourne TRUE si l'extension name a été chargée, FALSE sinon.

Exemples

Exemple #1 Exemple avec extension_loaded()

<?php
if (!extension_loaded('gd')) {
    if (!
dl('gd.so')) {
        exit;
    }
}
?>

Notes

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 !

Voir aussi



gc_collect_cycles

(PHP 5 >= 5.3.0)

gc_collect_cyclesForce le passage du collecteur de mémoire

Description

int gc_collect_cycles ( void )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Force le passage du collecteur de mémoire.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nombre de cycles collectés.



gc_disable

(PHP 5 >= 5.3.0)

gc_disableDésactive le collecteur de références circulaires

Description

void gc_disable ( void )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Désactive le collecteur de références circulaires.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.



gc_enable

(PHP 5 >= 5.3.0)

gc_enableActive le collecteur de références circulaires

Description

void gc_enable ( void )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Active le collecteur de références circulaires.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.



gc_enabled

(PHP 5 >= 5.3.0)

gc_enabledRetourne le statut du collecteur de références circulaires

Description

bool gc_enabled ( void )
Avertissement

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.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne TRUE so le collecteur est actif, et FALSE sinon.



get_cfg_var

(PHP 4, PHP 5)

get_cfg_varRetourne la valeur d'une option de PHP

Description

string get_cfg_var ( string $option )

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é.

Liste de paramètres

option

Le nom de l'option de configuration.

Valeurs de retour

Retourne la valeur courante de l'option PHP option ou bien FALSE si une erreur survient.

Historique

Version Description
5.3.0 get_cfg_var() a été modifié afin de permettre de retourner un tableau de directives.

Voir aussi

  • ini_get() - Lit la valeur d'une option de configuration
  • ini_get_all() - Lit toutes les valeurs de configuration



get_current_user

(PHP 4, PHP 5)

get_current_userRetourne le nom du possesseur du script courant

Description

string get_current_user ( void )

Retourne le nom du possesseur du script courant.

Valeurs de retour

Retourne le nom de l'utilisateur, sous la forme d'une chaîne de caractères.

Exemples

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

Voir aussi

  • getmyuid() - Retourne l'UID du propriétaire du script actuel
  • getmygid() - Retourne le GID du propriétaire du script
  • getmypid() - Retourne le numéro de processus courant de PHP
  • getmyinode() - Retourne l'inode du script
  • getlastmod() - Retourne la date de dernière modification de la page



get_defined_constants

(PHP 4 >= 4.1.0, PHP 5)

get_defined_constantsRetourne la liste des constantes et leurs valeurs

Description

array get_defined_constants ([ bool $categorize ] )

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().

Liste de paramètres

categorize

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
        )

)

Valeurs de retour

Historique

Version Description
5.0.0 Le paramètre categorize a été ajouté.

Exemples

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
)

Voir aussi



get_extension_funcs

(PHP 4, PHP 5)

get_extension_funcsListe les fonctions d'une extension

Description

array get_extension_funcs ( string $module_name )

Retourne le nom des fonctions définies dans le module module_name .

Liste de paramètres

module_name

Le nom du module.

Note: Ce paramètre doit être en minuscule.

Valeurs de retour

Retourne un tableau contenant toutes les fonctions, ou FALSE si module_name n'est pas une extension valide.

Exemples

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
)

Voir aussi



get_include_path

(PHP 4 >= 4.3.0, PHP 5)

get_include_pathLit la valeur de la directive de configuration include_path

Description

string get_include_path ( void )

Lit la valeur de la directive de configuration include_path.

Valeurs de retour

Retourne le chemin, sous la forme d'une chaîne de caractères.

Exemples

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');
?>

Voir aussi



get_included_files

(PHP 4, PHP 5)

get_included_filesRetourne un tableau avec les noms des fichiers qui sont inclus dans un script

Description

array get_included_files ( void )

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().

Valeurs de retour

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é.

Historique

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().

Exemples

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

Notes

Note: Les fichiers inclus en utilisant la directive de configuration auto_prepend_file ne sont pas listés.

Voir aussi



get_loaded_extensions

(PHP 4, PHP 5)

get_loaded_extensionsRetourne la liste de tous les modules compilés et chargés

Description

array get_loaded_extensions ([ bool $zend_extensions= false ] )

Retourne un tableau contenant les noms de tous les modules compilés et chargés par l'application PHP courante.

Liste de paramètres

zend_extensions

Retourne zend_extensions ou pas, par défaut, vaut FALSE (ne liste pas zend_extensions).

Valeurs de retour

Retourne un tableau indexé des noms de tous les modules.

Historique

Version Description
5.2.4 Le paramètre optionnel zend_extensions a été ajouté

Exemples

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
)

Voir aussi



get_magic_quotes_gpc

(PHP 4, PHP 5)

get_magic_quotes_gpcRetourne la configuration actuelle de l'option magic_quotes_gpc

Description

int get_magic_quotes_gpc ( void )

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.

Valeurs de retour

Retourne 0 si l'option est désactivée, 1 sinon.

Exemples

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')";
?>

Notes

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 à ''.

Voir aussi



get_magic_quotes_runtime

(PHP 4, PHP 5)

get_magic_quotes_runtimeRetourne la configuration actuelle de l'option magic_quotes_runtime

Description

int get_magic_quotes_runtime ( void )

Retourne la configuration actuelle de l'option magic_quotes_runtime.

Valeurs de retour

Retourne 0 si l'option est désactivée, 1 sinon.

Exemples

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);
}
?>

Voir aussi



get_required_files

(PHP 4, PHP 5)

get_required_filesAlias de get_included_files()

Description

Cette fonction est un alias de : get_included_files().



getenv

(PHP 4, PHP 5)

getenvRetourne la valeur d'une variable d'environnement

Description

string getenv ( string $varname )

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.

Liste de paramètres

varname

Le nom de la variable.

Valeurs de retour

Retourne la valeur de la variable d'environnement varname , ou FALSE en cas d'erreur.

Exemples

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'];
?>

Voir aussi



getlastmod

(PHP 4, PHP 5)

getlastmodRetourne la date de dernière modification de la page

Description

int getlastmod ( void )

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().

Valeurs de retour

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.

Exemples

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());
?>

Voir aussi

  • date() - Formate une date/heure locale
  • getmyuid() - Retourne l'UID du propriétaire du script actuel
  • getmygid() - Retourne le GID du propriétaire du script
  • get_current_user() - Retourne le nom du possesseur du script courant
  • getmyinode() - Retourne l'inode du script
  • getmypid() - Retourne le numéro de processus courant de PHP
  • filemtime() - Lit la date de dernière modification du fichier



getmygid

(PHP 4 >= 4.1.0, PHP 5)

getmygidRetourne le GID du propriétaire du script

Description

int getmygid ( void )

Retourne le GID du propriétaire du script.

Valeurs de retour

Retourne le GID du propriétaire du script courant, ou FALSE si une erreur survient.

Voir aussi



getmyinode

(PHP 4, PHP 5)

getmyinodeRetourne l'inode du script

Description

int getmyinode ( void )

Retourne l'inode du script courant.

Valeurs de retour

Retourne l'inode du script courant, sous la forme d'un entier, ou FALSE si une erreur survient.

Voir aussi

  • getmygid() - Retourne le GID du propriétaire du script
  • getmyuid() - Retourne l'UID du propriétaire du script actuel
  • getmypid() - Retourne le numéro de processus courant de PHP
  • get_current_user() - Retourne le nom du possesseur du script courant
  • getlastmod() - Retourne la date de dernière modification de la page



getmypid

(PHP 4, PHP 5)

getmypidRetourne le numéro de processus courant de PHP

Description

int getmypid ( void )

Retourne le numéro de processus courant de PHP.

Valeurs de retour

Retourne le numéro de processus courant de PHP, ou FALSE si une erreur survient.

Notes

Avertissement

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.

Voir aussi



getmyuid

(PHP 4, PHP 5)

getmyuidRetourne l'UID du propriétaire du script actuel

Description

int getmyuid ( void )

Retourne l'UID du propriétaire du script actuel.

Valeurs de retour

Retourne l'identifiant du propriétaire du script actuel (UID) ou FALSE en cas d'erreur.

Voir aussi



getopt

(PHP 4 >= 4.3.0, PHP 5)

getoptLit des options passées dans la ligne de commande

Description

array getopt ( string $options [, array $longopts ] )

getopt() lit les options passées dans la ligne de commande.

Liste de paramètres

options
Chaque caractère dans cette chaîne sera utilisé en tant que caractères optionnels et devra correspondre aux options passées, commençant par un tiret simple (-). Par exemple, une chaîne optionnelle "x" correspondra à l'option -x.
longopts
Un tableau d'options. Chaque élément de ce tableau sera utilisé comme option et devra correspondre aux options passées, commençant par un tiret double (--). Par exemple, un élément longopts "opt" correspondra à l'option --opt.

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 :

  • Caractères individuels (n'accepte pas de valeur)
  • Caractères suivis par un deux-points (le paramètre nécessite une valeur)
  • Caractères suivis par deux deux-points (valeur optionnelle)

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).

Valeurs de retour

Cette fonction retourne un tableau d'options/arguments, ou FALSE si une erreur survient.

Historique

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.

Exemples

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)
}



getrusage

(PHP 4, PHP 5)

getrusageRetourne le niveau d'utilisation des ressources

Description

array getrusage ([ int $who= 0 ] )

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.

Liste de paramètres

who

Si who est égal à 1, getrusage() sera appelé avec le paramètre RUSAGE_CHILDREN.

Valeurs de retour

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.

Exemples

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)
?>

Notes

Note: Cette fonction n'est pas implémentée sous Windows.

Voir aussi

  • La page de manuel getrusage(2) de votre système



ini_alter

(PHP 4, PHP 5)

ini_alterAlias de ini_set()

Description

Cette fonction est un alias de : ini_set().



ini_get_all

(PHP 4 >= 4.2.0, PHP 5)

ini_get_allLit toutes les valeurs de configuration

Description

array ini_get_all ([ string $extension [, bool $details= true ]] )

Lit toutes les valeurs de configuration.

Liste de paramètres

extension

Un nom d'extension, optionnel. S'il est défini, la fonction retournera uniquement les options spécifiques à cette extension.

details

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).

Valeurs de retour

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.

Historique

Version Description
5.3.0 Ajout du paramètre details .

Exemples

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(nullfalse)); // 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
    ...
)

Voir aussi



ini_get

(PHP 4, PHP 5)

ini_getLit la valeur d'une option de configuration

Description

string ini_get ( string $varname )

Retourne la valeur de l'option de configuration varname en cas de succès.

Liste de paramètres

varname

Le nom de l'option de configuration.

Valeurs de retour

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.

Exemples

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

Notes

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.

Voir aussi



ini_restore

(PHP 4, PHP 5)

ini_restoreRestaure la valeur de l'option de configuration

Description

void ini_restore ( string $varname )

Restaure la valeur originale de l'option de configuration varname .

Liste de paramètres

varname

Le nom de l'option de configuration.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec ini_restore()

<?php
$setting 
'y2k_compliance';

echo 
'Valeur courante de \'' $setting '\': ' ini_get($setting), PHP_EOL;

ini_set($settingini_get($setting) ? 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

Voir aussi

  • ini_get() - Lit la valeur d'une option de configuration
  • ini_get_all() - Lit toutes les valeurs de configuration
  • ini_set() - Modifie la valeur d'une option de configuration



ini_set

(PHP 4, PHP 5)

ini_setModifie la valeur d'une option de configuration

Description

string ini_set ( string $varname , string $newvalue )

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.

Liste de paramètres

varname

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.

newvalue

La nouvelle valeur pour l'option.

Valeurs de retour

Retourne l'ancien valeur en cas de succès, FALSE si une erreur survient.

Exemples

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');
?>

Voir aussi



magic_quotes_runtime

(PHP 4, PHP 5)

magic_quotes_runtimeAlias de set_magic_quotes_runtime()

Description

Cette fonction est un alias de : set_magic_quotes_runtime()



main

mainFausse documentation pour main()

Description

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.

Erreurs connues pour diriger sur la page main()
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



memory_get_peak_usage

(PHP 5 >= 5.2.0)

memory_get_peak_usageRetourne la quantité de mémoire allouée par PHP

Description

int memory_get_peak_usage ([ bool $real_usage= false ] )

Retourne la quantité de mémoires, en octets, qui peut être allouée à votre script PHP.

Liste de paramètres

real_usage

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.

Valeurs de retour

Retourne la quantité de mémoire, en octets.

Historique

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é.

Voir aussi



memory_get_usage

(PHP 4 >= 4.3.2, PHP 5)

memory_get_usageIndique la quantité de mémoire utilisée par PHP

Description

int memory_get_usage ([ bool $real_usage= false ] )

Retourne la quantité de mémoire allouée à PHP à cet instant.

Liste de paramètres

real_usage

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.

Valeurs de retour

Retourne la quantité de mémoire, en octets.

Historique

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é.

Exemples

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

?>

Voir aussi



php_ini_loaded_file

(PHP 5 >= 5.2.4)

php_ini_loaded_fileRécupère le chemin d'un fichier php.ini chargé

Description

string php_ini_loaded_file ( void )

Vérifie si un fichier php.ini est chargé, et récupère son chemin.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le chemin du fichier php.ini chargé, ou FALSE si aucun n'a été chargé.

Exemples

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

Voir aussi



php_ini_scanned_files

(PHP 4 >= 4.3.0, PHP 5)

php_ini_scanned_filesRetourne la liste des fichiers .ini analysés dans les dossiers de configuration supplémentaires

Description

string php_ini_scanned_files ( void )

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.

Valeurs de retour

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().

Exemples

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";
        }
    }
}
?>

Voir aussi



php_logo_guid

(PHP 4, PHP 5)

php_logo_guidRetourne l'identifiant du logo PHP

Description

string php_logo_guid ( void )

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.

Valeurs de retour

Retourne PHPE9568F34-D428-11d2-A769-00AA001ACF42.

Exemples

Exemple #1 Exemple avec php_logo_guid()

<?php

echo '<img src="' $_SERVER['PHP_SELF'] .
     
'?=' php_logo_guid() . '" alt="Logo PHP !" />';

?>

Voir aussi



php_sapi_name

(PHP 4 >= 4.0.1, PHP 5)

php_sapi_nameRetourne le type d'interface utilisée entre le serveur web et PHP

Description

string php_sapi_name ( void )

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.

Valeurs de retour

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.

Exemples

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_type03) == 'cgi') {
    echo 
"Vous utilisez CGI PHP\n";
} else {
    echo 
"Vous n'utilisez pas CGI PHP\n";
}
?>

Notes

Note: Une approche alternative
La constante PHP PHP_SAPI a une valeur identique à php_sapi_name().

Astuce

Un comportement inattendu

Le SAPI défini ne doit pas être ambigu, car par exemple, au lieu de apache, il peut être défini à apache2handler ou apache2filter.

Voir aussi



php_uname

(PHP 4 >= 4.0.2, PHP 5)

php_unameRetourne les informations sur le système d'exploitation

Description

string php_uname ([ string $mode= "a" ] )

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.

Liste de paramètres

mode

mode est un seul caractère qui définit quelles seront les informations à retourner :

  • 'a': par défaut, contient tous les modes de la séquence "s n r v m".
  • 's': nom du système d'exploitation. Par exemple, FreeBSD.
  • 'n': nom de l'hôte. Par exemple, localhost.example.com.
  • 'r': nom de la version. Par exemple, 5.1.2-RELEASE.
  • 'v': information sur la version. Varie énormément suivant le système d'exploitation.
  • 'm': type de la machine. Par exemple, i386.

Valeurs de retour

Retourne la description, sous la forme d'une chaîne de caractères.

Exemples

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_OS03)) === '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;      // ;
?>

Voir aussi

  • phpversion() - Retourne le numéro de la version courante de PHP
  • php_sapi_name() - Retourne le type d'interface utilisée entre le serveur web et PHP
  • phpinfo() - Affiche de nombreuses informations sur PHP



phpcredits

(PHP 4, PHP 5)

phpcreditsAffiche les crédits de PHP

Description

bool phpcredits ([ int $flag= CREDITS_ALL ] )

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.

Liste de paramètres

flag

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.

Paramètres prédéfinis de phpcredits()
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

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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>

Voir aussi



phpinfo

(PHP 4, PHP 5)

phpinfoAffiche de nombreuses informations sur PHP

Description

bool phpinfo ([ int $what= INFO_ALL ] )

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).

Liste de paramètres

what

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.

Options de phpinfo()
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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Historique

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.

Exemples

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);

?>

Notes

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.

Voir aussi



phpversion

(PHP 4, PHP 5)

phpversionRetourne le numéro de la version courante de PHP

Description

string phpversion ([ string $extension ] )

Retourne le numéro de la version courante de PHP.

Liste de paramètres

extension

Un nom d'extension, optionnel.

Valeurs de retour

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.

Exemples

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.
}
?>

Notes

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_*.

Voir aussi



putenv

(PHP 4, PHP 5)

putenvFixe la valeur d'une variable d'environnement

Description

bool putenv ( string $setting )

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.

Liste de paramètres

setting

La configuration, comme "FOO=BAR"

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Modification d'une variable d'environnement

<?php
putenv
("UNIQID=$uniqid");
?>

Notes

Avertissement

Ces directives n'ont d'effets que lorsque le safe-mode est activé !

Voir aussi

  • getenv() - Retourne la valeur d'une variable d'environnement



restore_include_path

(PHP 4 >= 4.3.0, PHP 5)

restore_include_pathRestaure la valeur de la directive de configuration include_path

Description

void restore_include_path ( void )

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.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

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

?>

Voir aussi



set_include_path

(PHP 4 >= 4.3.0, PHP 5)

set_include_pathModifie la valeur de la directive de configuration include_path

Description

string set_include_path ( string $new_include_path )

Modifie la valeur de la directive de configuration include_path, pour la durée du script en cours.

Liste de paramètres

new_include_path

La nouvelle valeur pour la directive de configuration include_path

Valeurs de retour

Retourne l'ancienne valeur de include_path en cas de succès, et FALSE si une erreur survient.

Exemples

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);
?>

Voir aussi



set_magic_quotes_runtime

(PHP 4, PHP 5)

set_magic_quotes_runtimeActive/désactive l'option magic_quotes_runtime

Description

bool set_magic_quotes_runtime ( bool $new_setting )

Active/désactive l'option magic_quotes_runtime.

Liste de paramètres

new_setting

0 l'option est désactivée, 1 l'option est activée.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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($fp64), PHP_EOL;

// Avec magic_quotes_runtime
rewind($fp);
set_magic_quotes_runtime(true);

echo 
'Avec magic_quotes_runtime : ' fread($fp64), 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

Voir aussi



set_time_limit

(PHP 4, PHP 5)

set_time_limitFixe le temps maximum d'exécution d'un script

Description

void set_time_limit ( int $seconds )

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.

Liste de paramètres

seconds

Le temps maximal d'exécution, en secondes. S'il vaut 0, aucune limite n'est imposée.

Valeurs de retour

Aucune valeur n'est retournée.

Notes

Avertissement

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.



sys_get_temp_dir

(PHP 5 >= 5.2.1)

sys_get_temp_dirRetourne le chemin du répertoire utilisé pour les fichiers temporaires

Description

string sys_get_temp_dir ( void )

Retourne le chemin du répertoire PHP où sont enregistrés les fichiers temporaires par défaut.

Valeurs de retour

Retourne le chemin du répertoire temporaire.

Exemples

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

Voir aussi



version_compare

(PHP 4 >= 4.1.0, PHP 5)

version_compareCompare deux chaînes de version au format des versions PHP

Description

mixed version_compare ( string $version1 , string $version2 [, string $operator ] )

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.

Liste de paramètres

version1

Premier numéro de version.

version2

Second numéro de version.

operator

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.

Valeurs de retour

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.

Exemples

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";
}
?>

Notes

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).

Voir aussi



zend_logo_guid

(PHP 4, PHP 5)

zend_logo_guidRetourne le logo de Zend

Description

string zend_logo_guid ( void )

zend_logo_guid() retourne l'identifiant pouvant être utilisé pour afficher le logo Zend en utilisant l'image intégrée.

Valeurs de retour

Retourne PHPE9568F35-D428-11d2-A769-00AA001ACF42.

Exemples

Exemple #1 Exemple avec zend_logo_guid()

<?php

echo '<img src="' $_SERVER['PHP_SELF'] .
     
'?=' zend_logo_guid() . '" alt="Zend Logo !" />';

?>

Voir aussi



zend_thread_id

(PHP 5)

zend_thread_idRetourne un identifiant unique du thread courant

Description

int zend_thread_id ( void )

Cette fonction retourne un identifiant unique pour le thread courant.

Valeurs de retour

Retourne l'identifiant du thread, sous la forme d'un entier.

Exemples

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

Notes

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).



zend_version

(PHP 4, PHP 5)

zend_versionLit la version courante du moteur Zend

Description

string zend_version ( void )

Retourne une chaîne contenant le numéro de version du moteur d'analyse Zend actuellement en cours d'utilisation.

Valeurs de retour

Retourne le numéro de la version du moteur Zend, sous la forme d'une chaîne de caractères.

Exemples

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

Voir aussi


Sommaire

  • assert_options — Fixe et lit différentes options d'assertions
  • assert — Vérifie si une assertion est fausse
  • dl — Charge une extension PHP à la volée
  • extension_loaded — Détermine si une extension est chargée ou non
  • gc_collect_cycles — Force le passage du collecteur de mémoire
  • gc_disable — Désactive le collecteur de références circulaires
  • gc_enable — Active le collecteur de références circulaires
  • gc_enabled — Retourne le statut du collecteur de références circulaires
  • get_cfg_var — Retourne la valeur d'une option de PHP
  • get_current_user — Retourne le nom du possesseur du script courant
  • get_defined_constants — Retourne la liste des constantes et leurs valeurs
  • get_extension_funcs — Liste les fonctions d'une extension
  • get_include_path — Lit la valeur de la directive de configuration include_path
  • get_included_files — Retourne un tableau avec les noms des fichiers qui sont inclus dans un script
  • get_loaded_extensions — Retourne la liste de tous les modules compilés et chargés
  • get_magic_quotes_gpc — Retourne la configuration actuelle de l'option magic_quotes_gpc
  • get_magic_quotes_runtime — Retourne la configuration actuelle de l'option magic_quotes_runtime
  • get_required_files — Alias de get_included_files
  • getenv — Retourne la valeur d'une variable d'environnement
  • getlastmod — Retourne la date de dernière modification de la page
  • getmygid — Retourne le GID du propriétaire du script
  • getmyinode — Retourne l'inode du script
  • getmypid — Retourne le numéro de processus courant de PHP
  • getmyuid — Retourne l'UID du propriétaire du script actuel
  • getopt — Lit des options passées dans la ligne de commande
  • getrusage — Retourne le niveau d'utilisation des ressources
  • ini_alter — Alias de ini_set
  • ini_get_all — Lit toutes les valeurs de configuration
  • ini_get — Lit la valeur d'une option de configuration
  • ini_restore — Restaure la valeur de l'option de configuration
  • ini_set — Modifie la valeur d'une option de configuration
  • magic_quotes_runtime — Alias de set_magic_quotes_runtime
  • main — Fausse documentation pour main
  • memory_get_peak_usage — Retourne la quantité de mémoire allouée par PHP
  • memory_get_usage — Indique la quantité de mémoire utilisée par PHP
  • php_ini_loaded_file — Récupère le chemin d'un fichier php.ini chargé
  • php_ini_scanned_files — Retourne la liste des fichiers .ini analysés dans les dossiers de configuration supplémentaires
  • php_logo_guid — Retourne l'identifiant du logo PHP
  • php_sapi_name — Retourne le type d'interface utilisée entre le serveur web et PHP
  • php_uname — Retourne les informations sur le système d'exploitation
  • phpcredits — Affiche les crédits de PHP
  • phpinfo — Affiche de nombreuses informations sur PHP
  • phpversion — Retourne le numéro de la version courante de PHP
  • putenv — Fixe la valeur d'une variable d'environnement
  • restore_include_path — Restaure la valeur de la directive de configuration include_path
  • set_include_path — Modifie la valeur de la directive de configuration include_path
  • set_magic_quotes_runtime — Active/désactive l'option magic_quotes_runtime
  • set_time_limit — Fixe le temps maximum d'exécution d'un script
  • sys_get_temp_dir — Retourne le chemin du répertoire utilisé pour les fichiers temporaires
  • version_compare — Compare deux chaînes de version au format des versions PHP
  • zend_logo_guid — Retourne le logo de Zend
  • zend_thread_id — Retourne un identifiant unique du thread courant
  • zend_version — Lit la version courante du moteur Zend



Memtrack


Introduction

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.

Avertissement

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration Memtrack
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.

memtrack.enabled boolean

Active ou non l'extension. Par défaut, c'est 0, i.e. désactivé.

memtrack.soft_limit int

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.

memtrack.hard_limit int

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.

memtrack.vm_limit int

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).

memtrack.ignore_functions string

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.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Cette extension ne définit aucune constante.



Exemples

Sommaire


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




Surcharge d'objets


Introduction

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.

Avertissement

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.

Avertissement

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Cette extension ne définit aucune constante.



Exemples

Sommaire


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->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->= array($val);
var_dump($o->a[0]->prop);

?>




Fonctions sur la surcharge d'objets


overload

(PHP 4 >= 4.3.0)

overloadActive la couche de contrôle des membres et méthodes

Description

void overload ( string $class_name )

overload() active le contrôle des accesseurs et appels de méthodes pour la classe class_name .

Liste de paramètres

class_name

Le nom de la classe surchargée, sous la forme d'une chaîne de caractères

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Voir un exemple dans la section d'introduction de cette partie.


Sommaire

  • overload — Active la couche de contrôle des membres et méthodes



Bufferisation de sortie


Introduction

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é.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

Il n'y pas d'installation nécessaire pour utiliser ces fonctions, elles font parties du coeur de PHP.



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration des buffers de sortie
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.

output_buffering booléen/entier

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.

output_handler string

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().

implicit_flush booléen

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().



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

Cette extension ne définit aucune constante.



Exemples

Sommaire


Exemples

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).




Fonctions de bufferisation de sortie

Voir aussi

Voir aussi header() et setcookie().


flush

(PHP 4, PHP 5)

flushVide les tampons de sortie

Description

void flush ( void )

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.

Valeurs de retour

Aucune valeur n'est retournée.



ob_clean

(PHP 4 >= 4.2.0, PHP 5)

ob_cleanEfface le tampon de sortie

Description

void ob_clean ( void )

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().

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • ob_flush() - Envoie le tampon de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_end_clean() - Détruit les données du tampon de sortie et éteint la tamporisation de sortie



ob_end_clean

(PHP 4, PHP 5)

ob_end_cleanDétruit les données du tampon de sortie et éteint la tamporisation de sortie

Description

bool ob_end_clean ( void )

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().

Valeurs de retour

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.

Erreurs / Exceptions

Si la fonction échoue, elle génère une note E_NOTICE.

Historique

Version Description
4.2.0 La valeur booléen retournée par la fonction a été ajoutée.

Exemples

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();
?>

Voir aussi



ob_end_flush

(PHP 4, PHP 5)

ob_end_flushEnvoie les données du tampon de sortie et éteint la tamporisation de sortie

Description

bool ob_end_flush ( void )

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.

Valeurs de retour

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).

Erreurs / Exceptions

Si la fonction échoue, elle émet une alerte de type E_NOTICE.

Historique

Version Description
4.2.0 La fonction retourne une valeur booléenne.

Exemples

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());
?>

Voir aussi

  • ob_start() - Enclenche la tamporisation de sortie
  • ob_get_contents() - Retourne le contenu du tampon de sortie
  • ob_get_flush() - Vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation
  • ob_flush() - Envoie le tampon de sortie
  • ob_end_clean() - Détruit les données du tampon de sortie et éteint la tamporisation de sortie



ob_flush

(PHP 4 >= 4.2.0, PHP 5)

ob_flushEnvoie le tampon de sortie

Description

void ob_flush ( void )

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().

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • ob_get_contents() - Retourne le contenu du tampon de sortie
  • ob_clean() - Efface le tampon de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_end_clean() - Détruit les données du tampon de sortie et éteint la tamporisation de sortie



ob_get_clean

(PHP 4 >= 4.3.0, PHP 5)

ob_get_cleanLit le contenu courant du tampon de sortie puis l'efface

Description

string ob_get_clean ( void )

Lit le contenu courant du tampon de sortie puis l'efface.

ob_get_clean() exécute successivement ob_get_contents() et ob_end_clean().

Valeurs de retour

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é.

Exemples

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 !"

Voir aussi



ob_get_contents

(PHP 4, PHP 5)

ob_get_contentsRetourne le contenu du tampon de sortie

Description

string ob_get_contents ( void )

Retourne le contenu du tampon de sortie sans l'effacer.

Valeurs de retour

Retourne le contenu du tampon de sortie sans l'effacer ou FALSE, si la tamporisation de sortie n'est pas activée.

Exemples

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"

Voir aussi



ob_get_flush

(PHP 4 >= 4.3.0, PHP 5)

ob_get_flushVide le tampon, le retourne en tant que chaîne et stoppe la tamporisation

Description

string ob_get_flush ( void )

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.

Valeurs de retour

Retourne le tampon de sortie ou FALSE s'il n'y en a aucun d'actif.

Exemples

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
(
)

Voir aussi

  • ob_end_clean() - Détruit les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_list_handlers() - Liste les gestionnaires d'affichage utilisés



ob_get_length

(PHP 4 >= 4.0.2, PHP 5)

ob_get_lengthRetourne la longueur du contenu du tampon de sortie

Description

int ob_get_length ( void )

Retourne la longueur du contenu du tampon de sortie.

Valeurs de retour

Retourne la longueur du contenu du tampon de sortie si la tamporisation est activée, et FALSE sinon.

Exemples

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

Voir aussi



ob_get_level

(PHP 4 >= 4.2.0, PHP 5)

ob_get_levelRetourne le nombre de niveaux d'imbrications du système de tamporisation de sortie

Description

int ob_get_level ( void )

Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie.

Valeurs de retour

Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie, et zéro s'il n'est pas actif.

Voir aussi



ob_get_status

(PHP 4 >= 4.2.0, PHP 5)

ob_get_statusLit le statut du tampon de sortie

Description

array ob_get_status ([ bool $full_status = FALSE ] )

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.

Liste de paramètres

full_status

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é.

Valeurs de retour

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
)

Résultats simples pour la fonction ob_get_status()
Clé:level
Valeur:Niveau de sortie désiré
Clé:type
Valeur:PHP_OUTPUT_HANDLER_INTERNAL (0) ou PHP_OUTPUT_HANDLER_USER (1)
Clé:status
Valeur:Un parmi PHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) ou PHP_OUTPUT_HANDLER_END (2)
Clé:name
Valeur:Nom du gestionnaire de sortie actif ou ' default output handler' si aucun n'est défini
Clé:del
Valeur:Flag d'effacement tel que défini par ob_start()

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 :

Résultats complets pour la fonction ob_get_status()
Clé:chunk_size
Valeur:Taille telle que définie par la fonction ob_start()
Clé:size
Valeur:...
Clé:blocksize
Valeur:...

Voir aussi

  • ob_get_level() - Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie
  • ob_list_handlers() - Liste les gestionnaires d'affichage utilisés



ob_gzhandler

(PHP 4 >= 4.0.4, PHP 5)

ob_gzhandlerFonction de rappel pour la compression automatique des tampons

Description

string ob_gzhandler ( string $buffer , int $mode )

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.

Liste de paramètres

buffer

mode

Valeurs de retour

Historique

Version Description
4.0.5 Ajout du paramètre mode .

Exemples

Exemple #1 Exemple avec ob_gzhandler()

<?php

ob_start
("ob_gzhandler");

?>
<html>
<body>
<p>Ceci devrait être une page compressée.</p>
</html>
<body>

Notes

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().

Voir aussi

  • ob_start() - Enclenche la tamporisation de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie



ob_implicit_flush

(PHP 4, PHP 5)

ob_implicit_flushActive/désactive l'envoi implicite

Description

void ob_implicit_flush ([ int $flag ] )

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).

Liste de paramètres

flag

TRUE pour activer, FALSE sinon. Vaut par défaut TRUE.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • flush() - Vide les tampons de sortie
  • ob_start() - Enclenche la tamporisation de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie



ob_list_handlers

(PHP 4 >= 4.3.0, PHP 5)

ob_list_handlersListe les gestionnaires d'affichage utilisés

Description

array ob_list_handlers ( void )

Liste les gestionnaires d'affichage utilisés.

Valeurs de retour

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".

Exemples

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
)

Voir aussi

  • ob_end_clean() - Détruit les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_end_flush() - Envoie les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_get_flush() - Vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation
  • ob_start() - Enclenche la tamporisation de sortie



ob_start

(PHP 4, PHP 5)

ob_startEnclenche la tamporisation de sortie

Description

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

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.

Avertissement

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.

Liste de paramètres

output_callback

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.

chunk_size

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.

erase

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).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Historique

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 .

Exemples

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>

Voir aussi



output_add_rewrite_var

(PHP 4 >= 4.3.0, PHP 5)

output_add_rewrite_varAjoute une règle de réécriture d'URL

Description

bool output_add_rewrite_var ( string $name , string $value )

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.

Liste de paramètres

name

Le nom de la variable.

value

La valeur de la variable.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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
)

Voir aussi



output_reset_rewrite_vars

(PHP 4 >= 4.3.0, PHP 5)

output_reset_rewrite_varsAnnule la réécriture d'URL

Description

bool output_reset_rewrite_vars ( void )

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()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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>

Voir aussi


Sommaire

  • flush — Vide les tampons de sortie
  • ob_clean — Efface le tampon de sortie
  • ob_end_clean — Détruit les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_end_flush — Envoie les données du tampon de sortie et éteint la tamporisation de sortie
  • ob_flush — Envoie le tampon de sortie
  • ob_get_clean — Lit le contenu courant du tampon de sortie puis l'efface
  • ob_get_contents — Retourne le contenu du tampon de sortie
  • ob_get_flush — Vide le tampon, le retourne en tant que chaîne et stoppe la tamporisation
  • ob_get_length — Retourne la longueur du contenu du tampon de sortie
  • ob_get_level — Retourne le nombre de niveaux d'imbrications du système de tamporisation de sortie
  • ob_get_status — Lit le statut du tampon de sortie
  • ob_gzhandler — Fonction de rappel pour la compression automatique des tampons
  • ob_implicit_flush — Active/désactive l'envoi implicite
  • ob_list_handlers — Liste les gestionnaires d'affichage utilisés
  • ob_start — Enclenche la tamporisation de sortie
  • output_add_rewrite_var — Ajoute une règle de réécriture d'URL
  • output_reset_rewrite_vars — Annule la réécriture d'URL



runkit


Introduction

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.



Constantes pré-définies

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.

RUNKIT_IMPORT_FUNCTIONS (entier)
runkit_import() marque indiquant que les fonctions normales doivent être importées à partir du fichier spécifié.
RUNKIT_IMPORT_CLASS_METHODS (entier)
runkit_import() marque indiquant que les méthodes de classes doivent être importées à partir du fichier spécifié.
RUNKIT_IMPORT_CLASS_CONSTS (entier)
runkit_import() marque indiquant que les constantes de classes doivent être importées à partir du fichier spécifié. Notez que cette marque est seulement signifiante dans les versions PHP 5.1.0 et supérieures.
RUNKIT_IMPORT_CLASS_PROPS (entier)
runkit_import() marque indiquant que les propriétés standards de classes doivent être importée à partir du fichier spécifié.
RUNKIT_IMPORT_CLASSES (entier)
runkit_import() marque indiquant une opération de bits OU (OR) des constantes RUNKIT_IMPORT_CLASS_*.
RUNKIT_IMPORT_OVERRIDE (entier)
runkit_import() marque indiquant que si n'importe quelles fonctions, méthodes, constantes ou propriétés importées existent, elles doivent être remplacées par leurs nouvelles définitions. Si ce drapeau n'est pas activé, alors toutes définitions importées qui existent déjà seront supprimées.
RUNKIT_ACC_PUBLIC (entier)
Drapeau spécifique à PHP 5 pour runkit_method_add()
RUNKIT_ACC_PROTECTED (entier)
Drapeau spécifique à PHP 5 pour runkit_method_add()
RUNKIT_ACC_PRIVATE (entier)
Drapeau spécifique à PHP 5 pour runkit_method_add()
CLASSKIT_ACC_PUBLIC (entier)
Drapeau spécifique à PHP 5 pour runkit_method_add() Seulement définie lorsque les compatibilités classkit sont activées.
CLASSKIT_ACC_PROTECTED (entier)
Drapeau spécifique à PHP5 pour runkit_method_add() Seulement définie lorsque les compatibilités classkit sont activées.
CLASSKIT_ACC_PRIVATE (entier)
Drapeau spécifique à PHP 5 pour runkit_method_add() Seulement définie lorsque les compatibilités classkit sont activées.
CLASSKIT_AGGREGATE_OVERRIDE (entier)
Drapeau spécifique à PHP 5 pour classkit_import() Seulement définie lorsque les compatibilités classkit sont activées.
RUNKIT_VERSION (chaîne de caractères)
Définie la version courante du paquetage runkit.
CLASSKIT_VERSION (chaîne de caractères)
Définie la version courante du paquetage runkit. Seulement définie lorsque les compatibilités classkit sont activées.


Installation/Configuration

Sommaire


Pré-requis

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.



Installation

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.



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration Runkit
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.

runkit.superglobal string
Liste de noms de variable séparés par des virgules à être traités comme variables superglobales. Cette valeur devrait être fixée dans le fichier du système php.ini, mais devrait fonctionner dans les contextes de configuration par dossier dépendamment de votre SAPI.

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();
?>
runkit.internal_override boolean
Active la possibilité de modifier/renommer/supprimer les fonctions internes.



Types de ressources

Cette extension ne définit aucune ressource.




Fonctions runkit


Runkit_Sandbox

(PECL runkit >= 0.7.0)

Runkit_Sandbox Classe Runkit Sandbox -- Machine Virtuelle PHP

Description

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.

Constructeur

void Runkit_Sandbox::__construct ([ array $options ] )

options est un tableau associatif contenant n'importe quelle combinaison des options ini listées ci-dessous.

safe_mode

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.

safe_mode_gid

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.

safe_mode_include_dir

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

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.

allow_url_fopen

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.

disable_functions

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.

disable_classes

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.

runkit.superglobal

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.

runkit.internal_override

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);
?>

Portée des variables

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)

Appel de Fonctions PHP

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

Modification des Configurations de Sandbox

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.

Configurations Sandbox / Indicateurs de Statut
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.  



Runkit_Sandbox_Parent

(PECL runkit >= 0.7.0)

Runkit_Sandbox_Parent Classe Anti-Sandbox Runkit

Description

void Runkit_Sandbox_Parent::__construct ( void )

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;
?>

Accéder les Variables du Parent

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"

Appel de Fonctions Parentes

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.



runkit_class_adopt

(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é

Description

bool runkit_class_adopt ( string $classname , string $parentname )

Liste de paramètres

classname

Le nom de la classe à adopter

parentname

Classe parente pour laquelle la classe enfant s'étend

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi

  • runkit_class_emancipate() - Convertit une classe héritée à une classe de base, supprime toute méthode pour qui la portée est ancestrale



runkit_class_emancipate

(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

Description

bool runkit_class_emancipate ( string $classname )

Liste de paramètres

classname

Nom de la classe à émanciper

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi

  • runkit_class_adopt() - Convertit une classe de base à une classe héritée, ajoute une méthode ancestrale lorsque approprié



runkit_constant_add

(PECL runkit >= 0.7.0)

runkit_constant_add Similaire à define(), mais permet aussi la définition dans définitions de classe

Description

bool runkit_constant_add ( string $constname , mixed $value )

Liste de paramètres

constname

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.

value

Valeur NULL, Bool, Long, Double, String ou Resource pour enregistrer la nouvelle constante.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_constant_redefine

(PECL runkit >= 0.7.0)

runkit_constant_redefine Redéfinit une constante déjà définie

Description

bool runkit_constant_redefine ( string $constname , mixed $newvalue )

Liste de paramètres

constname

Constante à redéfinir. Soit une chaîne de caractères pour indiquer une constante globale ou classname::constname pour indiquer une constante de classe.

newvalue

Nouvelle valeur à assigner à la constante.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_constant_remove

(PECL runkit >= 0.7.0)

runkit_constant_remove Enlève/Supprime une constante déjà définie

Description

bool runkit_constant_remove ( string $constname )

Liste de paramètres

constname

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_function_add

(PECL runkit >= 0.7.0)

runkit_function_add Ajoute une nouvelle fonction, similaire à create_function()

Description

bool runkit_function_add ( string $funcname , string $arglist , string $code )

Liste de paramètres

funcname

Nom de la fonction à être créé

arglist

Liste d'arguments séparés par des virgules

code

Code qui compose la fonction

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi



runkit_function_copy

(PECL runkit >= 0.7.0)

runkit_function_copy Copie une fonction vers un nom de fonction nouveau

Description

bool runkit_function_copy ( string $funcname , string $targetname )

Liste de paramètres

funcname

Nom de la fonction existante

targetname

Nom de la nouvelle fonction pour copier la définition vers celle-ci

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi



runkit_function_redefine

(PECL runkit >= 0.7.0)

runkit_function_redefine Remplace une définition de fonction avec une nouvelle implémentation

Description

bool runkit_function_redefine ( string $funcname , string $arglist , string $code )

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.

Liste de paramètres

funcname

Nom de la fonction à redéfinir

arglist

Nouvelle liste d'arguments à être acceptés par la fonction

code

Nouvelle implémentation du code

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi



runkit_function_remove

(PECL runkit >= 0.7.0)

runkit_function_remove Enlève une définition de fonction

Description

bool runkit_function_remove ( string $funcname )

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.

Liste de paramètres

funcname

Nom de la fonction à supprimer

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_function_rename

(PECL runkit >= 0.7.0)

runkit_function_rename Change le nom d'une fonction

Description

bool runkit_function_rename ( string $funcname , string $newname )

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.

Liste de paramètres

funcname

Nom de la fonction courante

newname

Nouveau nom de fonction

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_import

(PECL runkit >= 0.7.0)

runkit_import Traite un fichier PHP important fonctions et définitions de classes, écrasement où applicable

Description

bool runkit_import ( string $filename [, int $flags= RUNKIT_IMPORT_CLASS_METHODS ] )

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.

Liste de paramètres

filename

Nom du fichier pour importer les définitions de fonctions et de classe

flags

Comparaison de bits OU (OR) de la famille de constantes RUNKIT_IMPORT_*.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



runkit_lint_file

(PECL runkit >= 0.7.0)

runkit_lint_file Vérifie la syntaxe PHP d'un fichier spécifié

Description

bool runkit_lint_file ( string $filename )

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.

Liste de paramètres

filename

Fichier contenant du code PHP à être vérifié

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_lint

(PECL runkit >= 0.7.0)

runkit_lint Vérifie la syntaxe PHP de code PHP spécifié

Description

bool runkit_lint ( string $code )

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.

Liste de paramètres

code

Code PHP à être vérifié

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



runkit_method_add

(PECL runkit >= 0.7.0)

runkit_method_addAjoute dynamiquement une nouvelle méthode à une classe donnée

Description

bool runkit_method_add ( string $classname , string $methodname , string $args , string $code [, int $flags= RUNKIT_ACC_PUBLIC ] )
Avertissement

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.

Liste de paramètres

classname

La classe dans laquelle la méthode sera ajoutée

methodname

Le nom de la méthode à ajouter

args

Liste des arguments séparés par des virgules pour la nouvelle méthode créée

code

Le code à être évalué lors que methodname est appelé

flags

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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(124);
?>

L'exemple ci-dessus va afficher :

16

Voir aussi



runkit_method_copy

(PECL runkit >= 0.7.0)

runkit_method_copyCopie une méthode d'une classe à une autre

Description

bool runkit_method_copy ( string $dClass , string $dMethod , string $sClass [, string $sMethod ] )
Avertissement

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.

Liste de paramètres

dClass

Classe destination pour la méthode copiée

dMethod

Nom de la méthode de destination

sClass

Classe source pour la méthode à copier

sMethod

Nom de la méthode à copier à partir de la classe source. Si ce paramètre est omis, la valeur de dMethod est utilisée.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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!

Voir aussi



runkit_method_redefine

(PECL runkit >= 0.7.0)

runkit_method_redefineChange dynamiquement le code de la méthode donnée

Description

bool runkit_method_redefine ( string $classname , string $methodname , string $args , string $code [, int $flags= RUNKIT_ACC_PUBLIC ] )

Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).

Avertissement

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.

Liste de paramètres

classname

La classe dans laquelle la méthode sera redéfinie

methodname

Le nom de la méthode à redéfinir

args

Liste d'arguments séparés par des virgules pour la méthode redéfinie

code

Le nouveau code qui sera évalué lorsque methodname sera appelée

flags

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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!

Voir aussi



runkit_method_remove

(PECL runkit >= 0.7.0)

runkit_method_removeSupprime dynamiquement la méthode donnée

Description

bool runkit_method_remove ( string $classname , string $methodname )

Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).

Avertissement

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.

Liste de paramètres

classname

La classe dans laquelle la méthode sera supprimée

methodname

Le nom de la méthode à supprimer

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Voir aussi



runkit_method_rename

(PECL runkit >= 0.7.0)

runkit_method_renameChange dynamiquement le nom de la méthode donnée

Description

bool runkit_method_rename ( string $classname , string $methodname , string $newname )

Note: Cette fonction ne peut être utilisée pour manipuler la méthode en cours d'utilisation (ou chaînée).

Avertissement

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.

Liste de paramètres

classname

La classe dans laquelle la méthode sera renommée

methodname

Le nom de la méthode à renommer

newname

Le nouveau nom à donner à la méthode renommée

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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!

Voir aussi



runkit_return_value_used

(PECL runkit >= 0.8.0)

runkit_return_value_usedDétermine si la valeur de retour des fonctions courantes sera utilisée

Description

bool runkit_return_value_used ( void )

Valeurs de retour

Retourne TRUE si la valeur de retour d'une fonction est utilisée par la portée appelante, FALSE autrement.

Exemples

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)



runkit_sandbox_output_handler

(PECL runkit >= 0.7.0)

runkit_sandbox_output_handler Spécifie une fonction à capturer et/ou traiter la sortie à partir d'un runkit sandbox

Description

mixed runkit_sandbox_output_handler ( object $sandbox [, mixed $callback ] )

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.

Liste de paramètres

sandbox

Instance de la classe Runkit_Sandbox sur laquelle spécifier la gestion des sorties.

callback

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.

Valeurs de retour

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.

Exemples

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.



runkit_superglobals

(PECL runkit >= 0.7.0)

runkit_superglobals Retourne un tableau indexé numériquement des variables superglobales enregistrées

Description

array runkit_superglobals ( void )

Valeurs de retour

Retourne un tableau indexé numériquement des variables superglobales enregistrée actuellement. C'est-à-dire _GET, _POST, _REQUEST, _COOKIE, _SESSION, _SERVER, _ENV, _FILES


Sommaire




Casse l'opérateur de silence


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

PHP version 5.2.0 ou plus récent.



Installation

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



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration de scream
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.

scream.enabled int

Active ou non le module scream.



Types de ressources

Cette extension ne définit aucune ressource.




Exemples

Sommaire


Exemple d'illustration de scream

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.






Manipulation audio


Balises ID3


Introduction

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+.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes prédéfinies

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 :

ID3_V1_0 (entier)
ID3_V1_0 est utilisé si vous travaillez avec des tags ID3 V1.0. Ces tags peuvent contenir les champs title, artist, album, genre, year et comment.
ID3_V1_1 (entier)
ID3_V1_1 est utilisé si vous travaillez avec des tags ID3 V1.1. Ces tags peuvent contenir tous les champs de la version 1.0 ainsi qu'un champ représentant le numéro de la piste.
ID3_V2_1 (entier)
ID3_V2_1 est utilisé si vous travaillez avec des tags ID3 V2.1.
ID3_V2_2 (entier)
ID3_V2_2 est utilisé si vous travaillez avec des tags ID3 V2.2 tags.
ID3_V2_3 (entier)
ID3_V2_3 est utilisé si vous travaillez avec des tags ID3 V2.3 tags.
ID3_V2_4 (entier)
ID3_V2_4 est utilisé si vous travaillez avec des tags ID3 V2.4 tags.
ID3_BEST (entier)
ID3_BEST est utilisé si vous voulez laisser les fonctions id3 déterminer quelle version de tags doit être utilisée.



Fonctions ID3


id3_get_frame_long_name

(PECL id3 >= 0.2)

id3_get_frame_long_nameRécupère le nom long d'un champs ID3v2

Description

string id3_get_frame_long_name ( string $frameId )

id3_get_frame_long_name() retourne le nom long d'un champs ID3v2.

Liste de paramètres

frameId

Une frame ID3v2

Valeurs de retour

Retourne le nom long d'un champs ou FALSE si une erreur survient.

Exemples

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)

Voir aussi



id3_get_frame_short_name

(PECL id3 >= 0.2)

id3_get_frame_short_nameRécupère le nom court d'un champs ID3v2

Description

string id3_get_frame_short_name ( string $frameId )

id3_get_frame_short_name() retourne le nom court d'un champs ID3v2.

Liste de paramètres

frameId

Une frame ID3v2

Valeurs de retour

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().

Exemples

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

Voir aussi



id3_get_genre_id

(PECL id3 >= 0.1)

id3_get_genre_idRécupération d'un id pour un genre

Description

int id3_get_genre_id ( string $genre )

id3_get_genre_id() retourne l'id pour un genre.

Liste de paramètres

genre

Un entier compris entre 0 et 147

Valeurs de retour

L'id du genre ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec id3_get_genre_id()

<?php
$id 
id3_get_genre_id("Alternative");
echo 
$id;
?>

L'exemple ci-dessus va afficher :

20

Voir aussi



id3_get_genre_list

(PECL id3 >= 0.1)

id3_get_genre_listRécupère toutes les valeurs possibles du genre

Description

array id3_get_genre_list ( void )

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.

Valeurs de retour

Retourne un tableau contenant tous les genres possibles qui peuvent être stockés dans une balise ID3.

Exemples

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
)

Voir aussi



id3_get_genre_name

(PECL id3 >= 0.1)

id3_get_genre_nameRécupère le nom pour un id de genre

Description

string id3_get_genre_name ( int $genre_id )

id3_get_genre_name() retourne le nom pour un id de genre spécifié.

Liste de paramètres

genre_id

Un entier, compris entre 0 et 147

Valeurs de retour

Retourne le nom sous la forme d'une chaîne de caractères.

Exemples

Exemple #1 Exemple avec id3_get_genre_name()

<?php
$genre 
id3_get_genre_name(20);
echo 
$genre;
?>

L'exemple ci-dessus va afficher :

Alternative

Voir aussi



id3_get_tag

(PECL id3 >= 0.1)

id3_get_tagRécupère toutes les informations stockées dans un tag ID3

Description

array id3_get_tag ( string $filename [, int $version= ID3_BEST ] )

id3_get_tag() est utilisée pour récupérer toutes les informations stockées dans un tag ID3 d'un fichier spécifique.

Liste de paramètres

filename

Le chemin vers le fichier MP3

Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.

version

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.

Valeurs de retour

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.

Exemples

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
)

Voir aussi



id3_get_version

(PECL id3 >= 0.1)

id3_get_versionRécupère la version d'un tag ID3

Description

int id3_get_version ( string $filename )

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.

Liste de paramètres

filename

Le chemin vers le fichier MP3

Au lieu de passer un nom de fichier, vous pouvez aussi passer un flux de ressource valide.

Valeurs de retour

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.

Exemples

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

Voir aussi



id3_remove_tag

(PECL id3 >= 0.1)

id3_remove_tagEfface un tag ID3

Description

bool id3_remove_tag ( string $filename [, int $version= ID3_V1_0 ] )

id3_remove_tag() est utilisé pour effacer les informations stockées dans un tag ID3.

Liste de paramètres

filename

Le chemin vers le fichier MP3

Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.

version

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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

Notes

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.

Voir aussi



id3_set_tag

(PECL id3 >= 0.1)

id3_set_tagMet à jour les informations stockées dans un tag ID3

Description

bool id3_set_tag ( string $filename , array $tag [, int $version= ID3_V1_0 ] )

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.

Liste de paramètres

filename

Le chemin vers le fichier MP3

Au lieu d'un nom de fichier, vous pouvez également passer une ressource valide.

tag

Un tableau associatif de clés et de valeurs de tags

Les clés suivantes peuvent être utilisées dans le tableau associatif :

Clés 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

version

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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"$dataID3_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

Notes

Note: Actuellement, id3_set_tag() supporte uniquement les versions 1.0 et 1.1.

Voir aussi


Sommaire




KTaglib


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

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.



Installation

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.




Constantes pré-définies

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.

KTaglib_MPEG_Header::Version1 (integer)
La version ID3 est 1.0
KTaglib_MPEG_Header::Version2 (integer)
La version ID3 est 2.0
KTaglib_MPEG_Header::Version2_5 (integer)
La version ID3 est 2.5
KTaglib_ID3v2_AttachedPictureFrame::Other (integer)
Autre type d'image
KTaglib_ID3v2_AttachedPictureFrame::FileIcon (integer)
Image de type "FileIcon"
KTaglib_ID3v2_AttachedPictureFrame::OtherFileIcon (integer)
Image de type "OtherFileIcon"
KTaglib_ID3v2_AttachedPictureFrame::FrontCover (integer)
Image de type "FrontCover"
KTaglib_ID3v2_AttachedPictureFrame::BackCover (integer)
Image de type "BackCover"
KTaglib_ID3v2_AttachedPictureFrame::LeafletPage (integer)
Image de type "LeafletPage"
KTaglib_ID3v2_AttachedPictureFrame::Media (integer)
Image de type "Media"
KTaglib_ID3v2_AttachedPictureFrame::LeadArtist (integer)
Image de type "LeadArtist"
KTaglib_ID3v2_AttachedPictureFrame::Artist (integer)
Image de type "Artist"
KTaglib_ID3v2_AttachedPictureFrame::Conductor (integer)
Image de type "Condutor"
KTaglib_ID3v2_AttachedPictureFrame::Band (integer)
Image de type "Band"
KTaglib_ID3v2_AttachedPictureFrame::Composer (integer)
Image de type "Composer"
KTaglib_ID3v2_AttachedPictureFrame::Lyricist (integer)
Image de type "Lyricist"
KTaglib_ID3v2_AttachedPictureFrame::RecordingLocation (integer)
Image de type "RecordingLocation"
KTaglib_ID3v2_AttachedPictureFrame::DuringRecording (integer)
Image de type "DuringRecording"
KTaglib_ID3v2_AttachedPictureFrame::DuringPerformance (integer)
Image de type "DuringPerformance"
KTaglib_ID3v2_AttachedPictureFrame::MovieScreenCapture (integer)
Image de type "MovieScreenCapture"
KTaglib_ID3v2_AttachedPictureFrame::ColouredFish (integer)
Image de type "ColouredFish"
KTaglib_ID3v2_AttachedPictureFrame::Illustration (integer)
Image de type "Illustration"
KTaglib_ID3v2_AttachedPictureFrame::BandLogo (integer)
Image de type "BandLogo"


La classe KTagLib_MPEG_File

Introduction

Représente un fichier MPEG. Les fichiers MPEG peuvent avoir des tags ID3v1, ID3v2 et des propriétés audio.

Class synopsis

KTagLib_MPEG_File
KTagLib_MPEG_File {
}

KTaglib_MPEG_File::__construct

(0.0.1)

KTaglib_MPEG_File::__constructOuvre un nouveau fichier

Description

KTaglib_MPEG_File::__construct ( string $filename )

Ouvre un nouveau fichier MPEG.

Liste de paramètres

filename

Le fichier à lire.

Exemples

Exemple #1 Ouvre un nouveau fichier MP3 et lit le titre

<?php
$mpeg 
= new KTaglib_MPEG_File('example.mp3');
echo 
$mpeg->getID3v1Tag()->getTitle();
?>



KTaglib_MPEG_File::getAudioProperties

(0.0.1)

KTaglib_MPEG_File::getAudioPropertiesRetourne un objet qui permet l'accès aux propriétés audio

Description

public KTaglib_MPEG_File: KTaglib_MPEG_File::getAudioProperties ( void )

Retourne un objet qui permet l'accès aux propriétés audio d'un fichier MPEG.

Valeurs de retour

Retourne un objet KTaglib_MPEG_AudioProperties ou FALSE si une erreur survient.



KTaglib_MPEG_File::getID3v1Tag

(0.0.1)

KTaglib_MPEG_File::getID3v1TagRetourne un objet représentant un tag ID3v1

Description

public KTaglib_ID3v1_Tag KTaglib_MPEG_File::getID3v1Tag ([ bool $create= false ] )

Retourne un objet représentant un tag ID3v1, qui pourra être utilisé pour récupérer les informations s'y trouvant.

Valeurs de retour

Retourne un objet KTaglib_MPEG_ID3v1Tag ou FALSE s'il n'y a pas de tag ID3v1.



KTaglib_MPEG_File::getID3v2Tag

(0.0.1)

KTaglib_MPEG_File::getID3v2TagRetourne un objet ID3v2

Description

public KTaglib_ID3v2_Tag KTaglib_MPEG_File::getID3v2Tag ([ bool $create= false ] )

Retourne un objet ID3v2 pour le fichier MPEG. S'il n'y a aucun tag ID3v2, une exception KTaglib_TagNotFoundException sera lancée.

Valeurs de retour

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.


Sommaire



La classe KTaglib_MPEG_AudioProperties

Introduction

Représente les propriétés audio d'un fichier MPEG, comme la longueur, le débit ou encore la fréquence.

Classe

KTaglib_MPEG_Audioproperties
KTaglib_MPEG_AudioProperties {
}

KTaglib_MPEG_AudioProperties::getBitrate

(0.0.1)

KTaglib_MPEG_AudioProperties::getBitrateRetourne le débit binaire d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getBitrate ( void )

Retourne le débit binaire d'un fichier MPEG.

Valeurs de retour

Retourne le débit binaire, sous la forme d'un entier.



KTaglib_MPEG_AudioProperties::getChannels

(0.0.1)

KTaglib_MPEG_AudioProperties::getChannelsRetourne le nombre de canaux d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getChannels ( void )

Retourne le nombre de canaux d'un fichier MPEG.

Valeurs de retour

Retourne le nombre de canaux, sous la forme d'un entier.



KTaglib_MPEG_AudioProperties::getLayer

(0.0.1)

KTaglib_MPEG_AudioProperties::getLayerRetourne la couche d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getLayer ( void )

Retourne la couche d'un fichier MPEG (habituellement 2 pour un MP3).

Valeurs de retour

Retourne la couche, sous la forme d'un entier.



KTaglib_MPEG_AudioProperties::getLength

(0.0.1)

KTaglib_MPEG_AudioProperties::getLengthRetourne la taille d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getLength ( void )

Retourne la taille d'un fichier MPEG.

Valeurs de retour

Retourne la taille, sous la forme d'un entier.



KTaglib_MPEG_AudioProperties::getSampleBitrate

(0.0.1)

KTaglib_MPEG_AudioProperties::getSampleBitrateRetourne l'échantillonnage d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getSampleBitrate ( void )

Retourne l'échantillonnage d'un fichier MPEG.

Valeurs de retour

Retourne l'échantillonnage, sous la forme d'un entier.



KTaglib_MPEG_AudioProperties::getVersion

(0.0.1)

KTaglib_MPEG_AudioProperties::getVersionRetourne la version d'un fichier MPEG

Description

public int KTaglib_MPEG_AudioProperties::getVersion ( void )

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).

Valeurs de retour

Retourne la version.



KTaglib_MPEG_AudioProperties::isCopyrighted

(0.0.1)

KTaglib_MPEG_AudioProperties::isCopyrightedRetourne true si le fichier MPEG est sous copyright

Description

public bool KTaglib_MPEG_AudioProperties::isCopyrighted ( void )

Retourne true si le fichier MPEG est sous copyright.

Valeurs de retour

Retourne true si le fichier MPEG est sous copyright.



KTaglib_MPEG_AudioProperties::isOriginal

(0.0.1)

KTaglib_MPEG_AudioProperties::isOriginalRetourne true si le fichier MPEG est marqué comme original

Description

public bool KTaglib_MPEG_AudioProperties::isOriginal ( void )

Retourne true si le fichier MPEG est marqué comme original.

Valeurs de retour

Retourne true si le fichier MPEG est marqué comme original.



KTaglib_MPEG_AudioProperties::isProtectionEnabled

(0.0.1)

KTaglib_MPEG_AudioProperties::isProtectionEnabledRetourne true si une protection est active

Description

public bool KTaglib_MPEG_AudioProperties::isProtectionEnabled ( void )

Retourne true si un méchanisme de protection tel que le DRM est actif pour ce fichier.

Valeurs de retour

Retourne true si un méchanisme de protection tel que le DRM est actif pour ce fichier.


Sommaire



La classe KTaglib_Tag

Introduction

Classe de base pour les tags ID3v1 ou ID3v2.

Class synopsis

KTaglib_Tag
KTaglib_Tag {
}

KTaglib_Tag::getAlbum

(0.0.1)

KTaglib_Tag::getAlbumRetourne le nom de l'album d'un tag ID3

Description

public string KTaglib_Tag::getAlbum ( void )

Retourne le nom de l'album d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le nom de l'album.



KTaglib_Tag::getArtist

(0.0.1)

KTaglib_Tag::getArtistRetourne le nom de l'artiste d'un tag ID3

Description

public string KTaglib_Tag::getArtist ( void )

Retourne le nom de l'artiste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le nom de l'artiste.



KTaglib_Tag::getComment

(0.0.1)

KTaglib_Tag::getCommentRetourne le commentaire d'un tag ID3

Description

public string KTaglib_Tag::getComment ( void )

Retourne le commentaire d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le commentaire.



KTaglib_Tag::getGenre

(0.0.1)

KTaglib_Tag::getGenreRetourne le genre d'un tag ID3

Description

public string KTaglib_Tag::getGenre ( void )

Retourne le genre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le genre.



KTaglib_Tag::getTitle

(0.0.1)

KTaglib_Tag::getTitleRetourne le titre d'un tag ID3

Description

public string KTaglib_Tag::getTitle ( void )

Retourne le titre d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le titre.



KTaglib_Tag::getTrack

(0.0.1)

KTaglib_Tag::getTrackRetourne le numéro de la piste d'un tag ID3

Description

public int KTaglib_Tag::getTrack ( void )

Retourne le numéro de la piste d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne le numéro de la piste, sous la forme d'un entier.



KTaglib_Tag::getYear

(0.0.1)

KTaglib_Tag::getYearRetourne l'année d'un tag ID3

Description

public int KTaglib_Tag::getYear ( void )

Retourne l'année d'un tag ID3. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne l'année, sous la forme d'un entier.



KTaglib_Tag::isEmpty

(0.0.1)

KTaglib_Tag::isEmptyRetourne TRUE si le tag est vide

Description

public bool KTaglib_Tag::isEmpty ( void )

Retourne TRUE si le tag existe mais qu'il est vide. Cette méthode est implémentée pour les tags ID3v1 et ID3v2.

Valeurs de retour

Retourne TRUE si le tag est vide, FALSE sinon.


Sommaire



La classe KTagLib_ID3v2_Tag

Introduction

Représente un tag ID3v2. Elle fournit une liste des frames ID3v2 et peut être utilisée pour ajouter ou effacer des frames.

Classe

KTagLib_ID3v2_Tag
étend KTagLib_Tag {
}

KTaglib_ID3v2_Tag::addFrame

(0.0.1)

KTaglib_ID3v2_Tag::addFrameAjoute une frame à un tag ID3v2

Description

public bool KTaglib_ID3v2_Tag::addFrame ( KTagLib_ID3v2_Frame $frame )

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.

Valeurs de retour

Retourne TRUE en cas de succès, FALSE sinon.



KTaglib_ID3v2_Tag::getFrameList

(0.0.1)

KTaglib_ID3v2_Tag::getFrameListRetourne un tableau de frames ID3v2, associées avec un tag ID3v2

Description

public array KTaglib_ID3v2_Tag::getFrameList ( void )

Retourne un tableau de frames ID3v2, associées au tag ID3v2.

Valeurs de retour

Retourne un tableau d'objets KTaglib_ID3v2_Frame.


Sommaire



La classe KTagLib_ID3v2_Frame

Introduction

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.

Classe

KTagLib_ID3v2_Frame
étend KTagLib_Tag {
}

KTaglib_ID3v2_Frame::getSize

(0.0.1)

KTaglib_ID3v2_Frame::getSizeRetourne la taille de la frame, en octets

Description

public int KTaglib_ID3v2_Frame::getSize ( void )

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.

Valeurs de retour

Retourne la taille de la frame, en octets.



KTaglib_ID3v2_Frame::__toString

(0.0.1)

KTaglib_ID3v2_Frame::__toStringRetourne une chaîne représentant la frame

Description

public string KTaglib_ID3v2_Frame::__toString ( void )

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.

Valeurs de retour

Retourne une chaîne représentant la frame.


Sommaire



La classe KTaglib_ID3v2_AttachedPictureFrame

Introduction

Représente une frame ID3v2 qui peut contenir une image.

Classe

KTaglib_ID3v2_AttachedPictureFrame
étend KTagLib_ID3v2_Frame {
}

KTaglib_ID3v2_AttachedPictureFrame::getDescription

(0.0.1)

KTaglib_ID3v2_AttachedPictureFrame::getDescriptionRetourne une description de l'image contenu dans la frame spécialisée

Description

public string KTaglib_ID3v2_AttachedPictureFrame::getDescription ( void )

Retourne la description attachée à une frame contenant une image, dans une frame ID3v2.x.

Valeurs de retour

Retourne une description de l'image.



KTaglib_ID3v2_AttachedPictureFrame::getMimeType

(0.2.0)

KTaglib_ID3v2_AttachedPictureFrame::getMimeTypeRetourne le type MIME de l'image

Description

public string KTaglib_ID3v2_AttachedPictureFrame::getMimeType ( void )

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.

Valeurs de retour

Retourne le type MIME de l'image.



KTaglib_ID3v2_AttachedPictureFrame::getType

(0.2.0)

KTaglib_ID3v2_AttachedPictureFrame::getTypeRetourne le type d'une image

Description

public int KTaglib_ID3v2_AttachedPictureFrame::getType ( void )

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.

Valeurs de retour

Retourne un entier représentant le type de l'image.



KTaglib_ID3v2_AttachedPictureFrame::savePicture

(0.0.1)

KTaglib_ID3v2_AttachedPictureFrame::savePictureSauvegarde une image dans un fichier

Description

public bool KTaglib_ID3v2_AttachedPictureFrame::savePicture ( string $filename )

Sauvegarde l'image attachée dans un fichier donné.

Valeurs de retour

Retourne TRUE en cas de succès, FALSE sinon.



KTaglib_ID3v2_AttachedPictureFrame::setMimeType

(0.2.0)

KTaglib_ID3v2_AttachedPictureFrame::setMimeTypeDéfinit le type MIME d'une image

Description

public string KTaglib_ID3v2_AttachedPictureFrame::getMimeType ( string $type )

Définit le type MIME d'une image. C'est, en général, "image/png" ou "image/jpeg".



KTaglib_ID3v2_AttachedPictureFrame::setPicture

(0.0.1)

KTaglib_ID3v2_AttachedPictureFrame::setPictureDéfinit le tag image en une image donnée

Description

public void KTaglib_ID3v2_AttachedPictureFrame::setPicture ( string $filename )

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.

Valeurs de retour

Retourne TRUE en cas de succès, FALSE si une erreur survient.



KTaglib_ID3v2_AttachedPictureFrame::setType

(0.2.0)

KTaglib_ID3v2_AttachedPictureFrame::setTypeDéfinit le type de l'image

Description

public void KTaglib_ID3v2_AttachedPictureFrame::setType ( int $type )

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.


Sommaire




OGG/Vorbis


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Cette extension nécessite PHP >= 4.3.0, » libogg >= 1.0, et » libvorbis >= 1.0.



Installation

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



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.

OGG/Vorbis supporte l'encodage PCM dans les formats suivants :
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.


Options de contexte

Options personnalisées OGG/Vorbis
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')


Exemples

Sommaire


Exemples d'utilisation du gestionnaire ogg://

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($fp8192)) {
  
/* 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);
?>





Gestion Audio OpenAL


Introduction

Plate-forme indépendante pour la gestion de l'audio. Requiert la bibliothèque » OpenAL.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

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().




Constantes pré-définies

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.

ALC_FREQUENCY (entier)
Attribut de contexte
ALC_REFRESH (entier)
Attribut de contexte
ALC_SYNC (entier)
Attribut de contexte
AL_FREQUENCY (entier)
Configuration du buffer
AL_BITS (entier)
Configuration du buffer
AL_CHANNELS (entier)
Configuration du buffer
AL_SIZE (entier)
Configuration du buffer
AL_BUFFER (entier)
Configuration de la source/de l'écoute (Entier)
AL_SOURCE_RELATIVE (entier)
Configuration de la source/de l'écoute (Entier)
AL_SOURCE_STATE (entier)
Configuration de la source/de l'écoute (Entier)
AL_PITCH (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_GAIN (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_MIN_GAIN (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_MAX_GAIN (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_MAX_DISTANCE (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_ROLLOFF_FACTOR (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_CONE_OUTER_GAIN (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_CONE_INNER_ANGLE (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_CONE_OUTER_ANGLE (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_REFERENCE_DISTANCE (entier)
Configuration de la source/de l'écoute (Nombre à virgule flottante)
AL_POSITION (entier)
Configuration de la source/de l'écoute (Nombre vectoriel à virgule flottante)
AL_VELOCITY (entier)
Configuration de la source/de l'écoute (Nombre vectoriel à virgule flottante)
AL_DIRECTION (entier)
Configuration de la source/de l'écoute (Nombre vectoriel à virgule flottante)
AL_ORIENTATION (entier)
Configuration de la source/de l'écoute (Nombre vectoriel à virgule flottante)
AL_FORMAT_MONO8 (entier)
Format PCM
AL_FORMAT_MONO16 (entier)
Format PCM
AL_FORMAT_STEREO8 (entier)
Format PCM
AL_FORMAT_STEREO16 (entier)
Format PCM
AL_INITIAL (entier)
État de la Source
AL_PLAYING (entier)
État de la Source
AL_PAUSED (entier)
État de la Source
AL_STOPPED (entier)
État de la Source
AL_LOOPING (entier)
État de la Source
AL_TRUE (entier)
Valeur booléen reconnue par OpenAL
AL_FALSE (entier)
Valeur booléen reconnue par OpenAL


Fonctions OpenAL


openal_buffer_create

(PECL openal >= 0.1.0)

openal_buffer_createGénère un buffer OpenAL

Description

resource openal_buffer_create ( void )

Valeurs de retour

openal_buffer_create() retourne une ressource Open AL(Buffer) ou FALSE en cas d'erreur.

Voir aussi



openal_buffer_data

(PECL openal >= 0.1.0)

openal_buffer_dataCharge un buffer avec des données

Description

bool openal_buffer_data ( resource $buffer , int $format , string $data , int $freq )

Liste de paramètres

buffer

Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).

format

Format du paramètre data , un parmi ceux-là : AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 et AL_FORMAT_STEREO16.

data

Bloc de données binaires audio dans le format spécifié format et freq .

freq

Fréquence des données data , en Hz.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_buffer_destroy

(PECL openal >= 0.1.0)

openal_buffer_destroyDétruit un buffer OpenAL

Description

bool openal_buffer_destroy ( resource $buffer )

Liste de paramètres

buffer

Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_buffer_get

(PECL openal >= 0.1.0)

openal_buffer_getRécupère les propriétés du buffer OpenAL

Description

int openal_buffer_get ( resource $buffer , int $property )

Liste de paramètres

buffer

Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).

property

Une propriété spécifique, une parmi celles-ci : AL_FREQUENCY, AL_BITS, AL_CHANNELS et AL_SIZE.

Valeurs de retour

Retourne une valeur entière appropriée à la demande property ou FALSE en cas d'erreur.

Voir aussi



openal_buffer_loadwav

(PECL openal >= 0.1.0)

openal_buffer_loadwavCharge un fichier .wav dans le buffer

Description

bool openal_buffer_loadwav ( resource $buffer , string $wavfile )

Liste de paramètres

buffer

Une ressource Open AL(Buffer) (précédemment créée par openal_buffer_create()).

wavfile

Chemin vers le fichier .wav sur le système de fichier local.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_context_create

(PECL openal >= 0.1.0)

openal_context_createCrée un contexte de traitement audio

Description

resource openal_context_create ( resource $device )

Liste de paramètres

device

Une ressource Open AL(Device) (précédemment créée par openal_device_open()).

Valeurs de retour

Retourne une ressource Open AL(Context) ou FALSE en cas d'erreur.

Voir aussi



openal_context_current

(PECL openal >= 0.1.0)

openal_context_currentRend courant le contexte spécifié

Description

bool openal_context_current ( resource $context )

Liste de paramètres

context

Une ressource Open AL(Context) (précédemment créée par openal_context_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_context_destroy

(PECL openal >= 0.1.0)

openal_context_destroyDétruit un contexte

Description

bool openal_context_destroy ( resource $context )

Liste de paramètres

context

Une ressource Open AL(Context) (précédemment créée par openal_context_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_context_process

(PECL openal >= 0.1.0)

openal_context_processTraite le contexte spécifié

Description

bool openal_context_process ( resource $context )

Liste de paramètres

context

Une ressource Open AL(Context) (précédemment créée par openal_context_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_context_suspend

(PECL openal >= 0.1.0)

openal_context_suspendSuspend le contexte spécifié

Description

bool openal_context_suspend ( resource $context )

Liste de paramètres

context

Une ressource Open AL(Context) (précédemment créée par openal_context_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_device_close

(PECL openal >= 0.1.0)

openal_device_closeFerme un périphérique OpenAL

Description

bool openal_device_close ( resource $device )

Liste de paramètres

device

Une ressource Open AL(Device) (précédemment créée par openal_device_open()) à fermer.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_device_open

(PECL openal >= 0.1.0)

openal_device_openInitialise une interface audio OpenAL

Description

resource openal_device_open ([ string $device_desc ] )

Liste de paramètres

device_desc

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é.

Valeurs de retour

Retourne une ressource Open AL(Device) ou FALSE en cas d'erreur.

Voir aussi



openal_listener_get

(PECL openal >= 0.1.0)

openal_listener_getRécupère une propriété d'auditeur

Description

mixed openal_listener_get ( int $property )

Liste de paramètres

property

La propriété à récupérer, 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)).

Valeurs de retour

Retourne un nombre décimal ou un tableau de nombres à virgule flottante ou FALSE en cas d'erreur.

Voir aussi



openal_listener_set

(PECL openal >= 0.1.0)

openal_listener_setDéfinie une propriété d'auditeur

Description

bool openal_listener_set ( int $property , mixed $setting )

Liste de paramètres

property

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)).

setting

La valeur à définir, soit un nombre décimal, soit un tableau de nombres à virgule flottante appropriés.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_create

(PECL openal >= 0.1.0)

openal_source_createGénère une ressource de source

Description

resource openal_source_create ( void )

Valeurs de retour

Retourne une ressource Open AL(Source) ou FALSE en cas d'erreur.

Voir aussi



openal_source_destroy

(PECL openal >= 0.1.0)

openal_source_destroyDétruit une ressource de source

Description

bool openal_source_destroy ( resource $source )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_get

(PECL openal >= 0.1.0)

openal_source_getRécupère une propriété de source OpenAL

Description

mixed openal_source_get ( resource $source , int $property )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

property

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)).

Valeurs de retour

Retourne le type associé avec la propriété récupérée ou FALSE en cas d'erreur.

Voir aussi



openal_source_pause

(PECL openal >= 0.1.0)

openal_source_pauseMarque une pause dans la source

Description

bool openal_source_pause ( resource $source )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée avec openal_source_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_play

(PECL openal >= 0.1.0)

openal_source_playDémarre la lecture de la source

Description

bool openal_source_play ( resource $source )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_rewind

(PECL openal >= 0.1.0)

openal_source_rewindRevient en arrière dans la source

Description

bool openal_source_rewind ( resource $source )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_set

(PECL openal >= 0.1.0)

openal_source_setDéfinie une propriété de la source

Description

bool openal_source_set ( resource $source , int $property , mixed $setting )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

property

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)).

setting

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_source_stop

(PECL openal >= 0.1.0)

openal_source_stopArrête la lecture de la source

Description

bool openal_source_stop ( resource $source )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



openal_stream

(PECL openal >= 0.1.0)

openal_streamDémarre le streaming d'une source

Description

resource openal_stream ( resource $source , int $format , int $rate )

Liste de paramètres

source

Une ressource Open AL(Source) (précédemment créée par openal_source_create()).

format

Le format du paramètre data , un parmi ceux-là : AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8 et AL_FORMAT_STEREO16.

rate

La fréquence des données à streamer, en Hz.

Valeurs de retour

Retourne une ressource de streaming ou FALSE en cas d'erreur.

Voir aussi


Sommaire





Services d'identification


Kerberos V


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension définit un gestionnaire KADM5 retourné par la fonction kadm5_init_with_password().




Constantes pré-définies

Sommaire

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.


Constantes pour les attributs des balises

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 :

Attributs à utiliser par KDC
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



Constantes pour les options

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 :

Options pour créer/modifier/récupérer des éléments principaux
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.




Exemples

Sommaire


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);
?>




Fonctions KADM5


kadm5_chpass_principal

(PECL kadm5 >= 0.2.3)

kadm5_chpass_principalModifie le mot de passe du principal

Description

bool kadm5_chpass_principal ( resource $handle , string $principal , string $password )

kadm5_chpass_principal() définit un nouveau mot de passe password pour le principal .

Liste de paramètres

handle

Un gestionnaire KADM5.

principal

Le principal.

password

Le nouveau mot de passe.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>



kadm5_create_principal

(PECL kadm5 >= 0.2.3)

kadm5_create_principalCrée un principal kerberos avec les paramètres donnés

Description

bool kadm5_create_principal ( resource $handle , string $principal [, string $password [, array $options ]] )

kadm5_create_principal() crée un principal avec le mot de passe password donné.

Liste de paramètres

handle

Un gestionnaire KADM5.

principal

Le principal.

password

Si password n'est pas spécifié ou s'il vaut NULL, une clé aléatoire sera générée.

options

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>

Voir aussi



kadm5_delete_principal

(PECL kadm5 >= 0.2.3)

kadm5_delete_principalEfface un principal kerberos

Description

bool kadm5_delete_principal ( resource $handle , string $principal )

Efface un principal depuis la base de données Kerberos.

Liste de paramètres

handle

Un gestionnaire KADM5.

principal

Le principal à effacer.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>

Voir aussi



kadm5_destroy

(PECL kadm5 >= 0.2.3)

kadm5_destroyFerme la connexion avec le serveur d'administration et libère toutes les ressources associées

Description

bool kadm5_destroy ( resource $handle )

Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées.

Liste de paramètres

handle

Un gestionnaire KADM5.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



kadm5_flush

(PECL kadm5 >= 0.2.3)

kadm5_flushValide toutes les modifications de la base de données Kerberos

Description

bool kadm5_flush ( resource $handle )

Valide toutes les modifications de la base de données Kerberos, et quitte la connexion ouverte du serveur d'administration Kerberos

Liste de paramètres

handle

Un gestionnaire KADM5.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



kadm5_get_policies

(PECL kadm5 >= 0.2.3)

kadm5_get_policiesRécupère toutes les directives depuis la base de données Kerberos

Description

array kadm5_get_policies ( resource $handle )

Récupère un tableau contenant tous les noms des directives.

Liste de paramètres

handle

Un gestionnaire KADM5.

Valeurs de retour

Retourne un tableau de directives en cas de succès, ou FALSE si une erreur survient.

Exemples

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);
?>



kadm5_get_principal

(PECL kadm5 >= 0.2.3)

kadm5_get_principalRécupère les entrées des éléments principaux depuis la base de données Kerberos

Description

array kadm5_get_principal ( resource $handle , string $principal )

Récupère les entrées des éléments principaux depuis la base de données Kerberos.

Liste de paramètres

handle

Un gestionnaire KADM5.

principal

Le principal.

Valeurs de retour

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.

Exemples

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);
?>

Voir aussi



kadm5_get_principals

(PECL kadm5 >= 0.2.3)

kadm5_get_principalsRécupère tous les éléments principaux depuis la base de données Kerberos

Description

array kadm5_get_principals ( resource $handle )

kadm5_get_principals() retourne un tableau contenant tous les noms des éléments principaux.

Liste de paramètres

handle

A KADM5 handle.

Valeurs de retour

Retourne un tableau d'éléments principaux en cas de succès, ou FALSE si une erreur survient.

Exemples

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);
?>

Voir aussi

  • kadm5_get_principal() - Récupère les entrées des éléments principaux depuis la base de données Kerberos



kadm5_init_with_password

(PECL kadm5 >= 0.2.3)

kadm5_init_with_passwordOuvre une connexion à la bibliothèque KADM5

Description

resource kadm5_init_with_password ( string $admin_server , string $realm , string $principal , string $password )

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 .

Liste de paramètres

admin_server

Le serveur.

realm

Définit le domaine d'identification pour la connexion.

principal

Le principal.

password

Si password est omis ou s'il vaut NULL, une clé aléatoire sera générée.

Valeurs de retour

Retourne un gestionnaire KADM5 en cas de succès, ou FALSE si une erreur survient.

Exemples

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);
?>

Notes

Note: La connexion doit être close après l'avoir utilisée avec la fonction kadm5_destroy().

Voir aussi

  • kadm5_destroy() - Ferme la connexion avec le serveur d'administration et libère toutes les ressources associées



kadm5_modify_principal

(PECL kadm5 >= 0.2.3)

kadm5_modify_principalModifie un principal Kerberos avec les paramètres donnés

Description

bool kadm5_modify_principal ( resource $handle , string $principal , array $options )

Modifie un principal Kerberos avec les paramètres donnés

Liste de paramètres

handle

Un gestionnaire KADM5.

principal

Le principal.

options

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.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

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);
?>

Voir aussi


Sommaire




Radius


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

Comment installer le paquetage ?

  • Décompresser le paquetage (habituellement dans php4/ext)
  • Renommer radius-x.x en radius
  • Exécuter ./buildconf dans php4
  • Exécuter ./configure --enable-radius
  • make; make install

ou, si vous voulez l'avoir en .so :

  • Décompresser le paquetage
  • Exécuter phpize dans le dossier radius-x.x
  • Exécuter ./configure dans le dossier radius-x.x
  • make; make install

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.

RADIUS_ACCESS_REQUEST ()
Demande d'identification
RADIUS_ACCESS_ACCEPT ()
Accès accepté
RADIUS_ACCESS_REJECT ()
Accès rejeté
RADIUS_ACCOUNTING_REQUEST ()
Demande de compte
RADIUS_ACCOUNTING_RESPONSE ()
Réponse du compte
RADIUS_ACCESS_CHALLENGE ()
Défi d'accès
RADIUS_USER_NAME (chaîne de caractères)
Nom d'utilisateur
RADIUS_USER_PASSWORD (chaîne de caractères)
Mot de passe
RADIUS_CHAP_PASSWORD (chaîne de caractères)
Chap Password: chappass = md5(ident + plaintextpass + challenge)
RADIUS_NAS_IP_ADDRESS (chaîne de caractères)
Adresse IP NAS
RADIUS_NAS_PORT (entier)
Port NAS
RADIUS_SERVICE_TYPE (entier)

Type de service :

  • RADIUS_LOGIN
  • RADIUS_FRAMED
  • RADIUS_CALLBACK_LOGIN
  • RADIUS_CALLBACK_FRAMED
  • RADIUS_OUTBOUND
  • RADIUS_ADMINISTRATIVE
  • RADIUS_NAS_PROMPT
  • RADIUS_AUTHENTICATE_ONLY
  • RADIUS_CALLBACK_NAS_PROMPT

RADIUS_FRAMED_PROTOCOL (entier)

Protocole encadré :

  • RADIUS_PPP
  • RADIUS_SLIP
  • RADIUS_ARAP
  • RADIUS_GANDALF
  • RADIUS_XYLOGICS

RADIUS_FRAMED_IP_ADDRESS (chaîne de caractères)
Adresse IP
RADIUS_FRAMED_IP_NETMASK (chaîne de caractères)
Netmasque
RADIUS_FRAMED_ROUTING (entier)
Routing
RADIUS_FILTER_ID (chaîne de caractères)
Identifiant de filtre
RADIUS_FRAMED_MTU (entier)
MTU
RADIUS_FRAMED_COMPRESSION (entier)

Compression :

  • RADIUS_COMP_NONE
  • RADIUS_COMP_VJ
  • RADIUS_COMP_IPXHDR

RADIUS_LOGIN_IP_HOST (chaîne de caractères)
Login IP Host
RADIUS_LOGIN_SERVICE (entier)
Login Service
RADIUS_LOGIN_TCP_PORT (entier)
Login TCP Port
RADIUS_REPLY_MESSAGE (chaîne de caractères)
Message de réponse
RADIUS_CALLBACK_NUMBER (chaîne de caractères)
Numéro de Callback
RADIUS_CALLBACK_ID (chaîne de caractères)
ID de Callback
RADIUS_FRAMED_ROUTE (chaîne de caractères)
Framed Route
RADIUS_FRAMED_IPX_NETWORK (chaîne de caractères)
Framed IPX Network
RADIUS_STATE (chaîne de caractères)
Statut
RADIUS_CLASS (entier)
Classe
RADIUS_VENDOR_SPECIFIC (entier)
Attribut spécifique au vendeur
RADIUS_SESSION_TIMEOUT (entier)
Timeout de la session
RADIUS_IDLE_TIMEOUT (entier)
Durée d'expiration
RADIUS_TERMINATION_ACTION (entier)
Action de termination
RADIUS_CALLED_STATION_ID (entier)
Called Station Id
RADIUS_CALLING_STATION_ID (chaîne de caractères)
Calling Station Id
RADIUS_NAS_IDENTIFIER (entier)
NAS ID
RADIUS_PROXY_STATE (entier)
Proxy State
RADIUS_LOGIN_LAT_SERVICE (entier)
Login LAT Service
RADIUS_LOGIN_LAT_NODE (entier)
Login LAT Node
RADIUS_LOGIN_LAT_GROUP (entier)
Login LAT Group
RADIUS_FRAMED_APPLETALK_LINK (entier)
Framed Appletalk Link
RADIUS_FRAMED_APPLETALK_NETWORK (entier)
Framed Appletalk Network
RADIUS_FRAMED_APPLETALK_ZONE (entier)
Framed Appletalk Zone
RADIUS_CHAP_CHALLENGE (chaîne de caractères)
Challenge
RADIUS_NAS_PORT_TYPE (entier)

Type du port NAS :

  • RADIUS_ASYNC
  • RADIUS_SYNC
  • RADIUS_ISDN_SYNC
  • RADIUS_ISDN_ASYNC_V120
  • RADIUS_ISDN_ASYNC_V110
  • RADIUS_VIRTUAL
  • RADIUS_PIAFS
  • RADIUS_HDLC_CLEAR_CHANNEL
  • RADIUS_X_25
  • RADIUS_X_75
  • RADIUS_G_3_FAX
  • RADIUS_SDSL
  • RADIUS_ADSL_CAP
  • RADIUS_ADSL_DMT
  • RADIUS_IDSL
  • RADIUS_ETHERNET
  • RADIUS_XDSL
  • RADIUS_CABLE
  • RADIUS_WIRELESS_OTHER
  • RADIUS_WIRELESS_IEEE_802_11

RADIUS_PORT_LIMIT (entier)
Port Limit
RADIUS_LOGIN_LAT_PORT (entier)
Login LAT Port
RADIUS_CONNECT_INFO (chaîne de caractères)
Connect info
RADIUS_ACCT_STATUS_TYPE (entier)

Type de statut du compte :

  • RADIUS_START
  • RADIUS_STOP
  • RADIUS_ACCOUNTING_ON
  • RADIUS_ACCOUNTING_OFF

RADIUS_ACCT_DELAY_TIME (entier)
Accounting delay time
RADIUS_ACCT_INPUT_OCTETS (entier)
Accounting input bytes
RADIUS_ACCT_OUTPUT_OCTETS (entier)
Accounting output bytes
RADIUS_ACCT_SESSION_ID (entier)
Accounting session ID
RADIUS_ACCT_AUTHENTIC (entier)

Accounting authentic, un parmi :

  • RADIUS_AUTH_RADIUS
  • RADIUS_AUTH_LOCAL
  • RADIUS_AUTH_REMOTE

RADIUS_ACCT_SESSION_TIME (entier)
Accounting session time
RADIUS_ACCT_INPUT_PACKETS (entier)
Accounting input packets
RADIUS_ACCT_OUTPUT_PACKETS (entier)
Accounting output packets
RADIUS_ACCT_TERMINATE_CAUSE (entier)

Accounting terminate cause, un parmi :

  • RADIUS_TERM_USER_REQUEST
  • RADIUS_TERM_LOST_CARRIER
  • RADIUS_TERM_LOST_SERVICE
  • RADIUS_TERM_IDLE_TIMEOUT
  • RADIUS_TERM_SESSION_TIMEOUT
  • RADIUS_TERM_ADMIN_RESET
  • RADIUS_TERM_ADMIN_REBOOT
  • RADIUS_TERM_PORT_ERROR
  • RADIUS_TERM_NAS_ERROR
  • RADIUS_TERM_NAS_REQUEST
  • RADIUS_TERM_NAS_REBOOT
  • RADIUS_TERM_PORT_UNNEEDED
  • RADIUS_TERM_PORT_PREEMPTED
  • RADIUS_TERM_PORT_SUSPENDED
  • RADIUS_TERM_SERVICE_UNAVAILABLE
  • RADIUS_TERM_CALLBACK
  • RADIUS_TERM_USER_ERROR
  • RADIUS_TERM_HOST_REQUEST

RADIUS_ACCT_MULTI_SESSION_ID (chaîne de caractères)
Accounting multisession ID
RADIUS_ACCT_LINK_COUNT (entier)
Accounting link count
RADIUS_VENDOR_MICROSOFT (entier)

Attributs spécifiques à Microsoft (» RFC 2548) :

  • RADIUS_MICROSOFT_MS_CHAP_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP_ERROR
  • RADIUS_MICROSOFT_MS_CHAP_PW_1
  • RADIUS_MICROSOFT_MS_CHAP_PW_2
  • RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW
  • RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY
  • RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES
  • RADIUS_MICROSOFT_MS_RAS_VENDOR
  • RADIUS_MICROSOFT_MS_CHAP_DOMAIN
  • RADIUS_MICROSOFT_MS_CHAP_CHALLENGE
  • RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS
  • RADIUS_MICROSOFT_MS_BAP_USAGE
  • RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD
  • RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT
  • RADIUS_MICROSOFT_MS_MPPE_SEND_KEY
  • RADIUS_MICROSOFT_MS_MPPE_RECV_KEY
  • RADIUS_MICROSOFT_MS_RAS_VERSION
  • RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD
  • RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON
  • RADIUS_MICROSOFT_MS_FILTER
  • RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE
  • RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE
  • RADIUS_MICROSOFT_MS_CHAP2_RESPONSE
  • RADIUS_MICROSOFT_MS_CHAP2_SUCCESS
  • RADIUS_MICROSOFT_MS_CHAP2_PW
  • RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER
  • RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER
  • RADIUS_MICROSOFT_MS_ARAP_CHALLENGE



Exemples

Comment commencer ?

  • récupérez une ressource radius
  • configurez la bibliothèque
  • créez la requête
  • ajoutez les attributs
  • envoyez la requête
  • récupérer les attributs
  • fermez la ressource radius (optionnel)

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.



Fonctions Radius

Contact

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.


radius_acct_open

(PECL radius >= 1.1.0)

radius_acct_openCrée une ressource Radius pour les comptes

Description

resource radius_acct_open ( void )

Valeurs de retour

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.

Exemples

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");
?>



radius_add_server

(PECL radius >= 1.1.0)

radius_add_serverAjoute un serveur

Description

bool radius_add_server ( resource $radius_handle , string $hostname , int $port , string $secret , int $timeout , int $max_tries )

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.

Liste de paramètres

radius_handle

hostname

Le paramètre hostname spécifie l'hôte serveur, soit en tant que nom de domaine qualifié, soit en tant qu'adresse IP.

port

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.

secret

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é.

timeout

Le délai limite pour recevoir les réponses du serveur est passé au paramètre timeout , sous la forme de seconde.

max_tries

Le nombre maximal de requêtes répétées à faire avant d'échouer.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_add_server()

<?php
if (!radius_add_server($res'radius.example.com'1812'testing123'33)) {
    echo 
'Erreur Radius :' radius_strerror($res). "\n<br>";
    exit;
}
?>

Voir aussi

  • radius_config() - Demande à la bibliothèque de lire un fichier de configuration donné



radius_auth_open

(PECL radius >= 1.1.0)

radius_auth_openCrée une ressource Radius pour l'identification

Description

resource radius_auth_open ( void )

Valeurs de retour

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.

Exemples

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";
?>



radius_close

(PECL radius >= 1.1.0)

radius_closeLibère toutes les ressources Radius

Description

bool radius_close ( resource $radius_handle )

Il n'est pas nécessaire d'appeler cette fonction car PHP libère toutes les ressources à la fin de chaque demande.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



radius_config

(PECL radius >= 1.1.0)

radius_configDemande à la bibliothèque de lire un fichier de configuration donné

Description

bool radius_config ( resource $radius_handle , string $file )

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.

Liste de paramètres

radius_handle

file

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().

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



radius_create_request

(PECL radius >= 1.1.0)

radius_create_requestCrée une demande de compte ou d'identification

Description

bool radius_create_request ( resource $radius_handle , int $type )

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 !

Liste de paramètres

radius_handle

type

Le type est RADIUS_ACCESS_REQUEST ou RADIUS_ACCOUNTING_REQUEST.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_create_request()

<?php
if (!radius_create_request($resRADIUS_ACCESS_REQUEST)) {
    echo 
'Erreur Radius :' radius_strerror($res). "\n<br />";
    exit;
}
?>

Voir aussi



radius_cvt_addr

(PECL radius >= 1.1.0)

radius_cvt_addrConvertit des données brutes en adresse IP

Description

string radius_cvt_addr ( string $data )

Exemples

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;
    }
}
?>

Voir aussi



radius_cvt_int

(PECL radius >= 1.1.0)

radius_cvt_intConvertit des données brutes en entier

Description

int radius_cvt_int ( string $data )

Exemples

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;
    }
}
?>

Voir aussi



radius_cvt_string

(PECL radius >= 1.1.0)

radius_cvt_stringConvertit des données brutes en chaîne de caractères

Description

string radius_cvt_string ( string $data )

Exemples

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;
    }
}
?>

Voir aussi



radius_demangle_mppe_key

(PECL radius >= 1.2.0)

radius_demangle_mppe_keyDérive les clés mppe depuis des données

Description

string radius_demangle_mppe_key ( resource $radius_handle , string $mangled )

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.

Valeurs de retour

Retourne la chaîne ou FALSE si une erreur survient.



radius_demangle

(PECL radius >= 1.2.0)

radius_demangleAssèche des données

Description

string radius_demangle ( resource $radius_handle , string $mangled )

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.

Valeurs de retour

Retourne la chaîne "asséchées" ou FALSE si une erreur survient.



radius_get_attr

(PECL radius >= 1.1.0)

radius_get_attrExtrait un attribut

Description

mixed radius_get_attr ( resource $radius_handle )

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.

Valeurs de retour

Retourne un tableau associatif contenant le type de l'attribut ainsi que les données ou un numéro d'erreur <= 0.

Exemples

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"$attrstrlen($data), bin2hex($data));
}
?>

Voir aussi



radius_get_vendor_attr

(PECL radius >= 1.1.0)

radius_get_vendor_attrExtrait un attribut spécifique au vendeur

Description

array radius_get_vendor_attr ( string $data )

Si radius_get_attr() retourne RADIUS_VENDOR_SPECIFIC, radius_get_vendor_attr() peut être appelé pour déterminer le vendeur.

Valeurs de retour

Retourne un tableau associatif contenant le type de l'attribut, le vendeur ainsi que les données, ou FALSE si une erreur survient.

Exemples

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"$attrstrlen($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"$attrvstrlen($datav), bin2hex($datav));
        }

    }
}
?>

Voir aussi



radius_put_addr

(PECL radius >= 1.1.0)

radius_put_addrAttache une adresse IP en tant qu'attribut

Description

bool radius_put_addr ( resource $radius_handle , int $type , string $addr )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



radius_put_attr

(PECL radius >= 1.1.0)

radius_put_attrAttache un attribut binaire

Description

bool radius_put_attr ( resource $radius_handle , int $type , string $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_put_attr()

<?php
mt_srand
(time());
$chall mt_rand();
$chapval md5(pack('Ca*','sepp' $chall));
$pass pack('CH*'1$chapval);
if (!
radius_put_attr($resRADIUS_CHAP_PASSWORD$pass)) {
    echo 
'Erreur Radius :' radius_strerror($res). "\n<br />";
    exit;
}
?>

Voir aussi



radius_put_int

(PECL radius >= 1.1.0)

radius_put_intAttache un attribut entier

Description

bool radius_put_int ( resource $radius_handle , int $type , int $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_put_int()

<?php
if (!radius_put_int($resRAD_FRAMED_PROTOCOLRAD_PPP)) {
   echo 
'Erreur Radius :' radius_strerror($res). "\n<br />";
   exit;
}
?>

Voir aussi



radius_put_string

(PECL radius >= 1.1.0)

radius_put_stringAttache un attribut chaîne de caractères

Description

bool radius_put_string ( resource $radius_handle , int $type , string $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_put_string()

<?php
if (!radius_put_string($resRADIUS_USER_NAME'billy')) {
    echo 
'Erreur Radius :' radius_strerror($res). "\n<br />";
    exit;
}
?>

Voir aussi



radius_put_vendor_addr

(PECL radius >= 1.1.0)

radius_put_vendor_addrAttache un attribut IP-Address spécifique à un vendeur

Description

bool radius_put_vendor_addr ( resource $radius_handle , int $vendor , int $type , string $addr )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.



radius_put_vendor_attr

(PECL radius >= 1.1.0)

radius_put_vendor_attrAttache un attribut binaire à un vendeur spécifique

Description

bool radius_put_vendor_attr ( resource $radius_handle , int $vendor , int $type , string $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec radius_put_vendor_attr()

<?php
if (!radius_put_vendor_attr($resRADIUS_VENDOR_MICROSOFTRAD_MICROSOFT_MS_CHAP_CHALLENGE$challenge)) {
    echo 
'Erreur Radius :' radius_strerror($res). "\n<br />";
    exit;
}
?>

Voir aussi



radius_put_vendor_int

(PECL radius >= 1.1.0)

radius_put_vendor_intAttache un attribut entier à un vendeur spécifique

Description

bool radius_put_vendor_int ( resource $radius_handle , int $vendor , int $type , int $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



radius_put_vendor_string

(PECL radius >= 1.1.0)

radius_put_vendor_stringAttache un attribut sous la forme d'une chaîne à un vendeur spécifique

Description

bool radius_put_vendor_string ( resource $radius_handle , int $vendor , int $type , string $value )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

Voir aussi



radius_request_authenticator

(PECL radius >= 1.1.0)

radius_request_authenticatorRetourne l'identifiant demandé

Description

string radius_request_authenticator ( resource $radius_handle )

L'identifiant demandé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.

Valeurs de retour

Retourne l'identificateur demandé en tant que chaîne de caractères ou FALSE si une erreur survient.

Voir aussi



radius_send_request

(PECL radius >= 1.1.0)

radius_send_requestEnvoie la demande et attente une réponse

Description

int radius_send_request ( resource $radius_handle )

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.

Valeurs de retour

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.

Voir aussi



radius_server_secret

(PECL radius >= 1.1.0)

radius_server_secretRetourne le secret partagé

Description

string radius_server_secret ( resource $radius_handle )

Le secret partagé est nécessaire pour le rétablissement des données comme les mots de passe et les clés de chiffrement.

Valeurs de retour

Retourne le secret partagé du serveur en tant que chaîne de caractères ou FALSE si une erreur survient.



radius_strerror

(PECL radius >= 1.1.0)

radius_strerrorRetourne un message d'erreur

Description

string radius_strerror ( resource $radius_handle )

Si une fonction Radius échoue, alors, elle enregistre un message d'erreur. Ce message d'erreur peut être récupéré avec cette fonction.

Valeurs de retour

Retourne un message d'erreur en tant que chaîne de caractères.


Sommaire





Extensions relatives aux calendriers et aux évènements


Calendar


Introduction

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/.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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.



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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.

CAL_GREGORIAN (entier)
CAL_JULIAN (entier)
CAL_JEWISH (entier)
CAL_FRENCH (entier)
CAL_NUM_CALS (entier)
CAL_DOW_DAYNO (entier)
CAL_DOW_SHORT (entier)
CAL_DOW_LONG (entier)
CAL_MONTH_GREGORIAN_SHORT (entier)
CAL_MONTH_GREGORIAN_LONG (entier)
CAL_MONTH_JULIAN_SHORT (entier)
CAL_MONTH_JULIAN_LONG (entier)
CAL_MONTH_JEWISH (entier)
CAL_MONTH_FRENCH (entier)

Les constantes suivantes sont disponibles depuis PHP 4.3.0 :

CAL_EASTER_DEFAULT (entier)
CAL_EASTER_ROMAN (entier)
CAL_EASTER_ALWAYS_GREGORIAN (entier)
CAL_EASTER_ALWAYS_JULIAN (entier)

Les constantes suivantes sont disponibles depuis PHP 5.0.0 :

CAL_JEWISH_ADD_ALAFIM_GERESH (entier)
CAL_JEWISH_ADD_ALAFIM (entier)
CAL_JEWISH_ADD_GERESHAYIM (entier)


Calendar Fonctions


cal_days_in_month

(PHP 4 >= 4.1.0, PHP 5)

cal_days_in_monthRetourne le nombre de jours dans un mois, pour une année et un calendrier donné

Description

int cal_days_in_month ( int $calendar , int $month , int $year )

Retourne le nombre de jours dans le mois month de l'année year , pour le calendrier calendar .

Liste de paramètres

calendar

Calendrier à utiliser pour le calcul

month

Mois dans le calendrier sélectionné

year

Année dans le calendrier sélectionné

Valeurs de retour

Le nombre de jours dans le mois sélectionné, dans le calendrier fourni.

Exemples

Exemple #1 Exemple avec cal_days_in_month()

<?php
$num 
cal_days_in_month(CAL_GREGORIAN82003); // 31
echo "Il y a $num jours en Août 2003";
?>



cal_from_jd

(PHP 4 >= 4.1.0, PHP 5)

cal_from_jdConvertit le nombre de jours Julien en un calendrier spécifique

Description

array cal_from_jd ( int $jd , int $calendar )

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.

Liste de paramètres

jd

Jour Julien, sous la forme d'un entier

calendar

Calendrier à utiliser

Valeurs de retour

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".

Exemples

Exemple #1 Exemple avec cal_from_jd()

<?php
$today 
unixtojd(mktime(0008162003));
print_r(cal_from_jd($todayCAL_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
)

Voir aussi

  • cal_to_jd() - Convertit un calendrier en nombre de jours Julien
  • jdtofrench() - Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
  • jdtogregorian() - Convertit le nombre de jours du calendrier Julien en date grégorienne
  • jdtojewish() - Convertit le nombre de jours du calendrier Julien en date du calendrier juif
  • jdtojulian() - Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
  • jdtounix() - Convertit un jour Julien en timestamp UNIX



cal_info

(PHP 4 >= 4.1.0, PHP 5)

cal_infoRetourne des détails sur un calendrier

Description

array cal_info ([ int $calendar= -1 ] )

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 :

  • 0 ou CAL_GREGORIAN - Calendrier Grégorien
  • 1 ou CAL_JULIAN - Calendrier Julien
  • 2 ou CAL_JEWISH - Calendrier juif
  • 3 ou CAL_FRENCH - Calendrier révolutionnaire français

Si le paramètre calendar n'est pas spécifié, un tableau représentant tous les calendriers est retourné.

Liste de paramètres

calendar

Calendrier dont on souhaite des informations. Si aucun calendrier n'est spécifié, des informations sur tous les calendriers seront retournées.

Valeurs de retour

Historique

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é.

Exemples

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
)



cal_to_jd

(PHP 4 >= 4.1.0, PHP 5)

cal_to_jdConvertit un calendrier en nombre de jours Julien

Description

int cal_to_jd ( int $calendar , int $month , int $day , int $year )

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.

Liste de paramètres

calendar

Calendrier à convertir. Un parmi CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH ou CAL_FRENCH.

month

Le mois, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar

day

Le jour, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar

year

L'année, sous la forme d'un nombre. L'intervalle valide dépend du calendrier calendar

Valeurs de retour

Le nombre de jour Julien.

Voir aussi

  • cal_from_jd() - Convertit le nombre de jours Julien en un calendrier spécifique
  • frenchtojd() - Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
  • gregoriantojd() - Convertit une date grégorienne en nombre de jours du calendrier Julien
  • jewishtojd() - Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
  • juliantojd() - Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
  • unixtojd() - Convertit un timestamp UNIX en un jour Julien



easter_date

(PHP 4, PHP 5)

easter_dateRetourne un timestamp UNIX pour Pâques, à minuit pour une année donnée

Description

int easter_date ([ int $year ] )

Retourne un timestamp UNIX pour Pâques, à minuit, pour une année donnée.

Avertissement

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>)

Liste de paramètres

year

L'année, sous la forme d'un nombre compris entre 1970 et 2037

Valeurs de retour

La date pour Pâques, sous la forme d'un timestamp unix.

Historique

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.

Exemples

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

?>

Voir aussi

  • easter_days() - Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée pour le calcul de Pâques avant 1970 et après 2037



easter_days

(PHP 4, PHP 5)

easter_daysRetourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée

Description

int easter_days ([ int $year [, int $method= CAL_EASTER_DEFAULT ]] )

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>)

Liste de paramètres

year

L'année, sous la forme d'un nombre positif

method

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.

Valeurs de retour

Le nombre de jours entre le 21 Mars et Pâques, pour l'année year fournie.

Historique

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.

Exemples

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

?>

Voir aussi

  • easter_date() - Retourne un timestamp UNIX pour Pâques, à minuit pour une année donnée



FrenchToJD

(PHP 4, PHP 5)

FrenchToJDConvertit une date du calendrier français républicain en nombre de jours du calendrier Julien

Description

int frenchtojd ( int $month , int $day , int $year )

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.

Liste de paramètres

month

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)

day

Le jour, sous la forme d'un nombre compris entre 1 et 30

year

L'année, sous la forme d'un nombre compris entre 1 et 14

Valeurs de retour

Le jour Julien pour la date fournie du calendrier français républicain, sous la forme d'un entier.

Voir aussi

  • jdtofrench() - Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
  • cal_to_jd() - Convertit un calendrier en nombre de jours Julien



GregorianToJD

(PHP 4, PHP 5)

GregorianToJDConvertit une date grégorienne en nombre de jours du calendrier Julien

Description

int gregoriantojd ( int $month , int $day , int $year )

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.

Liste de paramètres

month

Le mois, sous la forme d'un nombre compris entre 1 (pour Janvier) et 12 (pour Décembre)

day

Le jour, sous la forme d'un nombre compris entre 1 et 31

year

L'année, sous la forme d'un nombre compris entre -4714 et 9999

Valeurs de retour

Le jour Julien pour la date fournie du calendrier Grégorien, sous la forme d'un entier.

Exemples

Exemple #1 Fonctions calendrier

<?php
$jd 
GregorianToJD(10111970);
echo 
"$jd\n";
$gregorian JDToGregorian($jd);
echo 
"$gregorian\n";
?>

Voir aussi

  • jdtogregorian() - Convertit le nombre de jours du calendrier Julien en date grégorienne
  • cal_to_jd() - Convertit un calendrier en nombre de jours Julien



JDDayOfWeek

(PHP 4, PHP 5)

JDDayOfWeekRetourne le numéro du jour de la semaine

Description

mixed jddayofweek ( int $julianday [, int $mode= CAL_DOW_DAYNO ] )

Retourne le numéro du jour de la semaine. Peut retourner une chaîne ou un entier, en fonction du mode.

Liste de paramètres

julianday

Le numéro du jour Julien, sous la forme d'un entier

mode
Modes pour la semaine du calendrier
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)

Valeurs de retour

Le jour de la semaine Grégorien, sous la forme d'un entier ou d'une chaîne de caractères.



JDMonthName

(PHP 4, PHP 5)

JDMonthNameRetourne le nom du mois

Description

string jdmonthname ( int $julianday , int $mode )

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é.

Modes de calendrier
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

Liste de paramètres

jday

Le jour Julien à analyser

calendar

Le calendrier dans lequel on récupère le nom du mois

Valeurs de retour

Le nom du mois pour le jour Julien donné, pour le calendrier calendar .



JDToFrench

(PHP 4, PHP 5)

JDToFrenchConvertit le nombre de jours du calendrier Julien en date du calendrier français républicain

Description

string jdtofrench ( int $juliandaycount )

Convertit le nombre de jours du calendrier julien en date du calendrier français républicain.

Liste de paramètres

julianday

Le numéro du jour Julien, sous la forme d'un entier

Valeurs de retour

La date française républicaine, sous la forme d'une chaîne de caractères "mois/jour/année".

Voir aussi

  • frenchtojd() - Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
  • cal_from_jd() - Convertit le nombre de jours Julien en un calendrier spécifique



JDToGregorian

(PHP 4, PHP 5)

JDToGregorianConvertit le nombre de jours du calendrier Julien en date grégorienne

Description

string jdtogregorian ( int $julianday )

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".

Liste de paramètres

julianday

Le numéro du jour Julien, sous la forme d'un entier

Valeurs de retour

La date grégorienne, sous la forme d'une chaîne de caractères "mois/jour/année".

Voir aussi

  • gregoriantojd() - Convertit une date grégorienne en nombre de jours du calendrier Julien
  • cal_from_jd() - Convertit le nombre de jours Julien en un calendrier spécifique



jdtojewish

(PHP 4, PHP 5)

jdtojewishConvertit le nombre de jours du calendrier Julien en date du calendrier juif

Description

string jdtojewish ( int $juliandaycount [, bool $hebrew= false [, int $fl= 0 ]] )

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.

Liste de paramètres

julianday

Le nombre de jours Julien, sous la forme d'un entier

Valeurs de retour

La date Juive, sous la forme d'une chaîne de caractères "mois/jour/année".

Historique

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é.

Exemples

Exemple #1 Exemple avec jdtojewish()

<?php
echo jdtojewish(gregoriantojd(1082002), true,
       
CAL_JEWISH_ADD_GERESHAYIM CAL_JEWISH_ADD_ALAFIM CAL_JEWISH_ADD_ALAFIM_GERESH); 
?>

Voir aussi

  • jewishtojd() - Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
  • cal_from_jd() - Convertit le nombre de jours Julien en un calendrier spécifique



JDToJulian

(PHP 4, PHP 5)

JDToJulianConvertit le nombre de jours du calendrier Julien en date du calendrier Julien

Description

string jdtojulian ( int $julianday )

Convertit le nombre de jours du calendrier Julien en une chaîne contenant la date du calendrier Julien, au format "mois/jour/année".

Liste de paramètres

julianday

Le nombre de jours Julien, sous la forme d'un entier

Valeurs de retour

La date Julien, sous la forme d'une chaîne de caractères "mois/jour/année".

Voir aussi

  • juliantojd() - Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
  • cal_from_jd() - Convertit le nombre de jours Julien en un calendrier spécifique



jdtounix

(PHP 4, PHP 5)

jdtounixConvertit un jour Julien en timestamp UNIX

Description

int jdtounix ( int $jday )

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).

Liste de paramètres

jday

Le nombre de jours Julien, compris entre 2440588 et 2465342.

Valeurs de retour

Le timestamp unix pour le début du jour Julien donné.

Voir aussi

  • unixtojd() - Convertit un timestamp UNIX en un jour Julien



JewishToJD

(PHP 4, PHP 5)

JewishToJDConvertit une date du calendrier Juif en nombre de jours du calendrier Julien

Description

int jewishtojd ( int $month , int $day , int $year )

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.

Liste de paramètres

month

Le mois, sous la forme d'un nombre entre 1 et 13

day

Le jour, sous la forme d'un nombre entre 1 et 30

year

L'année, sous la forme d'un nombre entre 1 et 9999

Valeurs de retour

Le jour Julien pour la date Juive donnée, sous la forme d'un entier.

Voir aussi

  • jdtojewish() - Convertit le nombre de jours du calendrier Julien en date du calendrier juif
  • cal_to_jd() - Convertit un calendrier en nombre de jours Julien



JulianToJD

(PHP 4, PHP 5)

JulianToJDConvertit un jours du calendrier Julien en un nombre de jours du calendrier Julien

Description

int juliantojd ( int $month , int $day , int $year )

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.

Attention

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.

Liste de paramètres

month

Le mois, sous la forme d'un nombre entre 1 (pour Janvier) et 12 (pour Décembre)

day

Le jour, sous la forme d'un nombre entre 1 et 31

year

L'année, sous la forme d'un nombre entre -4713 et 9999

Valeurs de retour

Le jour Julien pour la date Julienne donnée, sous la forme d'un entier.

Voir aussi

  • jdtojulian() - Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
  • cal_to_jd() - Convertit un calendrier en nombre de jours Julien



unixtojd

(PHP 4, PHP 5)

unixtojdConvertit un timestamp UNIX en un jour Julien

Description

int unixtojd ([ int $timestamp= time() ] )

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.

Liste de paramètres

timestamp

Un timestamp unix à convertir.

Valeurs de retour

Un nombre de jours Julien, sous la forme d'un entier.

Voir aussi

  • jdtounix() - Convertit un jour Julien en timestamp UNIX


Sommaire

  • cal_days_in_month — Retourne le nombre de jours dans un mois, pour une année et un calendrier donné
  • cal_from_jd — Convertit le nombre de jours Julien en un calendrier spécifique
  • cal_info — Retourne des détails sur un calendrier
  • cal_to_jd — Convertit un calendrier en nombre de jours Julien
  • easter_date — Retourne un timestamp UNIX pour Pâques, à minuit pour une année donnée
  • easter_days — Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée
  • FrenchToJD — Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
  • GregorianToJD — Convertit une date grégorienne en nombre de jours du calendrier Julien
  • JDDayOfWeek — Retourne le numéro du jour de la semaine
  • JDMonthName — Retourne le nom du mois
  • JDToFrench — Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
  • JDToGregorian — Convertit le nombre de jours du calendrier Julien en date grégorienne
  • jdtojewish — Convertit le nombre de jours du calendrier Julien en date du calendrier juif
  • JDToJulian — Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
  • jdtounix — Convertit un jour Julien en timestamp UNIX
  • JewishToJD — Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
  • JulianToJD — Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
  • unixtojd — Convertit un timestamp UNIX en un jour Julien



Date et Heure


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible.



Installation

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



Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour les dates et heures
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.

date.default_latitude float

La latitude par défaut.

date.default_longitude float

La longitude par défaut.

date.sunrise_zenith float

L'heure de lever du soleil par défaut.

date.sunset_zenith float

L'heure du coucher du soleil par défaut.

date.timezone string

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().



Types de ressources

Cette extension ne définit aucune ressource.




Constantes pré-définies

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().

SUNFUNCS_RET_TIMESTAMP (entier)
Timestamp
SUNFUNCS_RET_STRING (entier)
Heures:minutes (exemple: 08:02)
SUNFUNCS_RET_DOUBLE (entier)
Heures en tant que nombre à point flottant (exemple 8.75)


Liste des Fuseaux Horaires Supportés

Sommaire

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

Africa
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

America
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

Antarctica
Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/McMurdo
Antarctica/Palmer Antarctica/Rothera Antarctica/South_Pole Antarctica/Syowa Antarctica/Vostok


Arctic

Arctic
Arctic/Longyearbyen


Asia

Asia
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

Atlantic
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

Australia
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

Europe
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

Indian
Indian/Antananarivo Indian/Chagos Indian/Christmas Indian/Cocos Indian/Comoro
Indian/Kerguelen Indian/Mahe Indian/Maldives Indian/Mauritius Indian/Mayotte
Indian/Reunion        


Pacific

Pacific
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


Others

Others
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        
Avertissement

N'utilisez aucun des fuseaux horaires listés ici (à côté de UTC), ils n'existent que pour des raisons de compatibilité ascendante.




La classe DateTime

Introduction

Représentation d'une date et heure.

Synopsis de la classe

DateTime
DateTime {
/* Constantes */
const string DateTime::ATOM = Y-m-d\TH:i:sP ;
const string DateTime::COOKIE = l, d-M-y H:i:s T ;
const string DateTime::ISO8601 = Y-m-d\TH:i:sO ;
const string DateTime::RFC822 = D, d M y H:i:s O ;
const string DateTime::RFC850 = l, d-M-y H:i:s T ;
const string DateTime::RFC1036 = D, d M y H:i:s O ;
const string DateTime::RFC1123 = D, d M Y H:i:s O ;
const string DateTime::RFC2822 = D, d M Y H:i:s O ;
const string DateTime::RFC3339 = Y-m-d\TH:i:sP ;
const string DateTime::RSS = D, d M Y H:i:s O ;
const string DateTime::W3C = Y-m-d\TH:i:sP ;
/* Méthodes */
public DateTime add ( string $interval )
__construct ([ string $time= "now" [, DateTimeZone $timezone= NULL ]] )
public static DateTime createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] )
public DateInterval diff ( DateTime $datetime [, bool $absolute ] )
public string format ( string $format )
public static array getLastErrors ( void )
public int getOffset ( void )
public int getTimestamp ( void )
public DateTimeZone getTimezone ( void )
public DateTime modify ( string $modify )
public static DateTime __set_state ( array $array )
public DateTime setDate ( int $year , int $month , int $day )
public DateTime setISODate ( int $year , int $week [, int $day ] )
public DateTime setTime ( int $hour , int $minute [, int $second ] )
public DateTime setTimestamp ( int $unixtimestamp )
public DateTime setTimezone ( DateTimeZone $timezone )
public DateTime sub ( DateInterval $interval )
public DateTime __wakeup ( void )
}

Constantes pré-définies

Types de noeuds DateTime

DateTime::ATOM
DATE_ATOM
Atom (exemple : 2005-08-15T15:52:01+00:00)
DateTime::COOKIE
DATE_COOKIE
Cookies HTTP (exemple : Monday, 15-Aug-05 15:52:01 UTC)
DateTime::ISO8601
DATE_ISO8601
ISO-8601 (exemple : 2005-08-15T15:52:01+0000)
DateTime::RFC822
DATE_RFC822
RFC 822 (exemple : Mon, 15 Aug 05 15:52:01 +0000)
DateTime::RFC850
DATE_RFC850
RFC 850 (exemple : Monday, 15-Aug-05 15:52:01 UTC)
DateTime::RFC1036
DATE_RFC1036
RFC 1036 (exemple : Mon, 15 Aug 05 15:52:01 +0000)
DateTime::RFC1123
DATE_RFC1123
RFC 1123 (exemple : Mon, 15 Aug 2005 15:52:01 +0000)
DateTime::RFC2822
DATE_RFC2822
RFC 2822 (exemple : Mon, 15 Aug 2005 15:52:01 +0000)
DateTime::RFC3339
DATE_RFC3339
Identique à DATE_ATOM (Depuis PHP 5.1.3)
DateTime::RSS
DATE_RSS
RSS (exemple : Mon, 15 Aug 2005 15:52:01 +0000)
DateTime::W3C
DATE_W3C
World Wide Web Consortium (exemple : 2005-08-15T15:52:01+00:00)

DateTime::add

(PHP 5 >= 5.3.0)

DateTime::add Ajoute une durée à un objet DateTime

Description

public DateTime DateTime::add ( string $interval )
DateTime date_add ( DateTime $object , DateInterval $interval )

Ajoute la durée de l'objet DateInterval à l'objet DateTime.

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

interval

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.

Valeurs de retour

Retourne l'objet DateTime modifié.

Exemples

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';

?>

Notes

Avertissement

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.

Voir aussi



DateTime::__construct

(PHP 5 >= 5.2.0)

DateTime::__constructRetourne un nouvel objet DateTime

Description

DateTime::__construct ([ string $time= "now" [, DateTimeZone $timezone= NULL ]] )

Retourne un nouvel objet DateTime.

Liste de paramètres

time

Chaîne dans un format accepté par strtotime(), par défaut, maintenant ("now").

timezone

Fuseau horaire de l'heure.

Erreurs / Exceptions

Émet un Exception en cas d'erreur.

Exemples

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);
?>



DateTime::createFromFormat

(PHP 5 >= 5.3.0)

DateTime::createFromFormatRetourne un nouvel objet DateTime formaté

Description

public static DateTime DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] )

Retourne un nouvel objet DateTime formaté.

Liste de paramètres

format

Format accepté par date().

time

Chaîne représentant l'heure.

timezone

Fuseau horaire.

Valeurs de retour

Retourne un nouvel objet DateTime.



DateTime::diff

(PHP 5 >= 5.3.0)

DateTime::diffRetourne la différence entre deux objets DateTime

Description

public DateInterval DateTime::diff ( DateTime $datetime [, bool $absolute ] )

Retourne la différence entre deux objets DateTime.

Liste de paramètres

datetime

La date de comparaison.

absolute

S'il faut retourner une différence absolue. Par défaut, FALSE.

Valeurs de retour

La différence entre les deux dates.



DateTime::format

(PHP 5 >= 5.2.0)

DateTime::formatRetourne la date au format demandé

Description

public string DateTime::format ( string $format )
string date_format ( DateTime $object , string $format )

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

format

Format accepté par date().

Valeurs de retour

Retourne la date formatée, en cas de succès, FALSE sinon.

Exemples

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($datetimeDATE_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

Voir aussi

  • date() - Formate une date/heure locale



DateTime::getLastErrors

(PHP 5 >= 5.3.0)

DateTime::getLastErrorsRetourne les dernières erreurs et alertes

Description

public static array DateTime::getLastErrors ( void )

Retourne les dernières erreurs et alertes obtenu lors de l'analyse de la chaîne de date.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau contenant les erreurs et alertes.

Exemples

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
        )

)



DateTime::getOffset

(PHP 5 >= 5.2.0)

DateTime::getOffsetRetourne le décalage d'heure d'hivers

Description

public int DateTime::getOffset ( void )
int date_offset_get ( DateTime $object )

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

Valeurs de retour

Retourne le décalage d'heure d'hiver, en seconde, en cas de succès, ou bien FALSE sinon.

Exemples

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
?>



DateTime::getTimestamp

(PHP 5 >= 5.3.0)

DateTime::getTimestampLit le timestamp Unix

Description

public int DateTime::getTimestamp ( void )

Lit le timestamp Unix.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Lit le timestamp Unix représentant la date.

Voir aussi



DateTime::getTimezone

(PHP 5 >= 5.2.0)

DateTime::getTimezoneLit le fuseau horaire d'un objet DateTime

Description

public DateTimeZone DateTime::getTimezone ( void )

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

Valeurs de retour

Retourne l'objet DateTimeZone en cas de succès, et FALSE sinon.

Exemples

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

Voir aussi



DateTime::modify

(PHP 5 >= 5.2.0)

DateTime::modifyModifie le timestamp

Description

public DateTime DateTime::modify ( string $modify )
DateTime date_modify ( DateTime $object , string $modify )

Modifie le timestamp d'un objet DateTime en l'incrémentant ou le décrémentant dans un format acceptable par strtotime().

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

modify

Une chaîne, dans un format accepté par strtotime().

Valeurs de retour

Retourne l'objet DateTime modifié.

Historique

Version Description
5.3.0Changement de valeur de retour de NULL à DateTime.

Exemples

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

Voir aussi

  • strtotime() - Transforme un texte anglais en timestamp



DateTime::__set_state

(PHP 5 >= 5.2.0)

DateTime::__set_stateLe gestionnaire __set_state

Description

public static DateTime DateTime::__set_state ( array $array )

Le gestionnaire __set_state.

Liste de paramètres

array

Le tableau d'initialisation.

Valeurs de retour

Retourne une nouvelle instance de l'objet DateTime.



DateTime::setDate

(PHP 5 >= 5.2.0)

DateTime::setDateAssigne la date

Description

public DateTime DateTime::setDate ( int $year , int $month , int $day )
DateTime date_date_set ( DateTime $object , int $year , int $month , int $day )

Assigne la date courante de l'objet DateTime à une nouvelle date.

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

year

Année de la date.

month

Mois de la date.

day

Jour de la date.

Valeurs de retour

Retourne l'objet DateTime modifié.

Historique

Version Description
5.3.0Changement de valeur de retour de NULL à DateTime.

Exemples

Exemple #1 Exemple avec DateTime::setDate()

<?php
date_default_timezone_set
('Europe/London');

$datetime = new DateTime('2008-08-03 14:52:10');
$datetime->setDate(20081012);

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($datetime20081012);

echo 
date_format($datetimeDATE_RFC2822);
?>

L'exemple ci-dessus va afficher :

Sun, 12 Oct 2008 14:52:10 +0100

Voir aussi



DateTime::setISODate

(PHP 5 >= 5.2.0)

DateTime::setISODateConfigure une date ISO

Description

public DateTime DateTime::setISODate ( int $year , int $week [, int $day ] )
DateTime date_isodate_set ( DateTime $object , int $year , int $week [, int $day ] )

Configure une date au format ISO 8601 : en utilisant des décalages de semaines et de jours, au lieu de dates spécifiques.

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

year

L'année de la date.

week

Le mois de la date.

day

Décalage par rapport au premier jour de la semaine.

Valeurs de retour

Retourne l'objet DateTime modifié.

Historique

Version Description
5.3.0Changement de valeur de retour de NULL à DateTime.

Exemples

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(200825); // Day 5 of week 2 of 2008 is the 11th of January. 

// Offset from start of week 2 (7) = 10
$datetime->setISODate(2008210); // 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($datetime20086); // Week 6 of 2008 is in February.
?>

Voir aussi



DateTime::setTime

(PHP 5 >= 5.2.0)

DateTime::setTimeAssigne l'heure

Description

public DateTime DateTime::setTime ( int $hour , int $minute [, int $second ] )
DateTime date_time_set ( DateTime $object , int $hour , int $minute [, int $second ] )

Assigne l'heure de l'objet DateTime à une différente heure.

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

hour

Heure du moment.

minute

Minute du moment.

second

Seconde du moment.

Valeurs de retour

Retourne l'objet DateTime modifié.

Historique

Version Description
5.3.0Changement de valeur de retour de NULL à DateTime.

Exemples

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(145524);
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

Voir aussi



DateTime::setTimestamp

(PHP 5 >= 5.3.0)

DateTime::setTimestampAssigne la date et l'heure à l'aide d'un timestamp Unix

Description

public DateTime DateTime::setTimestamp ( int $unixtimestamp )

Assigne la date et l'heure à l'aide d'un timestamp Unix.

Liste de paramètres

unixtimestamp

Timestamp Unix représentant la date et l'heure.

Valeurs de retour

Retourne l'objet DateTime modifié.

Voir aussi



DateTime::setTimezone

(PHP 5 >= 5.2.0)

DateTime::setTimezoneConfigure le fuseau horaire de l'objet DateTime

Description

public DateTime DateTime::setTimezone ( DateTimeZone $timezone )

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

timezone

Le fuseau horaire voulu.

Valeurs de retour

Retourne l'objet DateTime modifié.

Historique

Version Description
5.3.0 La valeur retournée passe de NULL à DateTime.

Exemples

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

Voir aussi



DateTime::sub

(PHP 5 >= 5.3.0)

DateTime::sub Soustrait une durée à un objet DateTime

Description

public DateTime DateTime::sub ( DateInterval $interval )
DateTime date_sub ( DateTime $object , DateInterval $interval )

Soustrait la durée spécifiée par l'objet DateInterval de l'objet DateTime.

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

interval

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.

Valeurs de retour

Retourne l'objet DateTime modifié.

Exemples

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';

?>

Notes

Avertissement

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.

Voir aussi



DateTime::__wakeup

(PHP 5 >= 5.2.0)

DateTime::__wakeupLe gestionnaire de __wakeup

Description

public DateTime DateTime::__wakeup ( void )

Le gestionnaire de __wakeup.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Initialise un objet DateTime.


Sommaire



La classe DateTimeZone

Introduction

Représentation d'un fuseau horaire.

Synopsis de la classe

DateTimeZone
DateTimeZone {
/* Constantes */
const integer DateTimeZone::AFRICA = 1 ;
const integer DateTimeZone::AMERICA = 2 ;
const integer DateTimeZone::ANTARCTICA = 4 ;
const integer DateTimeZone::ARCTIC = 8 ;
const integer DateTimeZone::ASIA = 16 ;
const integer DateTimeZone::ATLANTIC = 32 ;
const integer DateTimeZone::AUSTRALIA = 64 ;
const integer DateTimeZone::EUROPE = 128 ;
const integer DateTimeZone::INDIAN = 256 ;
const integer DateTimeZone::PACIFIC = 512 ;
const integer DateTimeZone::UTC = 1024 ;
const integer DateTimeZone::ALL = 2047 ;
const integer DateTimeZone::ALL_WITH_BC = 4095 ;
const integer DateTimeZone::PER_COUNTRY = 4096 ;
/* Méthodes */
__construct ( string $timezone )
public array getLocation ( void )
public string getName ( void )
int getOffset ( DateTime $datetime )
array getTransitions ([ int $timestamp_begin [, int $timestamp_end ]] )
staticarray listAbbreviations ( void )
staticarray listIdentifiers ([ int $what= DateTime::ALL [, string $country= NULL ]] )
}

Constantes pré-définies

Types de noeuds DateTimeZone

DateTimeZone::AFRICA

Fuseau africain.

DateTimeZone::AMERICA

Fuseau américain.

DateTimeZone::ANTARCTICA

Fuseau antarctique.

DateTimeZone::ARCTIC

Fuseau arctique.

DateTimeZone::ASIA

Fuseau asiatique.

DateTimeZone::ATLANTIC

Fuseau atlantique.

DateTimeZone::AUSTRALIA

Fuseau australien.

DateTimeZone::EUROPE

Fuseau européen.

DateTimeZone::INDIAN

Fuseau indien.

DateTimeZone::PACIFIC

Fuseau pacifique.

DateTimeZone::UTC

Fuseau UTC.

DateTimeZone::ALL

Tous les fuseaux.

DateTimeZone::ALL_WITH_BC

Tous les fuseaux, y compris les anciens.

DateTimeZone::PER_COUNTRY

Fuseaux horaires par pays.


DateTimeZone::__construct

(PHP 5 >= 5.2.0)

DateTimeZone::__constructCrée un nouvel objet DateTimeZone

Description

DateTimeZone::__construct ( string $timezone )

Crée un nouvel objet DateTimeZone.

Liste de paramètres

timezone

Un des fuseaux horaires.

Valeurs de retour

Retourne un objet DateTimeZone, en cas de succès.

Erreurs / Exceptions

Cette méthode émet une exception Exception, si le fuseau horaire fourni n'est pas reconnu.

Exemples

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)



DateTimeZone::getLocation

(PHP 5 >= 5.3.0)

DateTimeZone::getLocationRetourne les informations géographiques d'un fuseau horaire

Description

public array DateTimeZone::getLocation ( void )

Retourne les informations géographiques d'un fuseau horaire, comprenant le code du pays, la latitude et la longitude, et commentaires.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Tableau contenant les informations de localisation du fuseau horaire.

Exemples

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] => 
)



DateTimeZone::getName

(PHP 5 >= 5.2.0)

DateTimeZone::getNameRetourne le nom du fuseau horaire

Description

public string DateTimeZone::getName ( void )

Retourne le nom du fuseau horaire.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un des fuseaux horaires.



DateTimeZone::getOffset

(PHP 5 >= 5.2.0)

DateTimeZone::getOffsetRetourne le décalage GMT d'un fuseau horaire

Description

int DateTimeZone::getOffset ( DateTime $datetime )
int timezone_offset_get ( DateTimeZone $object , DateTime $datetime )

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.

Liste de paramètres

object

Seulement en style procédural : un DateTimeZone objet retourné par timezone_open()

datetime

Objet DateTime qui contient la date dont il faut calculer le décalage.

Valeurs de retour

Retourne le décalage horaire, exprimé en secondes, en cas de succès, et FALSE en cas d'erreur.

Exemples

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);
?>



DateTimeZone::getTransitions

(PHP 5 >= 5.2.0)

DateTimeZone::getTransitionsRetourne toutes les transitions d'un fuseau horaire

Description

array DateTimeZone::getTransitions ([ int $timestamp_begin [, int $timestamp_end ]] )
array timezone_transitions_get ( DateTimeZone $object [, int $timestamp_begin [, int $timestamp_end ]] )

Liste de paramètres

object

Seulement en style procédural : un DateTimeZone objet retourné par timezone_open()

timestamp_begin

Début du timestamp.

timestamp_end

Fin du timestamp.

Valeurs de retour

Retourne un tableau numérique, contenant des tableaux associatifs avec toutes les transitions, en cas de succès, et FALSE sinon.

Historique

Version Description
5.3.0 Les paramètres optionnels timestamp_begin et timestamp_end ont été ajouté.

Exemples

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
)



DateTimeZone::listAbbreviations

(PHP 5 >= 5.2.0)

DateTimeZone::listAbbreviationsRetourne un tableau associatif, décrivant un fuseau horaire

Description

staticarray DateTimeZone::listAbbreviations ( void )

Valeurs de retour

Retourne un tableau en cas de succès, et FALSE sinon.

Exemples

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
        )

)

Voir aussi



DateTimeZone::listIdentifiers

(PHP 5 >= 5.2.0)

DateTimeZone::listIdentifiersRetourne un tableau numérique de tous les fuseaux horaires

Description

staticarray DateTimeZone::listIdentifiers ([ int $what= DateTime::ALL [, string $country= NULL ]] )
array timezone_identifiers_list ([ int $what= DateTime::ALL [, string $country= NULL ]] )

Liste de paramètres

object

Seulement en style procédural : un objet DateTime retourné par date_create()

what

Une des constantes de classe DateTimeZone, qui vaut par défaut DateTimeZone::ALL.

country

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.

Valeurs de retour

Retourne un tableau en cas de succès, ou FALSE en cas d'erreur.

Historique

Version Description
5.3.0 Ajout des paramètres optionnels what et country .

Exemples

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

Voir aussi


Sommaire



La classe DateInterval

Introduction

Représentation d'un intervalle de dates.

Synopsis de la classe

DateInterval
DateInterval {
/* Méthodes */
__construct ( string $interval_spec )
public static DateInterval createFromDateString ( string $time )
public string format ( string $format )
}

DateInterval::__construct

(PHP 5 >= 5.3.0)

DateInterval::__constructCrée un nouvel objet DateInterval

Description

DateInterval::__construct ( string $interval_spec )

Crée un nouvel objet DateInterval.

Liste de paramètres

interval_spec

Spécification d'intervalle.



DateInterval::createFromDateString

(PHP 5 >= 5.3.0)

DateInterval::createFromDateStringConfigure un objet DateInterval à partir des parties d'une chaîne

Description

public static DateInterval DateInterval::createFromDateString ( string $time )

Utilise les analyseurs de dates natifs et configure un objet DateInterval à partir d'une chaîne de caractères.

Liste de paramètres

time

Une date, avec des portions relatives.

Valeurs de retour

Retourne un nouvel objet DateInterval, en cas de succès.



DateInterval::format

(PHP 5 >= 5.3.0)

DateInterval::formatFormate l'intervalle

Description

public string DateInterval::format ( string $format )

Format l'intervalle.

Liste de paramètres

format

Les caractères suivants sont reconnus dans la chaîne format .
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.

Valeurs de retour

Retourne l'intervalle formaté.


Sommaire



La classe DatePeriod

Introduction

Représentation d'une période de dates.

Synopsis de la classe

DatePeriod
DatePeriod implements Traversable {
/* Constantes */
const integer DatePeriod::EXCLUDE_START_DATE = 1 ;
/* Méthodes */
__construct ( DateTime $start , DateInterval $interval , int $recurrences [, int $options ] )
}

Constantes pré-définies

Types de noeuds DatePeriod

DatePeriod::EXCLUDE_START_DATE

Exclut la date de début, utilisé par DatePeriod::__construct().


DatePeriod::__construct

(PHP 5 >= 5.3.0)

DatePeriod::__constructCrée un nouvel objet DatePeriod

Description

DatePeriod::__construct ( DateTime $start , DateInterval $interval , int $recurrences [, int $options ] )
DatePeriod::__construct ( DateTime $start , DateInterval $interval , DateTime $end [, int $options ] )
DatePeriod::__construct ( string $isostr [, int $options ] )

Crée un nouvel objet DatePeriod.

Liste de paramètres

start

Date de début.

interval

Intervalle.

recurrences

Nombre de récurrences.

end

Date de fin.

isostr

Chaîne contenant l'intervalle ISO.

options

Peut être configuré à DateTime::EXCLUDE_START_DATE.


Sommaire



Fonctions Date/Heure


checkdate

(PHP 4, PHP 5)

checkdateValide une date grégorienne

Description

bool checkdate ( int $month , int $day , int $year )

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.

Liste de paramètres

month

Le mois doit être compris entre 1 et 12.

day

Le jour doit être un jour autorisé par le mois donné. Les années bissextiles sont prises en comptes.

year

L'année est comprise entre 1 et 32767 inclus.

Valeurs de retour

Retourne TRUE si la date fournie est valide, sinon FALSE.

Exemples

Exemple #1 Exemple avec checkdate()

<?php
var_dump
(checkdate(12312000));
var_dump(checkdate(2292001));
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)

Voir aussi

  • mktime() - Retourne le timestamp UNIX d'une date
  • strtotime() - Transforme un texte anglais en timestamp



date_add

(PHP 5 >= 5.3.0)

date_addAlias de DateTime::add

Description

Cette fonction est un alias de : DateTime::add



date_create_from_format

(PHP 5 >= 5.3.0)

date_create_from_formatAlias de DateTime::createFromFormat

Description

Cette fonction est un alias de : DateTime::createFromFormat



date_create

(PHP 5 >= 5.2.0)

date_createRetourne un nouvel objet DateTime

Description

DateTime date_create ([ string $time= "now" [, DateTimeZone $timezone= NULL ]] )

Liste de paramètres

time

Une chaîne de caractères dans le format accepté par strtotime(), la valeur par défaut est maintenant "now".

timezone

Fuseau horaire.

Valeurs de retour

Retourne un objet DateTime en cas de succès, ou FALSE en cas d'échec.

Exemples

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($datetimeDATE_ATOM);
?>

L'exemple ci-dessus va afficher :

2008-08-03T14:52:10+01:00



date_date_set

(PHP 5 >= 5.2.0)

date_date_setAlias de DateTime::setDate

Description

Cette fonction est un alias de : DateTime::setDate



date_default_timezone_get

(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

Description

string date_default_timezone_get ( void )

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.

Valeurs de retour

Retourne une chaîne de caractères.

Exemples

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

Voir aussi



date_default_timezone_set

(PHP 5 >= 5.1.0)

date_default_timezone_set Définit le décalage horaire par défaut de toutes les fonctions date/heure

Description

bool date_default_timezone_set ( string $timezone_identifier )

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.

Liste de paramètres

timezone_identifier

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.

Valeurs de retour

Cette fonction retourne FALSE si timezone_identifier n'est pas valide, TRUE sinon.

Exemples

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_tzini_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.';
}
?>

Historique

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 .

Voir aussi

  • date_default_timezone_get() - Récupère le décalage horaire par défaut utilisé par toutes les fonctions date/heure dans un script



date_diff

(PHP 5 >= 5.3.0)

date_diffAlias de DateTime::diff

Description

Cette fonction est un alias de : DateTime::diff



date_format

(PHP 5 >= 5.2.0)

date_formatAlias de DateTime::format

Description

Cette fonction est un alias de : DateTime::format



date_get_last_errors

(PHP 5 >= 5.3.0)

date_get_last_errorsAlias de DateTime::getLastErrors

Description

Cette fonction est un alias de : DateTime::getLastErrors



date_interval_create_from_date_string

(PHP 5 >= 5.3.0)

date_interval_create_from_date_stringAlias de DateInterval::createFromDateString

Description

Cette fonction est un alias de : DateInterval::createFromDateString



date_interval_format

(PHP 5 >= 5.3.0)

date_interval_formatAlias de DateInterval::format

Description

Cette fonction est un alias de : DateInterval::format



date_isodate_set

(PHP 5 >= 5.2.0)

date_isodate_setAlias de DateTime::setISODate

Description

Cette fonction est un alias de : DateTime::setISODate



date_modify

(PHP 5 >= 5.2.0)

date_modifyAlias de DateTime::modify

Description

Cette fonction est un alias de : DateTime::modify



date_offset_get

(PHP 5 >= 5.2.0)

date_offset_getAlias de DateTime::getOffset

Description

Cette fonction est un alias de : DateTime::getOffset



date_parse_from_format

(PHP 5 >= 5.3.0)

date_parse_from_formatRécupère les informations d'une date donnée

Description

array date_parse_from_format ( string $format , string $date )

Retourne un tableau associatif contenant des informations détaillées sur une date donnée.

Liste de paramètres

format

Format accepté par la fonction date() avec quelques ajouts.

date

Chaîne représentant la date.

Valeurs de retour

Retourne un tableau associatif avec des informations détaillées sur la date donnée.

Exemples

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] => 
)



date_parse

(PHP 5 >= 5.2.0)

date_parseRetourne un tableau associatif avec des informations détaillées sur une date donnée

Description

array date_parse ( string $date )

Liste de paramètres

date

Date mise en forme acceptée par strtotime().

Valeurs de retour

Retourne un tableau contenant des informations sur la date analysée en cas de succès ou FALSE en cas d'échec.

Erreurs / Exceptions

Dans le cas où la fonction retourne une erreur, l'élément "errors" contiendra les messages d'erreur.

Exemples

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] => 
)

Voir aussi



date_sub

(PHP 5 >= 5.3.0)

date_subAlias de DateTime::sub

Description

Cette fonction est un alias de : DateTime::sub



date_sun_info

(PHP 5 >= 5.1.2)

date_sun_infoRetourne un tableau avec les informations sur lever/coucher du soleil ainsi que le début et la fin de l'aube

Description

array date_sun_info ( int $time , float $latitude , float $longitude )

Liste de paramètres

time

Timestamp.

latitude

Latitude en degrés.

longitude

Longitude en degrés.

Valeurs de retour

Retourne un tableau en cas de succès ou FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec date_sun_info()

<?php
$sun_info 
date_sun_info(strtotime("2006-12-12"), 31.766735.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

Voir aussi

  • date_sunrise() - Retourne l'heure de levé du soleil pour un jour et un endroit donnés
  • date_sunset() - Retourne l'heure de coucher du soleil pour un jour et un endroit donnés



date_sunrise

(PHP 5)

date_sunriseRetourne l'heure de levé du soleil pour un jour et un endroit donnés

Description

mixed date_sunrise ( int $timestamp [, int $format= SUNFUNCS_RET_STRING [, float $latitude= ini_get("date.default_latitude") [, float $longitude= ini_get("date.default_longitude") [, float $zenith= ini_get("date.sunrise_zenith") [, float $gmt_offset= 0 ]]]]] )

date_sunrise() retourne l'heure de levé du soleil pour un jour (spécifié par le paramètre timestamp ) et un endroit donnés.

Liste de paramètres

timestamp

Le timestamp Unix du jour pour lequel l'heure de levé du soleil est donné.

format

Constantes pour le paramètre format
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

latitude

Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.

longitude

Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.

zenith

Par défaut : date.sunrise_zenith

gmtoffset

Spécifié en heures.

Valeurs de retour

Retourne l'heure de levé du soleil dans un format spécifié en cas de succès, FALSE si une erreur survient.

Erreurs / Exceptions

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()

Historique

Version Description
5.1.0

Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires.

Exemples

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_STRING38.4, -9901);

?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Mon Dec 20 2004, sunrise time : 08:54

Voir aussi

  • date_sunset() - Retourne l'heure de coucher du soleil pour un jour et un endroit donnés



date_sunset

(PHP 5)

date_sunset Retourne l'heure de coucher du soleil pour un jour et un endroit donnés

Description

mixed date_sunset ( int $timestamp [, int $format= SUNFUNCS_RET_STRING [, float $latitude= ini_get("date.default_latitude") [, float $longitude= ini_get("date.default_longitude") [, float $zenith= ini_get("date.sunset_zenith") [, float $gmt_offset= 0 ]]]]] )

date_sunset() retourne l'heure de couché du soleil pour un jour (spécifié en tant que timestamp Unix) et un endroit donnés.

Liste de paramètres

timestamp

Le timestamp Unix du jour pour lequel l'heure du couché du soleil est donnée.

format

Constantes pour le paramètre format
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

latitude

Par défaut, c'est le Nord. Passez une valeur négative pour le Sud. Voir aussi date.default_latitude.

longitude

Par défaut, c'est l'Est. Passez une valeur négative pour l'Ouest. Voir aussi date.default_longitude.

zenith

Par défaut : date.sunrise_zenith

gmtoffset

Spécifié en heures.

Erreurs / Exceptions

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()

Historique

Version Description
5.1.0

Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires.

Valeurs de retour

Retourne l'heure de couché du soleil dans un format spécifié, FALSE en cas d'échec.

Exemples

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_STRING38.4, -9901);

?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Mon Dec 20 2004, sunset time : 18:13

Voir aussi

  • date_sunrise() - Retourne l'heure de levé du soleil pour un jour et un endroit donnés



date_time_set

(PHP 5 >= 5.2.0)

date_time_setAlias de DateTime::setTime

Description

Cette fonction est un alias de : DateTime::setTime



date_timestamp_get

(PHP 5 >= 5.3.0)

date_timestamp_getAlias de DateTime::getTimestamp

Description

Cette fonction est un alias de : DateTime::getTimestamp



date_timestamp_set

(PHP 5 >= 5.3.0)

date_timestamp_setAlias de DateTime::setTimestamp

Description

Cette fonction est un alias de : DateTime::setTimestamp



date_timezone_get

(PHP 5 >= 5.2.0)

date_timezone_getAlias de DateTime::getTimezone

Description

Cette fonction est un alias de : DateTime::getTimezone



date_timezone_set

(PHP 5 >= 5.2.0)

date_timezone_setAlias de DateTime::setTimezone

Description

Cette fonction est un alias de : DateTime::setTimezone



date

(PHP 4, PHP 5)

dateFormate une date/heure locale

Description

string date ( string $format [, int $timestamp ] )

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().

Liste de paramètres

format

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".

Les caractères suivants sont reconnus dans le paramètre format
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().

timestamp

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().

Valeurs de retour

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.

Erreurs / Exceptions

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()

Historique

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 .

Exemples

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(000712000));

/* 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_ATOMmktime(000712000));
?>

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(000date("m")  , date("d")+1date("Y"));
$lastmonth mktime(000date("m")-1date("d"),   date("Y"));
$nextyear  mktime(000date("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().

Notes

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()).

Astuce

Un timestamp représentant le début de la requête est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.

Voir aussi



getdate

(PHP 4, PHP 5)

getdateRetourne la date/heure

Description

array getdate ([ int $timestamp= time() ] )

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.

Liste de paramètres

timestamp

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().

Valeurs de retour

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 :

Nom des clés du tableau associatif retourné
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.

Exemples

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
)

Voir aussi

  • date() - Formate une date/heure locale
  • time() - Retourne le timestamp UNIX actuel
  • setlocale() - Modifie les informations de localisation



gettimeofday

(PHP 4, PHP 5)

gettimeofdayRetourne l'heure actuelle

Description

mixed gettimeofday ([ bool $return_float ] )

C'est une interface avec gettimeofday(2). Elle retourne un tableau associatif qui contient les informations retournées par le système.

Liste de paramètres

return_float

Lorsque défini à TRUE, un nombre décimal est retourné à la place d'un tableau.

Valeurs de retour

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 :

  • "sec" : secondes depuis l'époque Unix
  • "usec" : microsecondes
  • "minuteswest" : minutes de décalage par rapport à Greenwich, vers l'Ouest.
  • "dsttime" : type de correction dst

Historique

Version Description
5.1.0 Le paramètre return_float a été ajouté.

Exemples

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



gmdate

(PHP 4, PHP 5)

gmdateFormate une date/heure GMT/CUT

Description

string gmdate ( string $format [, int $timestamp ] )

gmdate() est identique à la fonction date(), hormis le fait que le temps retourné est GMT (Greenwich Mean Time).

Liste de paramètres

format

Le format de la date en sortie. Voir les options de formatage pour la fonction date().

timestamp

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().

Valeurs de retour

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.

Historique

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 .

Exemples

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(000111998));
echo 
gmdate("M d Y H:i:s"mktime(000111998));
?>

Voir aussi

  • date() - Formate une date/heure locale
  • mktime() - Retourne le timestamp UNIX d'une date
  • gmmktime() - Retourne le timestamp UNIX d'une date GMT
  • strftime() - Formate une date/heure locale avec la configuration locale



gmmktime

(PHP 4, PHP 5)

gmmktimeRetourne le timestamp UNIX d'une date GMT

Description

int gmmktime ([ int $hour= gmdate("H") [, int $minute= gmdate("i") [, int $second= gmdate("s") [, int $month= gmdate("n") [, int $day= gmdate("j") [, int $year= gmdate("Y") [, int $is_dst= -1 ]]]]]]] )

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.

Liste de paramètres

hour

Les heures

minute

Les minutes

second

Les secondes

month

Le mois

day

Le jour

year

L'année

is_dst

Les paramètres représentent toujours une date GMT donc, le paramètre is_dst n'influence pas le résultat.

Valeurs de retour

Retourne un timestamp Unix de type entier.

Historique

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.

Exemples

Exemple #1 Exemple avec gmmktime()

<?php
gmmktime
(000111970);  // valide en GMT et l'ouest, invalide à l'est
?>

Voir aussi

  • mktime() - Retourne le timestamp UNIX d'une date
  • date() - Formate une date/heure locale
  • time() - Retourne le timestamp UNIX actuel



gmstrftime

(PHP 4, PHP 5)

gmstrftimeFormate une date/heure GMT/CUT en fonction de la configuration locale

Description

string gmstrftime ( string $format [, int $timestamp= time() ] )

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".

Liste de paramètres

format

Voir la description de la fonction strftime().

timestamp

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().

Valeurs de retour

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().

Exemples

Exemple #1 Exemple avec gmstrftime()

<?php
setlocale
(LC_TIME'en_US');
echo 
strftime("%b %d %Y %H:%M:%S"mktime(2000123198)) . "\n";
echo 
gmstrftime("%b %d %Y %H:%M:%S"mktime(2000123198)) . "\n";
?>

Voir aussi

  • strftime() - Formate une date/heure locale avec la configuration locale



idate

(PHP 5)

idateFormate une date/heure locale en tant qu'entier

Description

int idate ( string $format [, int $timestamp= time() ] )

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 .

Liste de paramètres

format

Les caractères suivants sont reconnus dans la chaîne de caractères du 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

timestamp

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().

Valeurs de retour

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.

Erreurs / Exceptions

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()

Historique

Version Description
5.1.0

Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires.

Exemples

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);
?>

Voir aussi

  • date() - Formate une date/heure locale
  • time() - Retourne le timestamp UNIX actuel



localtime

(PHP 4, PHP 5)

localtimeRécupère l'heure locale

Description

array localtime ([ int $timestamp= time() [, bool $is_associative= false ]] )

localtime() retourne un tableau identique à la structure retournée par la fonction C localtime.

Liste de paramètres

timestamp

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().

is_associative

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 :

  • "tm_sec" : secondes
  • "tm_min" : minutes
  • "tm_hour" : heure
  • "tm_mday" : jour du mois Les mois commencent à 0 (Janvier) à 11 (Décembre) et les jours de la semaine commencent à 0 (Dimanche) à 6 (Samedi).
  • "tm_mon" : mois de l'année, commence par 0 pour Janvier
  • "tm_year" : Année depuis 1900
  • "tm_wday" : Jour de la semaine
  • "tm_yday" : Jour de l'année
  • "tm_isdst" : Est-ce que l'heure d'hiver a pris effet ?

Erreurs / Exceptions

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()

Historique

Version Description
5.1.0

Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires.

Exemples

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
)



microtime

(PHP 4, PHP 5)

microtimeRetourne le timestamp UNIX actuel avec les microsecondes

Description

mixed microtime ([ bool $get_as_float ] )

microtime() retourne le timestamp Unix, avec les microsecondes. Cette fonction est uniquement disponible sur les systèmes qui supportent la fonction gettimeofday().

Liste de paramètres

get_as_float

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.

Historique

Version Description
5.0.0 Le paramètre get_as_float a été ajouté.

Exemples

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";
?>

Voir aussi

  • time() - Retourne le timestamp UNIX actuel



mktime

(PHP 4, PHP 5)

mktime Retourne le timestamp UNIX d'une date

Description

int mktime ([ int $hour= date("H") [, int $minute= date("i") [, int $second= date("s") [, int $month= date("n") [, int $day= date("j") [, int $year= date("Y") [, int $is_dst= -1 ]]]]]]] )

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.

Liste de paramètres

hour

L'heure.

minute

Les minutes

second

Les secondes.

month

Le nombre représentant le mois.

day

Le nombre représentant le jour.

year

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).

is_dst

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.

Valeurs de retour

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).

Erreurs / Exceptions

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()

Historique

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.

Exemples

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(000712000));

// Affiche quelque chose comme : 2006-04-05T01:02:03+00:00
echo date('c'mktime(123452006));
?>

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(00012321997));
echo 
date("M-d-Y"mktime(0001311997));
echo 
date("M-d-Y"mktime(000111998));
echo 
date("M-d-Y"mktime(0001198));
?>

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(000302000);
echo 
strftime("Le dernier jour de Fevrier 2000 est : %d"$lastday);
$lastday mktime(0004, -312000);
echo 
strftime("Le dernier jour de Fevrier 2000 est : %d"$lastday);
?>

Notes

Attention

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.

Voir aussi

  • gmmktime() - Retourne le timestamp UNIX d'une date GMT
  • date() - Formate une date/heure locale
  • time() - Retourne le timestamp UNIX actuel



strftime

(PHP 4, PHP 5)

strftimeFormate une date/heure locale avec la configuration locale

Description

string strftime ( string $format [, int $timestamp= time() ] )

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.

Liste de paramètres

format

Les caractères suivants sont reconnus dans le paramètre format
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.

Avertissement

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.

timestamp

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().

Valeurs de retour

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().

Erreurs / Exceptions

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()

Historique

Version Description
5.1.0

Émet un message de type E_STRICT et E_NOTICE lors d'erreurs de fuseaux horaires.

Exemples

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";

?>

Notes

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.

Voir aussi



strptime

(PHP 5 >= 5.1.0)

strptime Analyse une date générée par strftime()

Description

array strptime ( string $date , string $format )

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).

Liste de paramètres

date (string)

La chaîne à analyser (e.g. retourné par strftime())

format (string)

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().

Valeurs de retour

Retourne un tableau, ou FALSE en cas d'erreur.

Les paramètres suivants sont retournés dans le tableau
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é.

Exemples

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] =>
)

Notes

Note: Cette fonction n'est pas implémentée sous Windows.

Voir aussi

  • strftime() - Formate une date/heure locale avec la configuration locale



strtotime

(PHP 4, PHP 5)

strtotimeTransforme un texte anglais en timestamp

Description

int strtotime ( string $time [, int $now ] )

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).

Liste de paramètres

time

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.

now

Le timestamp, représentant la date courante, utilisé pour le calcul relative des dates.

Valeurs de retour

Retourne un timestamp en cas de succès, FALSE sinon. Avant PHP 5.1.0, cette fonction retournait -1 en cas d'échec.

Erreurs / Exceptions

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()

Historique

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.

Exemples

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);
}
?>

Notes

Avertissement

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.

Avertissement

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.

Voir aussi

  • strptime() - Analyse une date générée par strftime



time

(PHP 4, PHP 5)

timeRetourne le timestamp UNIX actuel

Description

int time ( void )

time() retourne l'heure courante, mesurée en secondes depuis le début de l'époque UNIX, (1er janvier 1970 00:00:00 GMT).

Exemples

Exemple #1 Exemple avec time()

<?php
$nextWeek 
time() + (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

Notes

Astuce

Un timestamp représentant le début de la demande est disponible dans la variable $_SERVER['REQUEST_TIME'] depuis PHP 5.1.

Voir aussi

  • date() - Formate une date/heure locale
  • microtime() - Retourne le timestamp UNIX actuel avec les microsecondes



timezone_abbreviations_list

(PHP 5 >= 5.1.0)

timezone_abbreviations_listAlias de DateTimeZone::listAbbreviations

Description

Cette fonction est un alias de : DateTimeZone::listAbbreviations



timezone_identifiers_list

(PHP 5 >= 5.1.0)

timezone_identifiers_listAlias de DateTimeZone::listIdentifiers

Description

Cette fonction est un alias de : DateTimeZone::listIdentifiers



timezone_location_get

(PHP 5 >= 5.3.0)

timezone_location_getAlias de DateTimeZone::getLocation

Description

Cette fonction est un alias de : DateTimeZone::getLocation



timezone_name_from_abbr

(PHP 5 >= 5.1.3)

timezone_name_from_abbrRetourne le nom du fuseau horaire à partir de son abréviation

Description

string timezone_name_from_abbr ( string $abbr [, int $gmtOffset= -1 [, int $isdst= -1 ]] )

Liste de paramètres

abbr

Abréviation du fuseau horaire.

gmtOffset

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é.

isdst

Indicateur d'heure avancée. Si abbr n'existe pas, alors le fuseau horaire est recherché seulement par offset et isdst .

Valeurs de retour

Retourne un nom de fuseau horaire en cas de succès ou FALSE en cas d'échec.

Exemples

Exemple #1 Exemple avec timezone_name_from_abbr()

<?php
echo timezone_name_from_abbr("CET") . "\n";
echo 
timezone_name_from_abbr(""36000) . "\n";
?>

L'exemple ci-dessus va afficher quelque chose de similaire à :

Europe/Berlin
Europe/Paris

Voir aussi



timezone_name_get

(PHP 5 >= 5.1.0)

timezone_name_getAlias de DateTimeZone::getName

Description

Cette fonction est un alias de : DateTimeZone::getName



timezone_offset_get

(PHP 5 >= 5.1.0)

timezone_offset_getAlias de DateTimeZone::getOffset

Description

Cette fonction est un alias de : DateTimeZone::getOffset



timezone_open

(PHP 5 >= 5.1.0)

timezone_openRetourne un nouvel objet DateTimeZone

Description

DateTimeZone timezone_open ( string $timezone )

Liste de paramètres

timezone

Identifiant du fuseau horaire, sous forme de nom complet (par exemple Europe/Prague) ou son abréviation (par exemple CET).

Valeurs de retour

Retourne un objet DateTimeZone en cas de succès ou FALSE en cas d'échec.



timezone_transitions_get

(PHP 5 >= 5.2.0)

timezone_transitions_getAlias de DateTimeZone::getTransitions

Description

Cette fonction est un alias de : DateTimeZone::getTransitions



timezone_version_get

(PHP 5 >= 5.3.0)

timezone_version_get Lit la version de la timezonedb

Description

string timezone_version_get ( void )

timezone_version_get() lit la version de la timezonedb.

Valeurs de retour

Retourne une chaîne de caractères.

Exemples

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


Sommaire





Extensions spécifiques à la ligne de commande


Newt


Introduction

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.



Installation/Configuration

Sommaire


Pré-requis

Ce module utilise les fonctions de la bibliothèque RedHat Newt. Vous aurez besoin de la version libnewt >= 0.51.0.



Installation

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



Configuration à l'exécution

Cette extension ne définit aucune directive de configuration.



Types de ressources

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())




Constantes pré-définies

Sommaire

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.


Raisons de sortie de Newt

Raisons de sortie de Newt
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é


Newt colorsets

Newt colorsets
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  


Drapeaux d'argument Newt

Drapeaux d'argument Newt
Constante Signification
NEWT_ARG_LAST  
NEWT_ARG_APPEND  


Sens des Drapeaux Newt

Sens des Drapeaux Newt
Constante Signification
NEWT_FLAGS_SET  
NEWT_FLAGS_RESET  
NEWT_FLAGS_TOGGLE  


Drapeaux des Composants Newt

Drapeaux des Composants Newt
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


Drapeaux de pointeur de fichier

Drapeaux de pointeur de fichier
Constante Signification
NEWT_FD_READ  
NEWT_FD_WRITE  
NEWT_FD_EXCEPT  


Drapeaux d'Arbre de Cases à Cocher

Drapeaux d'Arbre de Cases à Cocher
Constante Signification
NEWT_CHECKBOXTREE_UNSELECTABLE  
NEWT_CHECKBOXTREE_HIDE_BOX  
NEWT_CHECKBOXTREE_COLLAPSED  
NEWT_CHECKBOXTREE_EXPANDED  
NEWT_CHECKBOXTREE_UNSELECTED  
NEWT_CHECKBOXTREE_SELECTED  


Drapeaux d'Entrée

Drapeaux d'Entrée
Constante Signification
NEWT_ENTRY_SCROLL  
NEWT_ENTRY_HIDDEN  
NEWT_ENTRY_RETURNEXIT  
NEWT_ENTRY_DISABLED  


Drapeaux de Liste

Drapeaux de Liste
Constante Signification
NEWT_LISTBOX_RETURNEXIT  


Drapeaux de Boîte Texte

Drapeaux de Boîte Texte
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


Drapeaux de Formulaire

Drapeaux de Formulaire
Constante Signification
NEWT_FORM_NOF12 Ne sort pas de la forme en appuyant sur F12


Clés Newt

Clés Newt
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  


Ancres Newt

Ancres Newt
Constante Signification
NEWT_ANCHOR_LEFT  
NEWT_ANCHOR_RIGHT  
NEWT_ANCHOR_TOP  
NEWT_ANCHOR_BOTTOM  


Drapeaux de Grille

Drapeaux de Grille
Constante Signification
NEWT_GRID_FLAG_GROWX  
NEWT_GRID_FLAG_GROWY  
NEWT_GRID_EMPTY  
NEWT_GRID_COMPONENT  
NEWT_GRID_SUBGRID  



Exemples

Sommaire


Utilisation simple

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 (00"Test Mode Setup Utility 1.12");
newt_push_help_line (null);
newt_draw_root_text (-300"(c) 1999-2002 RedHat, Inc");

newt_get_screen_size ($rows$cols);

newt_open_window ($rows/2-17$cols/2-103417"Choose a Tool");

$form newt_form ();

$list newt_listbox (3210);

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 (512"Run Tool");
$b2 newt_button (2112"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);
?>



Fonctions Newt


newt_bell

(PECL newt >= 0.1)

newt_bellEnvoie un beep au terminal

Description

void newt_bell ( void )

Cette fonction envoie un beep au terminal.

Note: Dépendemment des configurations du terminal, le beep peut être ou ne peut être audible.

Valeurs de retour

Aucune valeur n'est retournée.



newt_button_bar

(PECL newt >= 0.1)

newt_button_barRetourne une grille contenant les boutons créés

Description

resource newt_button_bar ( array &$buttons )

Cette fonction retourne une grille contenant les boutons créés.

Liste de paramètres

buttons

Valeurs de retour

Retourne une grille, contenant les boutons créés.



newt_button

(PECL newt >= 0.1)

newt_buttonCrée un nouveau bouton

Description

resource newt_button ( int $left , int $top , string $text )

Crée un nouveau bouton.

Liste de paramètres

left

Coordonnée X du bouton.

top

Coordonnée Y du bouton.

text

Le texte qui devrait apparaître dans le bouton.

Valeurs de retour

Retourne une ressource du composant bouton créé ou FALSE en cas d'erreur.

Exemples

Exemple #1 Exemple avec newt_button()

<?php

$form 
newt_form();

$ok_button newt_button(512"Run Tool");
    
newt_form_add_component($form$ok_button);

?>

Voir aussi



newt_centered_window

(PECL newt >= 0.1)

newt_centered_windowOuvre une fenêtre centrée de la taille spécifiée

Description

int newt_centered_window ( int $width , int $height [, string $title ] )

Ouvre une fenêtre centrée de la taille spécifiée.

Liste de paramètres

width

Largeur de la fenêtre

height

Hauteur de la fenêtre

title

Titre de la fenêtre

Valeurs de retour

Valeur non définie.

Voir aussi



newt_checkbox_get_value

(PECL newt >= 0.1)

newt_checkbox_get_valueRécupère la valeur de la ressource de boîte à cocher

Description

string newt_checkbox_get_value ( resource $checkbox )

Cette fonction retourne le caractère dans la séquence qui indique la valeur courante de la boîte à cocher.

Liste de paramètres

checkbox

Valeurs de retour

Retourne le caractère indiquant la valeur de la boîte à cocher.



newt_checkbox_set_flags

(PECL newt >= 0.1)

newt_checkbox_set_flagsConfigure une ressource de boîte à cocher

Description

void newt_checkbox_set_flags ( resource $checkbox , int $flags , int $sense )

Cette fonction permet de définir divers drapeaux d'une ressource de boîte à cocher.

Liste de paramètres

checkbox

flags

sense

Valeurs de retour

Aucune valeur n'est retournée.



newt_checkbox_set_value

(PECL newt >= 0.1)

newt_checkbox_set_valueDéfinit la valeur de la boîte à cocher

Description

void newt_checkbox_set_value ( resource $checkbox , string $value )

Cette fonction permet de définir la valeur courante de la ressource de boîte à cocher.

Liste de paramètres

checkbox

value

Valeurs de retour

Aucune valeur n'est retournée.



newt_checkbox_tree_add_item

(PECL newt >= 0.1)

newt_checkbox_tree_add_itemAjout un nouvel élément à l'arbre des boîtes à cocher

Description

void newt_checkbox_tree_add_item ( resource $checkboxtree , string $text , mixed $data , int $flags , int $index [, int $... ] )

Cette fonction permet d'ajout un nouvel élément l'arbre des boîtes à cocher.

Liste de paramètres

checkboxtree

text

data

flags

index

Valeurs de retour

Aucune valeur n'est retournée.



newt_checkbox_tree_find_item

(PECL newt >= 0.1)

newt_checkbox_tree_find_itemCherche un élément dans l'arbre des boîtes à cocher

Description

array newt_checkbox_tree_find_item ( resource $checkboxtree , mixed $data )

Cherche un élément dans l'arbre des boîtes à cocher.

Liste de paramètres

checkboxtree

data

Valeurs de retour

Retourne la ressource de l'élément de l'arbre de boîtes à cocher, ou NULL s'il n'a pas été trouvé.



newt_checkbox_tree_get_current

(PECL newt >= 0.1)

newt_checkbox_tree_get_currentRetourne l'élément sélectionné de l'arbre des boîtes à cocher

Description

mixed newt_checkbox_tree_get_current ( resource $checkboxtree )

Cette méthode retourne l'élément sélectionné de l'arbre des boîtes à cocher.

Liste de paramètres

checkboxtree

Valeurs de retour

Retourne l'élément courant (sélectionné) de l'arbre des boîtes à cocher.



newt_checkbox_tree_get_entry_value

(PECL newt >= 0.1)

newt_checkbox_tree_get_entry_value

Description

string newt_checkbox_tree_get_entry_value ( resource $checkboxtree , mixed $data )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Liste de paramètres

checkboxtree

data

Valeurs de retour



newt_checkbox_tree_get_multi_selection

(PECL newt >= 0.1)

newt_checkbox_tree_get_multi_selection

Description

array newt_checkbox_tree_get_multi_selection ( resource $checkboxtree , string $seqnum )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Liste de paramètres

checkboxtree

seqnum

Valeurs de retour



newt_checkbox_tree_get_selection

(PECL newt >= 0.1)

newt_checkbox_tree_get_selection

Description

array newt_checkbox_tree_get_selection ( resource $checkboxtree )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Liste de paramètres

checkboxtree

Valeurs de retour



newt_checkbox_tree_multi

(PECL newt >= 0.1)

newt_checkbox_tree_multi

Description

resource newt_checkbox_tree_multi ( int $left , int $top , int $height , string $seq [, int $flags ] )
Avertissement

Cette fonction n'est pas documentée et seule la liste des arguments est disponible.

Liste de paramètres

left

top

height

seq

flags

Valeurs de retour



newt_checkbox_tree_set_current

(PECL newt >= 0.1)

newt_checkbox_tree_s