Programmation PHP/Version imprimable1
Une version à jour et éditable de ce livre est disponible sur Wikilivres,
une bibliothèque de livres pédagogiques, à l'URL :
https://fr.wikibooks.org/wiki/Programmation_PHP
Introduction
Historique
modifierPHP est un langage de script créé par Rasmus Lerdorf en 1995. Principalement utilisé pour la programmation Web, on pourrait le situer entre les SSI (Server Side Includes) et le langage de script Perl. Il est utilisable sur tous les systèmes d'exploitation, donc sur Windows, MacOS, GNU-Linux ou autre Unix commercial, ce qui en fait un langage très portatif.
La sortie de PHP 5 en 2004 a permis au langage d'atteindre une certaine maturité, pour être reconnu comme un serveur d'application à part entière tel que JEE ou .Net.
PHP a ensuite acquis une place incontournable dans le développement Web Open Source. Sa popularité vient de sa syntaxe, proche du C, de sa vitesse et de sa simplicité. En 2013, on estime qu'il y a plus de 244 millions de serveurs qui utilisent le langage. En 2016 il est utilisé dans plus de 80 % des sites Internet, et toujours 77,5 % en août 2022[1].
PHP 5
modifierLes nouvelles fonctionnalités du PHP 5 (paru en 2004) concernent surtout la programmation orientée objet[2] :
- interfaces
- classes abstraites
- constructeurs et destructeurs de classes (ainsi que d'autres méthodes magiques)
- portée des attributs et méthodes (public, protected, private)
- attributs et méthodes statiques
- attributs et méthodes finaux
- type hinting de classe.
PHP 7
modifierLes principales fonctionnalités apportées par PHP 7 (depuis 2015) sont[3] :
- typage strict par classe
- paramètres typés
- retours de méthode typés
- opérateur de coalescence null (??)
- opérateur vaisseau spatial (<=>)
- tableaux de constantes
- classes anonymes
- groupage des déclarations (use, avec des accolades).
PHP 8
modifierNouvelles fonctionnalités du PHP 8.0 en 2020[4][5] :
- paramètres nommés
- types d'union (X|Y)
- propriétés promues (déclarations dans le constructeur)
- autorisation d'une virgule de fin dans les paramètres
- autorisation des méthodes abstraites dans les traits
- autorisation des indices négatifs dans les tableaux autoincrémentés
- l'instruction
match
- opérateur null-safe (?->)
- fonction
str_contains()
- fonction
str_starts_with()
etstr_ends_with()
- fonction
get_debug_type()
: il s'agit d'ungettype()
plus précis, car il renvoie le nom de la classe au lieu de "object
" - exécution juste-à-temps (JIT), pour améliorer les performances : plus de 20 % de requêtes en plus par seconde[6].
8.1
modifierPour PHP 8.1, sorti en novembre 2021 :
- types d'intersection (X&Y)
- type de retour
never
- constantes de classe finales
- énumérations
- fibres (threads virtuels pilotés par la classe Fiber)
- fonction array_is_list()
- attributs en lecture seule (readonly).
8.2
modifierPHP 8.2 est sorti le 8 décembre 2022[7] :
- classes en lecture seule :
readonly class
signifie que tous les arguments de son constructeur son implicitement enreadonly
. - types
null
,true
etfalse
. - constantes dans les traits.
- Forme normale disjonctive de type (combinaison de l'union et de l'intersection).
8.3
modifierPHP 8.3 sort le 23 novembre 2023[8] :
- classes anonymes en lecture seule.
- constantes typées.
- fonction "json_validate".
Sites Web statiques ou dynamiques
modifierÀ l'origine du Web, les sites Web étaient des sites statiques : constitués d'un ensemble de pages écrites dans le langage HTML. L'information présente sur ces pages était toujours identique et leur mise à jour était particulièrement fastidieuse. Le serveur Web se contentait de diffuser les pages telles quelles à l'utilisateur. L'interaction entre le site et l'utilisateur était très sommaire : l'utilisateur demandait une page web et le serveur la lui fournissait.
Aujourd'hui la plupart des sites sont dynamiques : à l'intérieur des pages HTML, le concepteur du site a inséré des programmes. Ces programmes permettent une plus grande souplesse dans la gestion du site, sa mise à jour et ses fonctionnalités. La possibilité d'insérer des programmes a permis de décupler les fonctionnalités des sites Web.
Pour vous en convaincre prenons quelques exemples :
- Vous voulez écrire un site qui présente une centaine de produits. Vous n'allez pas écrire 100 pages différentes, une pour chacun des produits ! Mais plutôt une seule page (page type) permettant de présenter n'importe quel produit. Cette page va contenir un programme qui interagira avec une base de données. Dans la base de données, seront stockées les informations utiles pour chaque produit : le nom du produit, sa présentation, sa référence, son prix, etc. Le programme aura donc pour rôle d'aller chercher l'information utile dans la base de données et de l'afficher en HTML. De plus, pour ajouter un produit, il suffira d'ajouter un élément dans la base de données. Il est même possible d'avoir des programmes permettant de passer une commande pour vos différents produits !
- Vous voulez diffuser rapidement des informations sur Internet : vous voulez avoir un outil convivial qui vous permet d'ajouter un article, de le modifier, de le supprimer... Vous allez donc écrire un programme permettant de modifier à volonté les différents articles. Un exemple bien connu de ce type de programme est le blog : il s'agit d'un programme permettant à n'importe quel utilisateur non informaticien de gérer ses différents articles.
- L'encyclopédie Wikipédia est réalisée avec un programme (en PHP d'ailleurs) qui permet à chaque utilisateur de créer et de modifier les articles tout en gardant un historique complet des différentes versions des articles.
- les forums de discussion sont des lieux d'échange permettant une interaction étroite entre le serveur et l'utilisateur. Grâce aux programmes qu'ils utilisent, il est possible de se connecter, de consulter les messages des différents forums, d'y répondre. Les modérateurs de ces forums peuvent modifier les messages, les supprimer, interdire un utilisateur indélicat.
Dans chacun des exemples précédents il a été nécessaire d'incorporer un programme à l'intérieur des pages du site afin de réaliser des fonctionnalités de haut niveau. Aujourd'hui la quasi-totalité des sites professionnels sont dynamiques et il est quasi inconcevable de réaliser un site statique. Le langage PHP est un des langages utilisables pour réaliser facilement les sites Web dynamiques, ne serait-ce que parce qu'il est disponible sur la plupart des serveurs hébergeant des sites.
Possibilités
modifierSi vous êtes déjà allés sur un site qui vous demandait de vous connecter, vous avez utilisé un script côté serveur. Ce script était certainement écrit en PHP, en raison de la popularité de ce dernier.
PHP transforme une page statique (fichier HTML par exemple), en une suite d'instructions interprétables par PHP, installée sur un serveur Web comme Apache - ça peut-être simplement un "Hello World" 50 fois dans une colonne, ou une interaction avec un système de base de données, comme MySQL, fréquemment couplé à PHP.
Mais PHP peut aussi servir à programmer des batchs sans page web aucune.
Les premières versions de PHP étaient faiblement typées, mais depuis la version 7 il est possible de forcer un typage fort dans un fichier en lui ajoutant :
declare(strict_types = 1);
Références
modifier- ↑ https://w3techs.com/technologies/details/pl-php
- ↑ https://www.web24.com.au/tutorials/features-of-php5
- ↑ https://www.php.net/manual/fr/migration70.new-features.php
- ↑ https://kinsta.com/fr/blog/php-8/
- ↑ https://php.developpez.com/actu/335682/PHP-8-2-est-disponible-en-beta-2-Cette-version-propose-null-true-et-false-en-tant-que-types-autonomes-ainsi-que-des-constantes-dans-les-traits/
- ↑ https://thecodingmachine.com/php-8-nouveautes-compatibilites-migration/
- ↑ https://stitcher.io/blog/new-in-php-82
- ↑ https://www.phparch.com/2023/08/whats-new-and-exciting-in-php-8-3/
Installer PHP
Principe
modifierDans la cadre d'un apprentissage, des sites comme http://phpfiddle.org/ ou Tutorialspoint permettent d'exécuter ponctuellement des petits scripts PHP sans rien installer.
Par ailleurs, installer PHP seul permet d'exécuter des commandes shell (ex : php -v
donne la version, et php -i
toutes les infos telles que les paramètres de limite mémoire), mais le réel intérêt est d'installer PHP en complément d'un serveur HTTP, pour y publier des sites web.
Unix / Linux
modifierLAMP
modifierLogiciel tout-en-un pour Linux (Apache + MySQL + PHP), comme WAMP pour Windows.
# apt-get install tasksel
# tasksel install lamp-server
Installation manuelle
modifierApache sur Debian / Ubuntu
modifier# apt-get install apache2
Le service peut ne pas être lancé par défaut, mais même s'il l'est on peut quand-même essayer de l'activer avec :
# /etc/init.d/apache2 start
On peut ensuite tester le serveur, pour voir si une page s'affiche ou s'il refuse la connexion :
$ lynx http://localhost/
Cette adresse est le rebouclage, elle peut aussi être rentrée directement dans tout navigateur web.
Si Apache était déjà installé vérifier le fichier pour indiquer le démarrage automatique d'Apache 2 /etc/default/apache2 :
# vi /etc/default/apache2 ... NO_START=0
Installer PHP
modifierOn distingue principalement deux versions de PHP : celle dont le binaire est appelé par le serveur Web, et php-fpm qui possède son propre service daemon (aussi appelé par le serveur Web) testable ainsi :
telnet localhost 9000 CTRL + ALT + ] quit
FPM signifie FastCGI Process Manager, puisque le processus PHP-fpm écoute les requêtes CGI[1]. Cela peut se traduire soit par des requêtes TCP/IP, soit par un socket Unix (.sock dans le vhost).
PHP peut-être installé avec toutes les déclinaisons de la distribution Debian (stable, testing, unstable). Il suffit pour cela d'insérer vos lignes préférées dans le fichier /etc/apt/sources.list :
deb http://ftp.fr.debian.org/debian/ stable main non-free contrib deb-src http://ftp.fr.debian.org/debian/ stable main non-free contrib
Ce qui suit suppose que le serveur Web a bien été installé ; exécuter les commandes suivantes :
sudo apt-get update && apt-get install php8.2 && apt-get install libapache2-mod-php8.2
Une fois ces commandes exécutées, redémarrer le serveur Web. Dans le cas d'Apache cela s'effectue avec la commande suivante :
/etc/init.d/apache2 restart
Si tout s'est bien passé, vous disposez maintenant d'un serveur Web qui a la capacité d'exécuter des scripts PHP dans votre navigateur.
Testons :
$ lynx http://localhost/test.php
Pour débugger :
$ tail /var/log/apache2/error.log
Mise à jour
modifierPour PHP 7 ou 8 sur Ubuntu :
sudo add-apt-repository ppa:ondrej/php
Sur Debian :
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Puis :
sudo apt update sudo apt install php8.2 php8.2-common php8.2-cli php8.2-fpm sudo a2enmod php8.2
Une fois les serveurs Web installés, ils se lancent automatiquement à chaque démarrage de la machine, ce qui est souhaitable pour un serveur, mais pas toujours pour un PC. Pour éviter cela, il suffit d'y désactiver les daemons :
sudo update-rc.d apache2 disable sudo update-rc.d mysql disable
Bibliothèques
modifierVoici une liste de bibliothèques fréquemment utilisées dans les applications :
# apt-get install -y \ php8.2-mysql \ php8.2-cli \ php8.2-gd \ php8.2-curl \ php8.2-mbstring \ php8.2-xml
D'autres s'installent avec pecl au lieu de apt.
Pour les activer après installation, on peut éditer le php.ini ou lancer : phpenmod nom_du_module_php. Ex : sudo phpenmod gd
.
Pour les désactiver : phpdismod nom_du_module_php
Pour détecter l'emplacement du php.ini de la version de PHP par défaut : php --ini
.
Désinstaller PHP
modifierPour éviter de désinstaller tous les paquets PHP un par un (par exemple après une bascule de PHP7.0 vers PHP7.1), il existe "ppa-purge" :
sudo apt-get install ppa-purge sudo ppa-purge ppa:ondrej/php-7.0
Apache sur Gentoo
modifierPremièrement il faut installer Apache :
emerge apache
Ensuite, il faut installer PHP :
emerge dev-lang/php
Puis il faut qu'apache utilise PHP dans sa configuration.
Code : Configuration de apache |
# nano -w /etc/conf.d/apache2 APACHE2_OPTS="-D PHP5" |
MySQL seul
modifierMySQL est disponible sur http://dev.mysql.com/downloads/gui-tools/5.0.html au format :
- .msi (Windows)
- .dmg (Mac)
- .rpm (Linux)
- .tar
En l'absence de gestionnaire de paquets, utiliser le .tar ainsi :
shell> groupadd mysql shell> useradd -r -g mysql mysql shell> cd /usr/local shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql &
APT
modifier$ sudo apt-get install mysql-server mysql_secure_installation
Variante
modifierLa dénomination des paquets mentionnés peut varier légèrement selon la version. Dans un terminal, entrez :
$ sudo apt-get install mysql-server
et confirmez.
(Remarque : il semblerait qu'en installant le paquet "mysql-server-5.0", au lieu du paquet mentionné plus haut, certaines personnes rencontrent des problèmes. Il est donc préférable d'installer ce paquet, ou d'installer la dernière version 4 stable avec : $ sudo apt-get install mysql-server-4.1. Consultez le forum pour plus d'informations : [1])
Lancez ensuite la commande :
cd && sudo mysql_secure_installation
Appuyez sur Entrée lorsqu'il vous demande le mot de passe root MySQL : pour le moment il n'y en a pas.
Le script vous demande alors si vous voulez mettre un mot de passe pour l'utilisateur root. Répondez Y, et entrez (2 fois le nouveau mot de passe du root MySQL). Il vous pose ensuite une série de questions. Si vous ne savez pas quoi répondre, acceptez les choix par défaut en appuyant simplement sur Enter.
Votre serveur MySQL est prêt. Par défaut il se lance à chaque démarrage du système, si vous ne le souhaitez pas, il vous suffit de lancer :
$ sudo dpkg-reconfigure mysql-server
et de répondre "Non" à la question du démarrage systématique de MySQL.
Sur Gentoo
modifieremerge mysql
Modules
modifierDe nombreux modules complémentaires peuvent être installés sur Apache.
Pour les lister, on utilise apachectl
(parfois apache2ctl
) :
apachectl -t -D DUMP_MODULES
ou
apache2ctl -M
Pour activer un module :
a2enmod Nom_du_module
Un fichier est alors créé dans /etc/apache2/mods-enabled/.
Exemple pour la réécriture d'URL :
a2enmod rewrite
Pour le désactiver :
a2dismod Nom_du_module
La configuration du module reste toutefois disponible dans /etc/apache2/mods-available/.
phpenmod mbstring
Sites
modifierPour lister les sites du serveur :
apachectl -S
Pour activer un site :
a2ensite Nom_du_site
Le fichier du site est alors visible dans /etc/apache2/sites-enabled/.
Pour le désactiver :
a2dissite Nom_du_site
Le site est dans /etc/apache2/sites-available/.
Problème d'encodage d'Apache2
modifierSi vous rencontrez un problème d'encodage des caractères de vos pages, par exemple les caractères accentués apparaissant sous la forme "�" (<?>), c'est probablement parce qu'Apache2 déclare dans les en-têtes HTTP qui accompagnent les pages visionnées un encodage par défaut en Unicode (UTF-8) :
Content-Type: text/html; charset=UTF-8
Tandis que les pages visionnées utilisent un autre encodage des caractères, comme par exemple Latin1 (ISO-8859-1). Même si vos documents indiquent le jeu de caractères utilisé, le paramètre donné par le serveur dans les en-têtes HTTP est prioritaire !
Pour corriger ce problème, il faudra éditer /etc/apache2/apache2.conf :
$ sudo gedit /etc/apache2/apache2.conf
Encodage par défaut en Latin1 (ISO-8859-1)
modifierCherchez la ligne suivante :
#AddDefaultCharset ISO-8859-1
Décommentez-la en enlevant le # :
AddDefaultCharset ISO-8859-1
Pour ceux qui ont la locale iso-8859-15 (sinon vous pouvez faire "sudo dpkg-reconfigure locales" pour l'ajouter) et qui désirent l'utiliser par défaut, ajoutez un 5 en fin de ligne :
AddDefaultCharset ISO-8859-15
ainsi que la ligne suivante dans le paragraphe en-dessous :
AddCharset ISO-8859-15 .iso8859-15 .latin15 .fr
Il ne vous reste plus qu'à mettre "fr" en première position dans la ligne LanguagePriority (juste au-dessus), et à demander à apache de relire sa configuration :
$ sudo /etc/init.d/apache2 reload
Aucun encodage par défaut
modifierIl est également possible de s'affranchir de tout encodage par défaut, de la manière suivante :
Cherchez la directive AddDefaultCharset :
AddDefaultCharset ISO-8859-1
Remplacez l'attribut par la valeur Off :
AddDefaultCharset Off
Là encore, on demandera à Apache de relire sa configuration :
$ sudo /etc/init.d/apache2 reload
Maintenant, les en-têtes HTTP ne contiendront plus d'indication d'encodage des caractères. Attention : il faudra alors que chaque page indique l'encodage utilisé, car s'en remettre à la détection automatique par les navigateurs peut s'avérer assez aléatoire !
Windows
modifierTout-en-un
modifierDes logiciels tout-en-un (serveur Web, base de donnée MySQL, et PHP) permettent de s'affranchir d'une installation fastidieuse et rédhibitoire pour le débutant :
- EasyPHPtéléchargement : n'a pas vocation à être installé pour de la production, mais pour le développement. Il stocke les bases de données dans C:\Program Files (x86)\EasyPHP\binaries\mysql\data.
- WAMPtéléchargement : est du même type qu'EasyPHP : ce logiciel installe facilement un serveur Web Apache, une base de données MySQL et PHP 4 et 5. Il a l'avantage de permettre de passer facilement de PHP 4 à PHP 5, sans avoir à refaire une installation ou une compilation. Tout comme EasyPHP, c'est un environnement de développement, et non un environnement de production. Attention : la résolution des noms d'hôtes se réalise séparément. Les installations WAMP servent à tester en local sur votre PC. Dans la plupart des cas, il suffit d'utiliser le fichier Hosts local, comme on le ferait sur une machine Linux, afin de lier des noms aux adresses IP. Dans Windows XP, Vista et 7, ce fichier se trouve dans le répertoire systemroot\System32\Drivers\Etc. Il peut se faire que le service ait déjà été configuré. Lorsque vous vous en doutez, contactez votre administrateur réseau. Remarque : vous trouverez une liste des possibilités de résolution de noms avec MS Windows sur Microsoft.com.
- XAMPPtéléchargement : est du même type qu'EasyPHP ou WAMP, le deuxième P étant pour Perl. Son usage est recommandé avec PHPEclipse, et il fournit aussi un serveur Apache Tomcat par défaut.
- The Uniform Servertéléchargement : en anglais seulement avec Apache2, Perl5, PHP5, MySQL5, phpMyAdmin.
Sur Windows 10 pro, le serveur IIS est installé par défaut, et oblige Apache à changer de port (888 au lieu de 80) lors de l'installation. Pour résoudre cela il suffit de décocher Internet Information Services dans Programmes et fonctionnalités, Activer ou désactiver des fonctionnalités Windows.
De même, le port MySQL est susceptible de passer de 3306 à 3388.
Sur Windows 10, EasyPHP development server (alias Devserver, la version rouge) ne fonctionne pas (il manque MSVCR110.dll), mais EasyPHP hosting server (alias Webserver, la bleue) tourne normalement. Or, elle se lance automatiquement à chaque démarrage, ce qui le ralentit significativement. Pour éviter cela, exécuter services.msc, puis passer les trois services ci-dessous en démarrage manuel. Ensuite pour les lancer à souhait (en tant qu'administrateur), créer un script MySQL.cmd contenant les lignes suivantes :
net start ews-dbserver net start ews-httpserver net start ews-dashboard pause net stop ews-dashboard net stop ews-httpserver net stop ews-dbserver
Message d'erreur relatif à SSL
modifierPour l'instant, WAMP ne supporte pas encore le Secure Socket Layer (SSL). L'installation se finit par un message qui vous informe de ce fait. Afin de pouvoir travailler sans problèmes, éditez le fichier c:\windows\php.ini. Cherchez dans ce fichier la ligne qui commence avec extension=php_openssl.dll. Commentez cette ligne en la faisant précéder d'un point-virgule :
;extensions=php_openssl.dll
Si tout se passe bien, vous pouvez ouvrir la page de test dans votre navigateur.
Installation manuelle
modifier- Apache est disponible sur le site Web de Apache Software Foundation apache.org.
- PHP est téléchargeable sur le site officiel de php. Choisissez le fichier au format ZIP.
- Enfin, vous trouverez MySQL sur mysql.com.
Installer Apache
modifierPour installer Apache, double-cliquez sur le fichier exécutable, et suivez les instructions d'installation automatique.
Si vous installez Apache sur un ordinateur de développement, renseignez le champ "nom de domaine" avec la valeur localhost
.
Si vous installez un serveur de production et que vous disposez d'un nom de domaine, vous devriez disposer des informations nécessaires concernant votre nom de domaine, fournies par le registrar.
Une fois l'installation terminée, il faut encore indiquer à Apache qu'il doit fonctionner conjointement avec PHP, car il ne sait pas les traiter par défaut. Pour cela, il faut modifier les informations de configuration d'Apache, contenues dans le fichier httpd.conf
, qui se trouve dans le dossier d'installation d'Apache, dans le sous-dossier conf
.
Installer PHP
modifierUne fois l'archive téléchargée, décompressez-la à la racine de votre disque dur et renommez le dossier en 'PHP'
.
Dans le dossier PHP
, vous trouverez deux fichiers: php.ini-dist
et php.ini-recommended
. Copiez php.ini-recommended
dans votre dossier C:\Windows
ou C:\winnt
(le nom du dossier dépend de la version de votre système.
renommez-le en php.ini
.
Ce fichier est le fichier de configuration qui contrôle les options dont vous disposerez. Par exemple :
PHP.ini | PHP | Rôle |
---|---|---|
error_reporting E_ALL |
error_reporting(E_ALL); |
Affiche tous les avertissements et erreurs directement sur le site. C'est utile pour la préproduction car cela évite de rechercher d'éventuels messages dans les logs, mais peut perturber la mise en page pour des avertissements bénins. |
error_reporting 0 |
error_reporting(0); |
N'affiche aucun message sur le site relatif à son exécution |
max_execution_time = 300 |
set_time_limit(300); |
Définit le "timeout", c'est-à-dire le temps maximum en secondes autorisé pour exécuter un script PHP. |
post_max_size = 80M |
ini_set('post_max_size', '80M'); |
Définit la taille maximum d'un fichier que l'on peut envoyer au serveur en HTTP. |
MySQL
modifierTélécharger et installer le .msi sur http://dev.mysql.com/downloads/gui-tools/5.0.html.
Pour arrêter, démarrer, démarrer automatiquement le serveur MySQL vous devez aller dans la gestion des services (Démarrer/Exécuter/services.msc).
Apache CGI ou module ?
modifierOn peut configurer Apache pour utiliser PHP comme binaire CGI, ou comme module.
L'installation en module offre de meilleures garanties en matière de sécurité, de meilleures performances, et certaines fonctionnalités absentes de l'installation en CGI. Cette installation est cependant un peu plus difficile (mais rassurez-vous, pas tellement plus que l'installation CGI), aussi nous intéresserons nous à celle-ci.
- Dans le répertoire de PHP, trouvez la DLL
php5ts.dll
, et copiez-la dans le répertoire d'Apache. - Ouvrez ensuite le fichier
httpd.conf
. On en a déjà parlé plus tôt, vous vous souvenez où il est, n'est-ce pas ? - Dans ce fichier, ajouter cette ligne qui permet à Apache de savoir que l'extension
.php
concerne l'utilisation du module PHP :AddType application/x-httpd-php .php
- Puis, ajoutez ces deux lignes qui charge et exécute (respectivement) le module PHP5 au démarrage du serveur :
LoadModule php5_module c:\php\php5apache.dll
AddModule mod_php5.c
Enregistrez le fichier httpd.conf
et fermez-le.
IIS
modifierIIS est activé automatiquement sur Windows Server et Windows 10, et peut l'être manuellement pour les versions antérieures, dans le panneau de configuration, Activer ou désactiver des fonctionnalités de Windows. C'est également là que l'on peut le désactiver pour donner le port 80 à Apache.
Son processus est issu de C:\Windows\System32\inetsrv\w3wp.exe et est lancé en tant que "Service réseau". Ce compte local devra donc avoir le droit de lecture sur les fichiers du site web.
Sur Windows Server uniquement, lors de la première utilisation il faut ajouter le rôle Serveur Web dans le Gestionnaire de serveur, accessible dans le menu démarrer, Tous les programmes, Outils d'administration[2]. Puis pour ce rôle il faut cocher plusieurs services de rôle :
- CGI[3] (sous peine d'erreurs 500 à chaque commande PHP).
- ODBC pour les connexions aux bases de données.
- ...
Télécharger et installer ensuite le manager PHP[4] pour pouvoir configurer PHP dans :
- Le Gestionnaire des services Internet (%windir%\system32\inetsrv\InetMgr.exe) sur Windows Server.
- Les Services Internet sur Windows PC.
Si ensuite IIS renvoie systématiquement des erreurs 500 par la suite (même sans appel PHP), installer Visual C++ 32 bits[5] (PHP ne fonctionne pas en 64 bits en 2016).
Docker
modifierIl existe de nombreuses images de conteneur Docker pouvant fournir PHP. Exemple de Dockerfile[6] :
FROM php:8.2-cli
FROM php:8.2-fpm
PHP 7.4 FPM
modifierExemple avec GD[7] :
FROM php:7.4-fpm RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd
IDE
modifierPour développer efficacement en PHP il est indispensable d'utiliser un environnement de développement intégré (IDE) plutôt qu'un éditeur de texte sur le PC client. Ils seront abordés dans les chapitres suivants.
vim
modifiervim dispose de plugins pour programmer en PHP[8].
Références
modifier- ↑ https://www.tecmint.com/connect-nginx-to-php-fpm/
- ↑ https://technet.microsoft.com/fr-fr/library/cc753077(v=ws.10).aspx
- ↑ http://blog.bobbyallen.me/2016/05/02/installing-php7-on-windows-server-2012-r2-and-iis-8/
- ↑ https://phpmanager.codeplex.com/
- ↑ https://www.microsoft.com/fr-fr/download/details.aspx?id=48145
- ↑ https://hub.docker.com/_/php
- ↑ https://itecnote.com/tecnote/php-installing-gd-extension-in-docker/
- ↑ https://www.octopuce.fr/debugger-php-en-cli-avec-xdebug-vim/
Composer
Composer est un logiciel de gestion des bibliothèques PHP open source. Celles-ci sont aussi accessibles sur https://packagist.org/.
Installation
modifierPour l'installer il y a trois solutions :
- Avec les commandes PHP décrites sur https://getcomposer.org/download/.
- En téléchargeant le package par navigateur à la même adresse.
- En le téléchargeant avec la commande cURL[1], comme le montre la vidéo suivante :
À la fin il faut juste disposer du fichier composer.phar.
Pour le lancer, on peut utiliser la commande composer
s'il est installé avec PHP, ou php composer.phar
s'il est juste téléchargé.
Pour l'installer à partir du téléchargement :
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Enfin, pour tester l'installation, lancer :
composer -v
Utilisation
modifierLe programme Composer lit et modifie la liste des bibliothèques du projet dans le fichier composer.json.
init
modifierPour créer le fichier composer.json :
composer init
create-project
modifierAlternative à init pour les apps initialisée par un framework.
composer create-project "symfony/skeleton:^5" mon_projet
require
modifierPour installer un paquet, par exemple client client HTTP Guzzle :
composer guzzlehttp/guzzle
Si l'installation réussit, il ajoute le nom et la version du paquet dans composer.json, ceux de ses dépendances dans composer.lock, et télécharge leurs fichiers dans un dossier "vendors". Il informe ensuite des problèmes de dépendances, par exemple si la version de PHP locale est inférieure à celle recommandée pour le paquet. En cas d'erreur il retire tout ce qu'il a fait.
Paramètres
modifierOn peut aussi préciser le numéro de version, par exemple MediaWiki :
composer require mediawiki/semantic-media-wiki "1.9.*,>=1.9.0.1"
On peut aussi installer plusieurs paquets à la suite :
composer require symfony/framework-bundle symfony/console
Pour éviter de télécharger une bibliothèque destinée au développement en environnement de production, l'ajouter en mode "dev", puis lancer composer install
en développement, et composer install --no-dev
en production :
composer require --dev phpunit/phpunit ^8
Pour utiliser une branche du dépôt de la dépendance, , utiliser le mot réservé ":dev-" suivi de son nom. Ex :
composer require mediawiki/semantic-media-wiki:dev-123_ma_branche
Pour utiliser un commit particulier du dépôt de la dépendance, utiliser le mot réservé "dev-master". Ex :
composer require mediawiki/semantic-media-wiki dev-master#hash_du_commit
install
modifierGénéralement quand on clone un projet git existant contenant un composer.json, il suffit ensuite pour le faire fonctionner, d'installer ses dépendances ainsi :
composer install
Si plusieurs versions de PHP sont installées, il faut préciser laquelle exécute composer ainsi :
/usr/bin/php8.2 /usr/local/bin/composer install
update
modifier
Ne jamais lancer de composer update
sur un projet existant, sous peine de devoir tout retester. En effet, mieux vaut ne mettre à jour qu'une seule bibliothèque en précisant son nom :
php composer.phar update mediawiki/semantic-media-wiki --with-dependencies
Il faut parfois éditer le composer.json avec la règle de la nouvelle version souhaitée avant de lancer l'update.
show
modifierAffiche toutes les bibliothèques installées sur une ligne chacune, ce qui est plus lisible que composer.lock.
depends
modifierAffiche les bibliothèques qui dépendent du package donné en paramètre.
clear-cache
modifier composer clear-cache
Syntaxe du composer.json
modifierLa syntaxe JSON de ce fichier contient quelques extensions[2] :
name
modifierLe nom de l'application, telle qu'elle sera appelée par composer.
Il existe une syntaxe pour le nommage des bibliothèques sous peine de warnings lors des manipulations avec composer. Elles doivent être de la forme vendor name/package name, uniquement avec des caractères alphanumériques plus "-", "." ou "_".
require
modifierLe paragraphe "require" contient les noms des dépendances ainsi que leurs numéros de version (SemVer).
Symbole | Rôle (placé avant un numéro de version) | Exemple |
---|---|---|
>= | permet d'en étendre le numéro. De même on trouve les symboles >, <, <=. | "php": ">=5.5.9" inclut PHP 7.
|
!= | exclut une version. | |
- | définit une plage de versions. | |
¦¦ | ajoute des versions possibles. | "symfony/symfony": "2.8 ¦¦ 3.0" regroupe uniquement ces deux versions.
|
* | étend à toutes les sous-versions. | "symfony/symfony": "3.1.*" comprend la 3.1.1.
|
~ | étend aux versions suivantes du même niveau. | "doctrine/orm": "~2.5" concerne aussi la 2.6 mais pas la 2.4 ni la 3.0.
|
^ | fait la même chose que tilde sous réserve qu'il y ait une compatibilité ascendante. |
Stability Flag
modifierAprès la version à trois nombres, on peut suffixer un arobase puis un Stability Flag[3]. Exemples :
@dev
@stable
require-dev
modifierOn y trouve ce qui a été installé avec require --dev
, donc généralement des bibliothèques de tests et d'analyse de code.
config
modifierEnsemble de paramètres de composer[4], par exemple le timeout ou les identifiants vers certains dépôts.
autoload
modifierMapping des namespaces vers les classes. Cela permet de plus d'inclure tous les fichiers des dossiers automatiquement (et donc d'éviter les fonctions require()
et include()
)[5].
Exemple :
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
De plus, un mapping spécifique aux environnements dev est possible avec :
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
scripts
modifierScripts qui s’exécutent quand on lance "composer"[6].
- Soit automatiquement si présents dans "auto-scripts".
- Soit manuellement. Exemple avec Doctrine dans Symfony :
...
"scripts": {
"doctrine-cc": "php bin/console doctrine:cache:clear-metadata && php bin/console doctrine:cache:clear-query && php bin/console doctrine:cache:clear-result"
},
...
Utilisation :
composer doctrine-cc
extra
modifierComplément de "scripts".
conflict
modifierListe automatiquement les dépendances en conflit, c'est-à-dire qui ne peuvent pas être installées avec l'application courante dans une tierce.
repositories
modifierPour spécifier des dépôts privés (qui ne sont pas accessibles sans communiquer leur URL).
Exemple complet
modifierExemple de mediawiki/core[7] :
{
"name": "mediawiki/core",
"description": "Free software wiki application developed by the Wikimedia Foundation and others",
"type": "mediawiki-core",
"keywords": [
"mediawiki",
"wiki"
],
"homepage": "https://www.mediawiki.org/",
"authors": [
{
"name": "MediaWiki Community",
"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
}
],
"license": "GPL-2.0-or-later",
"support": {
"issues": "https://bugs.mediawiki.org/",
"irc": "irc://irc.libera.chat/mediawiki",
"wiki": "https://www.mediawiki.org/"
},
"prefer-stable": true,
"require": {
"composer/semver": "3.2.4",
"cssjanus/cssjanus": "2.0.0",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"guzzlehttp/guzzle": "7.2.0",
"liuggio/statsd-php-client": "1.0.18",
"monolog/monolog": "2.2.0",
"oojs/oojs-ui": "0.42.0",
"pear/mail": "1.4.1",
"pear/mail_mime": "1.10.9",
"pear/net_smtp": "1.9.2",
"php": ">=7.2.22",
"psr/container": "1.1.1",
"psr/log": "1.1.3",
"ralouphie/getallheaders": "3.0.3",
"wikimedia/assert": "0.5.0",
"wikimedia/at-ease": "2.1.0",
"wikimedia/base-convert": "2.0.1",
"wikimedia/cdb": "1.4.1",
"wikimedia/cldr-plural-rule-parser": "2.0.0",
"wikimedia/common-passwords": "0.3.0",
"wikimedia/composer-merge-plugin": "2.0.1",
"wikimedia/html-formatter": "3.0.1",
"wikimedia/ip-set": "3.0.0",
"wikimedia/ip-utils": "3.0.2",
"wikimedia/less.php": "3.1.0",
"wikimedia/minify": "2.2.4",
"wikimedia/normalized-exception": "1.0.1",
"wikimedia/object-factory": "3.0.2",
"wikimedia/parsoid": "^0.14.0-a14@alpha",
"wikimedia/php-session-serializer": "2.0.0",
"wikimedia/purtle": "1.0.7",
"wikimedia/relpath": "3.0.0",
"wikimedia/remex-html": "2.3.2",
"wikimedia/request-timeout": "1.1.0",
"wikimedia/running-stat": "1.2.1",
"wikimedia/scoped-callback": "3.0.0",
"wikimedia/services": "2.0.1",
"wikimedia/shellbox": "2.0.0",
"wikimedia/utfnormal": "3.0.2",
"wikimedia/timestamp": "3.0.0",
"wikimedia/wait-condition-loop": "2.0.2",
"wikimedia/wrappedstring": "3.2.0",
"wikimedia/xmp-reader": "0.8.1",
"zordius/lightncandy": "1.2.5"
},
"require-dev": {
"composer/spdx-licenses": "1.5.4",
"doctrine/dbal": "2.10.4||3.0.0",
"doctrine/sql-formatter": "1.1.1",
"giorgiosironi/eris": "^0.10.0",
"hamcrest/hamcrest-php": "^2.0",
"johnkary/phpunit-speedtrap": "^3.1",
"justinrainbow/json-schema": "~5.2",
"mediawiki/mediawiki-codesniffer": "37.0.0",
"mediawiki/mediawiki-phan-config": "0.10.6",
"nikic/php-parser": "4.10.2",
"nmred/kafka-php": "0.1.5",
"php-parallel-lint/php-console-highlighter": "0.5",
"php-parallel-lint/php-parallel-lint": "1.3.0",
"phpunit/phpunit": "^8.5",
"psy/psysh": "0.10.5",
"seld/jsonlint": "1.8.3",
"symfony/yaml": "~3.4|~5.1",
"wikimedia/testing-access-wrapper": "~2.0",
"wmde/hamcrest-html-matchers": "^1.0.0"
},
"replace": {
"symfony/polyfill-ctype": "1.99",
"symfony/polyfill-mbstring": "1.99"
},
"suggest": {
"ext-apcu": "Local data cache for greatly improved performance",
"ext-curl": "Improved http communication abilities",
"ext-openssl": "Cryptographical functions",
"ext-wikidiff2": "Diff accelerator",
"monolog/monolog": "Flexible debug logging system",
"nmred/kafka-php": "Send debug log events to kafka"
},
"autoload": {
"psr-0": {
"ComposerHookHandler": "includes/composer",
"ComposerVendorHtaccessCreator": "includes/composer",
"ComposerPhpunitXmlCoverageEdit": "includes/composer"
}
},
"autoload-dev": {
"files": [
"vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php",
"vendor/wmde/hamcrest-html-matchers/src/functions.php"
]
},
"scripts": {
"mw-install:sqlite": "php maintenance/install.php --server=http://localhost:4000 --dbtype sqlite --dbpath cache/ --scriptpath '' --pass adminpassword MediaWiki Admin",
"serve": "php -S localhost:4000",
"lint": "parallel-lint --exclude vendor",
"phan": "phan -d . --long-progress-bar",
"phpcs": "phpcs -p -s --cache",
"fix": [
"phpcbf"
],
"pre-install-cmd": "ComposerHookHandler::onPreInstall",
"pre-update-cmd": "ComposerHookHandler::onPreUpdate",
"post-install-cmd": "ComposerVendorHtaccessCreator::onEvent",
"post-update-cmd": "ComposerVendorHtaccessCreator::onEvent",
"test": [
"composer lint .",
"composer phpcs ."
],
"test-some": [
"composer lint",
"composer phpcs"
],
"phpunit": "phpunit",
"phpunit:unit": "phpunit --colors=always --testsuite=core:unit,extensions:unit,skins:unit",
"phpunit:integration": "phpunit --colors=always --testsuite=core:integration,extensions:integration,skins:integration",
"phpunit:coverage": "phpunit --testsuite=core:unit --exclude-group Dump,Broken",
"phpunit:coverage-edit": "ComposerPhpunitXmlCoverageEdit::onEvent",
"phpunit:entrypoint": "php tests/phpunit/phpunit.php"
},
"config": {
"optimize-autoloader": true,
"prepend-autoloader": false
},
"extra": {
"merge-plugin": {
"include": [
"composer.local.json"
],
"merge-dev": false
}
}
}
Changer de version de PHP
modifierComposer ne permet pas de changer de version de PHP en ligne de commande. Pour ce faire, il faut éditer le composer.json en mettant la version cible souhaitée, puis lancer composer update
.
Références
modifier- ↑ https://curl.haxx.se/download.html
- ↑ https://getcomposer.org/doc/articles/versions.md
- ↑ https://igor.io/2013/02/07/composer-stability-flags.html
- ↑ https://getcomposer.org/doc/06-config.md
- ↑ https://coopernet.fr/formation/php/autoload
- ↑ https://getcomposer.org/doc/articles/scripts.md
- ↑ https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/composer.json
PhpStorm
IDE en freemium réputé le meilleur pour le langage PHP (compter 10 € par mois pour l'utiliser au-delà d'un mois), PhpStorm permet entre autres des recherches relativement rapides dans le code grâce à son indexation, de l'autocomplétion des langages Web, de nombreuses propositions d'optimisations de code et des plugins (ex : Git, Docker, frameworks PHP...).
Installation
modifierLe logiciel est multi-plateforme est ses prérequis figure avec les liens de téléchargement sur le site officiel : https://www.jetbrains.com/help/phpstorm/installation-guide.html.
Configuration
modifierPour un projet git, il est recommandé d'ajouter le dossier .idea/ créé par PhpStorm dans le fichier .gitignore.
Pour éviter de modifier la totalité des fichiers d'un projet mal formaté, il faut désactiver le reformatage automatique lors du copier-coller sans Settings, Editor, Smart Keys, Reformat on paste : None.
Exclure les fichiers minifiés de l'indexation
modifierIdéalement l'indexation des fichiers par PhpStorm devrait prendre moins d'une minute, et ses recherches ne devraient renvoyer que du code source lisible par un humain (par les fichiers minifiés).
Pour ce faire, il faut exclure certains dossiers dans File\Settings\Directories.
Par exemple sur un projet Symfony on exclura :
- public/build (pour les .js optimisés)
- var (pour les .php optimisés, et les logs)
Fonctionnalités
modifierRefactorisation
modifierPar rapport à ses concurrents, il offre de nombreuses options de refactorisation. Par exemple, quand on renomme une variable en passant par le menu "Refactor", il peut le répercuter dans tout le code du projet qui l'appelle, y compris dans les getters et setters. De plus, il peut ajouter ces derniers automatiquement, ainsi que le constructeur d'une classe selon ses attributs (raccourci ALT + Ins), avec un formatage très personnalisable, par exemple pour les retours à la ligne après chaque attributs ou selon une largeur.
À ce propos, afin de respecter la PSR-1 lors de l'insertion de setters, il convient de paramétrer dans Editor\Code Style\PHP\Blank lines, Before return statement = 1.
Autoformatage
modifierIl fournit aussi de nombreuses options d'autoformatage et son analyse de code permet par exemple de trouver les variables non utilisées. Quand on appelle une méthode avec du type hinting, il apparait sans avoir besoin d'ouvrir le fichier de cette dernière. Depuis la version 2019.3, il affiche les méthodes mortes en couleur plus sombre (en plus des variables mortes qu'il signalait déjà).
Par ailleurs, pour le pretty-print XML ou JSON : Code\Reformat Code.
Terminal
modifierPar ailleurs, il possède un lien vers un terminal shell intégré dans une fenêtre du footer, et peut aussi exécuter des requêtes SQL sur des bases si on lui ajoute les sources de données. À ce propos, il permet de naviguer dans une base de données nativement avec une interface, comme le fait PhpMyAdmin, Adminer ou MySQL Workbench.
L'interpréteur de commande est modifiable dans Settings\Tools\Terminal. Par exemple pour utiliser du shell Unix depuis Windows, on peut mettre :
C:\Program Files\Git\bin\sh.exe
Gestion de version
modifierSon système VCS est compatible avec git et permet de voir l'historique des modifications des fichiers en couleur. Par exemple avec un clic droit dans la marge on peut afficher les annotations pour retrouver l'auteur d'un passage, puis réitérer l'opération en affichant les annotations précédentes pour remonter tout l'historique.
De plus, quand on regarde le différentiel des fichiers modifiés depuis le dernier commit (onglet "Version Control" en bas, "resolve", puis "merge..."), en cas de conflit il propose un outil de résolution à trois colonnes très ergonomique.
Enfin, son outil de rebase interactif permet des squash et fixup en masse (dans Log, sélectionner la branche, sélectionner les commits à squasher dans la liste).
Xdebug
modifierXdebug peut être déclenché depuis une page Web ou une commande shell. S'il est déjà installé sur le serveur PHP, et pour les pages Web dans le navigateur, voici ce qu'il reste à faire pour le faire fonctionner dans PhpStorm :
- Cliquer sur l'icône en haut à droite Listen for debug connect.
- Lancer le script à déboguer (afficher la page Web ou entrer la commande shell).
Une fenêtre apparait alors dans PhpStorm Incoming Connection From Xdebug, demandant quel est l'index.php correspondant au signal reçu. Cocher "Import mappings from deployment" si les fichiers sont exécutés sur un serveur distant, et "Manually choose local file or project" s'il est local. Cette deuxième option dresse une liste des index.php trouvés dans le projet, mais pour conserver celui par défaut, choisir leur dossier parent (le nom du projet), et cliquer sur "Accept".
En cas de problème, un outil de diagnostic se trouve dans File, Settings, chercher "Xdebug".
Docker
modifierSi le serveur PHP est dans un conteneur Docker, il faut le stipuler à PhpStorm :
- Ajouter un serveur : dans File, (Languages & Frameworks,) PHP, Servers, ajouter une URL pour le port 80, et une pour le 443. Pour chacun, cocher "Use path mappings" et y mettre le chemin de chaque projet accessible dans le conteneur PHP.
- Ajouter une configuration de lancement : en haut à droite dans Add Configuration... ou Edit Configurations..., créer une entrée PHP Remote Debug, dans laquelle il faut renseigner le serveur précédemment créé, et la clé de session envoyée par le module de son navigateur.
Le php.ini dépend de l'OS hôte[1] :
- Linux :
xdebug.remote_host = 172.170.0.1
- Windows :
xdebug.remote_host = "docker.for.win.host.internal"
- Mac :
xdebug.remote_host = "docker.for.mac.host.internal"
Exemple de Dockerfile :
RUN pecl install -f xdebug \
&& docker-php-ext-enable xdebug
COPY xdebug.ini $PHP_INI_DIR/conf.d
# ou s'il y a peu de lignes à ajouter dans le .ini :
RUN echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
Raccourcis clavier
modifierMaj Maj | Rechercher un fichier |
Ctrl + Maj + N | Ouvrir un fichier (ex : quand on le copie-colle depuis le terminal) |
Ctrl + Maj + F | Rechercher dans les fichiers |
Ctrl + G | Aller à la ligne n°X |
Ctrl + D | Dupliquer la ligne courante |
Ctrl + Maj + Alt | Sélectionner (en clic, double-clic ou glisser) plusieurs morceaux de codes pour pouvoir les copier. |
Ctrl + Maj + Alt + T | Renommer en refactorant |
Ctrl + B | Trouver les utilisations de l'objet courant (équivalent au clic droit, find usages) |
Ctrl + E | Fichiers récents |
Ctrl + K | Commiter |
Ctrl + L | Vider le terminal (utile pour afficher uniquement les derniers logs) |
Alt + Insert | Générer du code, par exemple le constructeur ou les getters et setters à partir des attributs. |
Alt + clic | Décupler le curseur pour écrire la même chose à plusieurs endroits. |
F2 | Se rendre sur l'erreur de compilation du fichier courant |
Plugins
modifierPhpStorm dispose de plusieurs plugins installables dans un deuxième temps, classables par thèmes. Certains sont payants, mais en voici des gratuits utiles :
- EditorConfig récupère automatiquement la configuration d'IDE par projet (par exemple les conventions de codage)[2] à partir d'un fichier .editorconfig versionné. NB : ce format de fichier fonctionne dans la plupart des autres IDEs[3].
- SonarLint analyse de code statique en cours de frappe, synchronisable avec SonarQube.
- Prise en charge de plusieurs frameworks PHP :
- Symfony donne :
- Un accès aux fichiers YAML de déclaration de services depuis les classes PHP et vice-versa en un clic[4]
- Un accès aux fichiers Twig entre eux ou depuis les classes PHP en un clic. Il faut toutefois ajouter au préalable chaque dossier "template" dans Settings, PHP, Symfony, Twig / Template (Namespace = __main__, Type = ADD_PATH).
- WordPress
- Drupal
- Joomla
- Symfony donne :
- Des frameworks JS :
- Node.js
- Angular
- Next.js
- Vue.js
- Docker
Critique
modifier- Il est possible que l'application freeze le PC. Pour éviter cela aller dans le menu Help/Change Memory Settings et diminuer la valeur.
- Début 2019, il considère à tort un fichier accessible par deux liens symboliques Linux comme deux fichiers.
- Depuis au moins 2020, quand plusieurs projets sont ouverts ensemble, il mélange leurs espaces de nom (namespaces) comme si c'était le même (notamment dans les CTRL + clic).
- Quand on exclut un dossier de l'indexation, si l'application crée un sous-dossier, il est indexé à tort. Par exemple, dans Symfony var/ est exclu mais var/cache/ apparait dans les recherches si on ne l'exclut pas manuellement après exécution de l'application.
Références
modifier
NetBeans
Installation de NetBeans
modifierNetBeans est un environnement de développement intégré (EDI), générique et extensible. Il permet nativement de développer en Java, C, C++, JavaScript, XML, Groovy, PHP et HTML.
De plus, il possède son propre wiki officiel[1] (en anglais). La présente page est donc destinée à le synthétiser au maximum.
Pour démarrer l'installation, le télécharger la version LTS sur https://netbeans.org/downloads/, ou bien la toute dernière sur http://bits.netbeans.org/dev/nightly/latest/.
Configuration
modifier- Pour installer les plugins comme PHP ou Python : https://netbeans.org/downloads/index.html.
- Par défaut le chemin d'accès d'un fichier ouvert apparait en survol de son nom. Pour l'afficher en permanence sous la barre de menu : Tools, Options, Appearance, Show full file path.
- L'autoformatage est réglable dans Tools, Options, Editor, Formatting.
- Pour déplacer la barre verticale rouge qui se trouve par défaut à 80 caractères de la gauche : Tools, Options, Editor, Formatting, Right Margin. Par exemple sur GitHub, la taille des écrans est de 120 caractères, il vaut donc mieux ne pas dépasser cette largeur pour éviter lors des relectures de codes, de descendre chercher un des ascenseurs pour remonter lire une fin de ligne.
- Pour bénéficier des avantages propres à un framework (ex : autocompletion des objets du projet ou ouverture d'une déclaration de méthode avec "CTRL + clic" sur un appel), il convient, après installation dans "Tools\Plugins" de spécifier manuellement son emplacement dans "Tools\Options", puis pour PHP par exemple "Framework & Tools".
Utilisation
modifierNetBeans permet de comparer deux fichiers : Tools, Diff...
Gestion de versions
modifierLes gestions de version sont regroupées dans le menu Team. NetBeans peut donc tout à fait remplacer des clients Git purs tels que GitHub Desktop ou Smartgit.
Pour éviter de commiter fichier par fichier, ajouter le bouton Commit All - Repository en le faisant glisser depuis View, Toolbars, Customize.
Principaux raccourcis claviers
modifierListe exhaustive en anglais : http://wiki.netbeans.org/KeymapProfileFor60.
- Alt + Maj + o : ouvre le fichier recherché.
- Ctrl + o : ouvre le fichier déclarant l’objet sélectionné (recherche de classe).
- Ctrl + Maj + f : cherche un texte dans les fichiers le dépôt.
- Ctrl + b : cherche la déclaration d'un élément (dans le même fichier ou pas).
- Ctrl + espace : propose une liste de complétion (mots-réservés et squelettes de fonctions).
- Ctrl + Maj + espace : affiche la documentation d'une méthode (Javadoc, PHPDoc...).
- Ctrl + p : affiche uniquement les arguments possibles d'une méthode.
- Ctrl + Maj + c : commente les lignes sélectionnées.
Plugins
modifierCertains plugins peuvent se révéler utiles :
- http://plugins.netbeans.org/plugin/45925/sort-line-tools : trie les lignes dans l'ordre alphabétique.
- http://plugins.netbeans.org/plugin/37077/autosave-module-for-6-9-and-later : sauvegarde automatiquement chaque fichier modifié en temps réel.
Références
modifier
Eclipse
Eclipse est un environnement de développement intégré (EDI), générique et extensible (site officiel http://www.eclipse.org). Son système de plugins permet d'ajouter des fonctionnalités diverses.
Initialement prévu pour développer en Java, grâce aux plugins il peut maintenant également gérer des projets développés avec d'autres langages de programmation tels que :
- Le C et le C++ grâce à l'ensemble de plugins CDT (C Development Toolkit)[1] (compilateur non intégré).
- Le Python via PyDev[2].
- Avant l'arrivée d'Android Studio, le développement pour Android se faisait avec Eclipse grâce à l'ensemble de plugins ADT (Android Development Toolkit).
Certains IDE sont basés sur Eclipse, et permettent par exemple le développement de logiciel embarqués pour des systèmes temps réel.
Installation de Eclipse
La page de téléchargement d'Eclipse permet de récupérer une version déjà adaptée au langage ciblé sur http://www.eclipse.org/downloads/. Mais pour installer un plugin manuellement, il faut :
- Lancer Eclipse, puis dans le menu déroulant :
Help>Software Updates>Find and Install...
- Cocher Search for new features to install, bouton Next. Bouton New Remote Site..., entrer l'adresse de téléchargement :
Name: Nom du plugin URL: adresse du plugin, ex : http://www.eclipse.org/cdt/downloads.php
- Bouton Finish, choisir un miroir proche puis continuer l'installation.
Utilisation de Eclipse
L'interface de l'IDE Eclipse est basée sur différentes perspectives. Une seule perspective n'est visible à la fois, et se compose de plusieurs vues. Exemples :
- La perspective "Java" se compose par défaut de la vue "Package Explorer", de la vue éditeur de code en Java avec un onglet par fichier ouvert, de la vue "Outline" donnant la hiérarchie des éléments composant la classe du fichier ouvert.
- La perspective "Debug" est ouverte automatiquement au lancement d'une application en mode débogage et se compose par défaut de la vue "Debug" affichant la pile d'appel, de la vue des points d'arrêt nommée "Breakpoints", de la vue éditeur de code en Java avec un onglet par fichier ouvert, de la vue "Outline" donnant la hiérarchie des éléments composant la classe du fichier ouvert.
- Deux ou plusieurs perspectives peuvent être affichées conjointement.
Chaque vue est une sous-fenêtre qui a un titre et se place dans un cadre particulier de la fenêtre de l'IDE. Les vues peuvent être déplacées à la souris par drag and drop pour changer la disposition de la perspective. Plusieurs vues peuvent partager le même cadre, auquel cas, une barre d'onglets permet de basculer entre les vues. Un double clic sur le titre d'une vue provoque l'affichage du cadre qui la contient en pleine fenêtre, réduisant les autres cadres à une icône sur les côtés. Un second double clic restaure les cadres.
Le menu "Window" permet de changer de perspective, et d'ajouter des vues à la perspective courante. Une vue peut également être retirée de la perspective affichée en utilisant la croix à droite du titre de la vue.
Édition de lignes
L'éditeur de code possède des raccourcis clavier pratiques rendant l'édition des lignes de code plus rapide :
Touches | Effet | |
---|---|---|
Shift | ↵ Enter | Ajouter une nouvelle ligne après la ligne courante. |
Ctrl | ↑/↓ | Faire défiler la vue vers le haut/le bas. |
CtrlShift | ↑/↓ | Déplacer le curseur sur le membre précédent/suivant de la classe. |
Alt | ↑/↓ | Déplacer la ligne courante ou les lignes sélectionnées vers le haut/le bas dans le texte. |
CtrlAlt | ↑/↓ | Dupliquer la ligne courante ou les lignes sélectionnées vers le haut/le bas. |
CtrlShift | : | Commenter/Décommenter la ligne courante. |
Complétion de code
L'éditeur de code peut compléter automatiquement le code là où se trouve le curseur :
Touches | Effet | |
---|---|---|
Ctrl | Espace | Ouvrir la liste des suggestions de complétion.
Une fois la suggestion choisie, la validation se fait par l'une des touches suivantes :
Toute autre touche produit le caractère sans valider (annuler la complétion). |
AltShift | : | Complète avec la seule possibilité, ou produit un bip s'il y a plusieurs possibilités. |
Navigation et autres astuces
- Dans les codes sources dépassant la hauteur de fenêtre de l'éditeur, placez le pointeur de la souris sur l'accolade fermante d'un bloc pour voir apparaître un résumé du code d'ouverture du bloc en bulle d'aide. Ceci est fort utile pour vérifier quel bloc est fermé par l'accolade sans avoir à faire défiler le code.
- Placez le pointeur de la souris sur un identifiant de classe, méthode ou variable et enfoncez la touche Ctrl pour faire apparaître un lien cliquable vers la définition.
- Cliquez sur un identifiant de membre de classe pour faire apparaître toutes les occurrences d'utilisation dans le fichier : à la fois dans le texte et dans la barre de défilement. Les blocs apparaissant dans la barre de défilement sont cliquables pour faire défiler le code à la position de l’occurrence. Il y a deux couleurs distinctes pour les occurrences utilisées en lecture (accès, appel, ...) et celles utilisées en écriture (affectation).
- Il peut arriver que cela ne semble pas fonctionner car l'éditeur peut être dans un mode autre que celui par défaut. Il faut dans ce cas appuyer une ou deux fois la touche Échap pour que cela fonctionne.
Références
modifier- ↑ https://eclipse.org/cdt/
- ↑ (anglais) http://pydev.org/
Visual Studio Code
Visual Studio Code (ou simplement nommé "code") est un logiciel éditeur de texte graphique, gratuit fonctionnant sous Windows. Il est capable de prendre en charge le débogage, d'effectuer la coloration syntaxique, l'auto-complétion et surtout le pliage de code (code folding), c'est à dire le masquage à volonté de différents blocs d'instructions (contenu d'une classe, d'une fonction, d'une boucle, etc.) : cette fonctionnalité se révèle extrêmement pratique lorsque vos scripts commencent à s'allonger... Il intègre également la gestion de version (notamment Git et SVN)[1], une fenêtre de terminal ainsi qu'un raccourci pour lancement des scripts.
Cet éditeur est disponible pour Windows sur https://code.visualstudio.com .
Langages supportés
Visual Studio Code prend immédiatement en charge presque tous les principaux langages informatiques.
Plusieurs d'entre eux sont inclus par défaut, comme HTML et CSS, et aussi JavaScript, TypeScript, Java, PHP, mais d'autres extensions de langage peuvent être trouvées et téléchargées gratuitement à partir de VS Code Marketplace[2].
Utilisation
Édition de lignes
L'éditeur de code possède des raccourcis clavier pratiques rendant l'édition des lignes de code plus rapide :
Touches | Effet | |
---|---|---|
Ctrl | ↵ Enter | Ajouter une nouvelle ligne après la ligne courante. |
Ctrl | ↑/↓ | Faire défiler la vue vers le haut/le bas. |
Alt | ↑/↓ | Déplacer la ligne courante ou les lignes sélectionnées vers le haut/le bas dans le texte. |
AltShift | ↑/↓ | Dupliquer la ligne courante ou les lignes sélectionnées vers le haut/le bas. |
Ctrl | : | Commenter/Décommenter la ligne courante. |
Références
Bases du langage
PHP est un langage dont les programmes s'exécutent côté serveur pour produire la réponse à une requête HTTP, ou une commande shell.
En général, il produit une réponse dans un langage de notation (ex : HTML, XML, ou JSON), et le code PHP peut s'intégrer dedans, par exemple dans les balises HTML comme montré dans ce chapitre introductif.
Il peut également produire une sortie dans un format binaire, par exemple une image PNG produite dynamiquement pour une représentation graphique des données, ou un fichier quelconque pour filtrer les accès à des fichiers téléchargeables.
Dans les premiers chapitres, seul le cas de la sortie en HTML est abordé.
Intégration du code
modifierPour que PHP interprète votre code, vous devez remplir deux conditions :
- Votre code doit être placé dans un fichier d'extension .php (selon la configuration du serveur cela peut varier), ouvert via un serveur web en HTTP.
- Votre code doit être compris entre deux balises :
<?php ... ?>
. Tout ce qui n'est pas compris entre ces balises n'est pas interprété par PHP :
<!DOCTYPE html>
<html>
<head>
<title>Le titre de l'onglet</title>
<meta charset="utf8" />
</head>
<body>
<p>Du texte en html</p>
<? echo 'un exemple de texte en php'; ?>
<p>Encore du texte en html</p>
//Écriture recommandée et universelle
<?php
echo "Encore du texte en php";
?>
<body>
</html>
L'utilisation des balises <? ?>
(sans le mot "php") peut poser des problèmes de compatibilité. Il faut en effet que pour cela, la directive short_open_tags
soit activée dans la configuration de l'environnement, ce qui n'est pas le cas sur la plupart des serveurs mutualisés et hébergements gratuits. Imaginez que vous changiez de serveur avec un interpréteur qui ne reconnaisse pas les balises courtes, il vous faudra alors modifier les balises de chaque fichier, travail fastidieux. Il est donc conseillé de prendre l'habitude d'utiliser les balises de la forme <?php ?>
, reconnue universellement.
Pour regarder si votre configuration prend en compte ce type de balises, entrez le code suivant :
<?php
phpinfo();
?>
Cela affichera le contenu du php.ini. Pour l'obtenir en CLI :
php -r "phpinfo();"
Autre exemple : trouver le .ini utilisé :
php7.3 -r "echo php_ini_loaded_file().PHP_EOL;"
Il est possible de trouver des extensions de fichiers comme .phtml, .php3 ou autres. Il est cependant conseillé d'utiliser l'extension .php qui garantit son interprétation par PHP.
<?php
et finissent par ?>
, la balise fermante est optionnelle voire déconseillée.Les directives
modifierIl est possible de définir certains comportements de PHP lors de la compilation par des directives inscrites dans la commande declare()
[1]. Par exemple :
declare(encoding = 'UTF-8');
Références
modifier
Commentaires
Principe
modifierLes commentaires sont en réalité des portions de texte qui ne seront pas interprétées par PHP et ne seront visibles que dans le code source. Ils jouent un rôle très important dans la réalisation et la mise à jour d'un script : en effet, les commentaires rendent le code plus lisible et peuvent aider les éventuelles personnes qui souhaitent retravailler votre script. En effet, si les commentaires sont très utiles aux programmeurs seuls, ils le sont encore plus lors du travail en équipe.
Il existe trois façons différentes d'ajouter des commentaires à son script PHP :
- La méthode avec les symboles
//
pour ajouter un commentaire sur une ligne. - La méthode avec le sigle
#
pour ajouter un commentaire sur une ligne également. - La méthode avec les caractères
/* */
pour désigner un bloc de commentaires.
<?php
# un commentaire PHP
// encore un commentaire PHP
/* et encore
un
autre,
mais sur plusieurs lignes cette fois-ci ! */
Il est important de ne pas emboîter les commentaires. Exemple à ne pas suivre :
<?php
/*blabla /* hihi*/ blalbal*/
L'interpréteur comprendra que le commentaire s'arrête à hihi*/ et il tentera d'interpréter blalbal*/. Il en résultera donc une erreur.
Annotations
modifierIl existe des logiciels qui génèrent une documentation complète à partir des commentaires insérés dans le code du programme. De là est apparue une certaine forme de standardisation de ceux-ci afin de faciliter la génération de documentation, appelée PHPDoc. On peut en effet ajouter des commentaires structurés pour permettre de générer une documentation automatique via PEAR[1] ou PhpDocumentor. En pratique, cela se traduit par des mots-clés interprétés, précédés d'un arobase, appelés "annotations".
Exemple[2] :
/**
* Commentaires sur le rôle du fichier courant
*
* date modifier : 13 mars 2013
* @since 13 mars 2013
* @author Prénom Nom (courriel)
* @copyright PHPascal.com
* @version 1.2
*
*/
Les annotations permettent de plus, aux IDE d'en déduire l'autocomplétion, et aident les analyseurs de code statique à garantir la qualité du code. Elles étaient les seules à pouvoir préciser certains types de variables avant l'apparition des type hinting et type checking en PHP7.
Exemple de commentaires indispensables avant PHP7 :
class MyEntity
{
/** @var int|null */
private $id;
/**
* @return int|null
*/
public function getId()
{
return $this->id;
}
}
Depuis PHP7 :
class MyEntity
{
private int $id;
public function getId(): ?int
{
return $this->id;
}
}
Attributs
modifierDepuis PHP8, il existe des attributs, représentés par des mots-clés suivant un croisillon, pour préciser des informations (métadonnées) sur les classes, fonctions, constantes ou variables[3]. Ex :
<?php
#[\ReturnTypeWillChange]
public function getMixedData()
{
return $this->mixedData;
}
Cet attribut sert à ne pas ajouter de warning si le type retourné ne peut pas être déterminé[4].
Il en existe aussi d'autres comme :
- "Attribute" : pour déclarer un nouvel attribut (en précisant par exemple s'il est restreint aux fonctions).
- "Route" : pour relier une URL à une méthode.
Les attributs d'une classe peuvent être récupérés à l'exécution avec : ReflexionClass()->getAttributes().
Références
modifier
Premier programme
Hello World
modifierÉcrivons notre premier programme PHP. Pour le moment nous nous contenterons d'afficher le fameux "Hello World".
La commande shell est[1] :
php -r "print 'Hello World!';"
Dans un fichier
modifierSoit le fichier HelloWorld.php
ci-dessous, il peut être lancé par :
- les commandes shell
php -q HelloWorld.php
ouphp -f HelloWorld.php
- un navigateur Web, ex : http://localhost/HelloWorld.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Mon premier script PHP !</title>
</head>
<body>
<p><?php echo 'Hello World!'; ?></p>
</body>
</html>
Étude du code
modifierLe terme echo
représente une fonction propre à PHP qui a pour rôle d'afficher du texte, mais on peut aussi utiliser la fonction print
à la place.
Quant à 'Hello World', il est écrit entre apostrophes pour indiquer qu'il s'agit de texte, mais on peut aussi utiliser des guillemets à la place.
Enfin, le point-virgule (;) sert à indiquer la fin de l'instruction. On peut donc placer plusieurs commandes sur une seule ligne.
Parse error
modifierIl s'agit d'une erreur fréquente quand on débute en PHP. Elle est généralement due à une erreur de syntaxe. Cela peut être simplement à cause de l'omission d'un point-virgule ou bien par ce que vous avez une apostrophe qui gène.
Exemple de code erroné :
<?php
// Parse error assurée
echo 'J'irais bien boire un coup.';
Ne s'affichera pas, pour ce faire il faut juste mettre un antislash (\
) devant notre apostrophe.
Exemple de code opérationnel :
<?php
// Antislash et c'est bon
echo 'J\'irais bien boire un coup.';
On peut aussi rendre plus lisible le code source en utilisant les caractères suivants :
- \n : saut de ligne,
- \t : tabulation,
- \r : retour de chariot.
Attention : Ces caractères ne sont interprétés par le moteur PHP que s'ils sont introduits à l'aide de double apostrophe (guillemets) :
echo "Retourne à la ligne\n";
Vous pouvez remarquer que l'exemple précédent est constitué de deux langages HTML et PHP, vous remarquerez aussi que le script est placé entre les balises <body></body>
ce n'est pas une obligation ainsi le code suivant retourne la même chose :
<?php
$texte= 'Hello World';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Mon premier script PHP !</title>
</head>
<body>
<?php
echo ($texte);
?>
</body>
</html>
Particularités de PHP CLI
modifierPHP en ligne de commande possède plusieurs différences avec PHP sur serveur Web :
- Les variables superglobales sont différentes : il n'y a pas de
$_GET
,$_POST
et$_COOKIE
. - Les paramètres (après le nom du script) sont récupérables par la variable globale
$argv
, et leur nombre par$argc
(ou$_SERVER['argc']
si "register_globals = off;" dans php.ini).
global $argv; global $argc;
Références
modifier
Variables
Définition
modifierEn PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la variable, ou d'un underscore "_" pour les constantes (un warning apparait quand ces dernières sont redéfinies).
Le nom est sensible à la casse (par exemple $MaVariable
est différent de $mavariable
). Dans tous les cas, les variables doivent commencer par une lettre (a-z, A-Z) :
$1MaVariable // incorrect
$MaVariable // correct
$_MaVariable // correct
$àéè // correct
MA_CONSTANTE // correct
_MA_CONSTANTE // correct
Exemple
modifier <?php
// Initialisation des variables
$Prenom = 'Romuald';
$Age = '23 ans';
$Profession = 'informaticien';
// Affichage
echo 'Bonjour ' . $Prenom . ', tu as ' . $Age . ' et ta profession est ' . $Profession . '.';
// Ce qui affichera sur votre navigateur : Bonjour Romuald, tu as 23 ans et ta profession est informaticien.
// Une autre manière de faire
echo "Bonjour $Prenom, tu as $Age et ta profession est $Profession";
// Ce qui affichera sur votre navigateur : Bonjour Romuald, tu as 23 ans et ta profession est informaticien.
// Subtilité des " et des '
echo 'Bonjour $Prenom, tu as $Age et ta profession est $Profession';
// Ce qui affichera sur votre navigateur : Bonjour $Prenom, tu as $Age et ta profession est $Profession
// Le contenu d'une chaîne construite avec des " sera interprété par PHP et les variables
// éventuellement utilisées seront remplacées par leurs valeurs.
Nota bene : une variable accolée à du texte est précédée d'un point. Ce dernier sert à la concaténation et dans le cas présent est surtout utile pour indiquer à l'interpréteur que l'on passe du texte, puis à une variable. On lui évite ainsi un temps de réflexion qu'il aurait si l'on avait écrit :
echo "Bonjour $Prenom, tu as $Age et ta profession est $Profession";
- Pour citer du texte contenant uniquement des apostrophes ou des guillemets, on peut encadrer les uns par les autres :
echo 'Hello "World"!';
- Pour citer du texte contenant les deux symboles, on peut utiliser le caractère d'échappement "\" :
echo 'Hello \'the\' "World" !';
Here document
modifierPour éviter de s'encombrer des caractères d'échappement, il existe aussi les syntaxes heredoc et nowdoc avec l'opérateur "<<<"[1]. Ex :
$v = 1;
echo <<<Test
'Hello' "World" \\ $v heredoc
Test;
// 'Hello' "World" \ 1 heredoc
echo <<<'Test'
'Hello' "World" \\ $v nowdoc
Test;
// 'Hello' "World" \\ $v nowdoc
heredoc interprète similairement à une chaine entre guillemets et nowdoc entre apostrophes.
Le mot de fin ("Test" dans l'exemple) des syntaxes heredoc ne doit pas être indenté ni suivi d'autres caractères que le ";", dans les versions PHP antérieures à 7.3[2].
echo <<<HTML
a un rendu différent de echo <<<SQL
.$v1 = new stdClass();
$v1->name = "World";
$v2 = ['one', 'two'];
echo <<<Test
Hello $v1->name $v2[1]
Test;
Mais si cela pose problème, utiliser les accolades pour forcer l'interpolation :
$v1 = new stdClass();
$v1->name = ['one', 'two'];
echo <<<Test
Hello $v1->name[1] // Hello Array[1]
Hello {$v1->name[1]} // Hello two
Test;
Chaines binaires
modifierA ne pas confondre avec les nombres binaires qui sont composés de 0 et de 1, les chaines binaires sont apparues en PHP 5.2.1 et indiquées avec le préfixe "b". Ex :
b'ma_chaine'
Elles se distinguent des autres chaines par leur encodage, qui ne permet pas à ses caractères non ASCII d'être affichés brutes. Par exemple, print(b'é');
donne : �.
On peut alors la convertir avec :
print(iconv('ISO-8859-1', 'UTF-8', b'é'));
Types de variables
modifierContrairement à de nombreux langages de programmation, en PHP il ne faut pas prédéclarer une variable mais celle-ci est typée lors de son instanciation.
$x = 1; // indique implicitement que $x est un entier
$mot = 'test'; // indique que $mot est une chaîne de caractères
En PHP il y a donc quatre types de variables scalaires :
- entiers (integer) : nombres naturels sans décimale (sans virgule) ;
- réels (float) : nombres décimaux (on parle généralement de type "double", car il s'agit de nombre décimaux à double précision). On peut y introduire des puissances de 10 avec la lettre "e" (ex : 2e1 = 20, 4e-3 = 0.004) ;
- booléens (boolean) : deux valeurs possibles : 1 ou 0. Elles sont équivalentes aux mots réservés true ou false (en français, vrai ou faux) ;
- chaînes de caractères (string) : ensembles de caractères (des phrases).
De plus, on trouve les types complexes :
- tableaux (array) : listes d'éléments ordonnés.
- objets (object) : classe instanciée.
Pratique sur les nombres flottant
modifier
Il faut toujours arrondir les nombres flottant à l'affichage, mais aussi lors des comparaisons[4].
Exemple :
$ php -r "var_dump(8 - 6.4 == 1.6);" bool(false) $ php -r "var_dump(round(8 - 6.4, 1) == 1.6);" bool(true)
Lors de la division de nombres à virgules flottantes, on peut facilement avoir une imprécision à cause du mode de leur stockage en mémoire :
echo PHP_VERSION.PHP_EOL; var_dump(fmod(9999.00000, 9998.00001));
donne :
7.3.14 float(0.99999000000025)
Variables dynamiques
modifierIl 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.
La valeur MaVariable
est affectée à une variable classique appelée a
avec l'instruction suivante :
<?php
$a = "MaVariable";
Une variable dynamique, ou variable variable, utilise le nom d'une autre variable. Dans l'exemple ci-dessous, la valeur bonjour
est affectée à la variable dynamique $$a
, c'est-à-dire à une variable dont le nom est la valeur $a
de la variable a
. La variable classique a
contient la valeur MaVariable
donc le code :
<?php
$$a = "bonjour";
est équivalent à : $MaVariable="bonjour";
Attention : cette syntaxe est inutile pour les fonctions. Ex :
<?php
function direBonjour()
{
echo "Bonjour !";
}
$a = 'direBonjour';
$a();
Dans le cas des tableaux variables, il faut préciser si l'index s'applique à la variable ou à la variable dynamique à l'aide d'accolades[5] :
<?php
$a = ['Hello', 'World'];
echo ${$a[0]}; // Undefined variable: Hello
echo ${$a}[0]; // Array to string conversion
Variable de classe variable
modifierLes variables de classe seront introduites en détails dans un chapitre ultérieur. Mais il faut savoir que leurs noms peuvent aussi être variables avec ces notations :
echo $this->$myVariableName;
echo $this->{'variable'.$i};
echo self::$myStaticVariableName;
echo constant(self::class.'::'.strtoupper($myConstantName));
Autres variables
modifierLes variables présentées dans ce paragraphe sont des tableaux indicés par le nom de la valeur accédée (une chaîne de caractère).
Variables superglobales
modifier- Pour plus de détails voir : Programmation PHP/Variables superglobales.
Variables de sessions
modifier- Pour plus de détails voir : Programmation PHP/Sessions.
Lors de la création d'une session (session_start()
), il est possible d'enregistrer des variables (par session_register('nom_variable') = $variable
).
On peut aussi utiliser le tableau $_SESSION
pour créer et modifier une variable de session (par exemple : $_SESSION['ma_variable'] = 3;
)
Il est également possible de supprimer les sessions courantes dans le code PHP en utilisant la fonction session_destroy()
. La destruction de la session en cours peut aussi se faire par la fermeture du navigateur.
Pour supprimer une variable de session sans supprimer la session entière, il suffit d'utiliser la fonction unset($_SESSION['ma_variable'])
.
Variables de cookie
modifier- Pour plus de détails voir : Programmation PHP/Cookies.
Le tableau $_COOKIE
permet de gérer les cookies (définis avec setcookie()
[6]).
Ces cookies sont d'une très grande importance mais sont limités à 20 dans la configuration par défaut de PHP.
Ne pas mettre d'informations privées (mots de passe du serveur...) dans ces variables car elles sont stockées dans un fichier non protégé, sur le disque dur de l'utilisateur.
Variables de requêtes
modifier$_REQUEST est un tableau associatif constitué du contenu des variables $_GET, $_POST, $_COOKIE.
Variables de fichiers
modifier- Pour plus de détails voir : Programmation PHP/Fichiers.
Lors d'un téléchargement de fichiers vers le serveur, une variable est assignée aux données de ce fichier. Il s'agit de $_FILES
. Elle permet de récupérer le nom du fichier envoyé (exemple : mon_image.png
), le nom du fichier temporaire où PHP a copié les données et où il est donc possible de les lire (exemple: C:\temp\T0001AF7.tmp
).
Exemple :
$_FILES['nom_fichier']
Variables mixtes
modifierLe mot clé mixed
permet de définir une variable mixte.
Variables de serveurs
modifier$_SERVER permet d'obtenir des renseignements sous forme d'un tableau sur le serveur.
'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'adressehttp://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 courant. 'argv'
- Tableau des arguments passées 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_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 '.
'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 navigateur 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.
'HTTP_header'
- Valeur de l'en-tête HTTP correspondant envoyé dans la requête du client.
'HTTPS'
- Définissez à une valeur non-vide si le script nécessite d'utiliser 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
'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.
'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 fichier (pas le document-root) jusqu'au script courant, une fois que le serveur a fait une traduction chemin virtuel -> réel.
'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.
Détection du protocole
modifierPour déterminer si l'utilisateur se connecte en HTTP ou HTTPS à partir de la superglobale $_SERVER
:
$_SERVER['REQUEST_SCHEME']
semble la meilleure option, car renvoie "http" ou "https".$_SERVER['SERVER_PORT']
renvoie 80 ou 443.$_SERVER['HTTPS']
donne true en HTTPS ou null en HTTP (provoque un warning unset).$_SERVER['SERVER_PROTOCOL']
ne convient pas du tout car renvoie "HTTP/1.1" dans les deux cas.$_SERVER['HTTP_X_FORWARDED_PROTO']
et$_SERVER['HTTP_FRONT_END_HTTPS']
: à creuser...
Si ces variables renvoient les caractéristiques HTTP en connexion HTTPS, c'est qu'il faut activer SSL pour le site.
Tester les types
modifierPlusieurs fonctions permettent de déterminer les types des objets.
Soit une variable $v :
gettype($v)
donne son type simple ("object" si c'est une instance de classe).get_class($v)
donne son type complexe si c'est une instance de classe.is_null($v)
teste si un objet est null. Équivaut à "=== null"[7].is_bool($v)
est vrai si booléen.is_numeric($v)
est vrai si numérique.is_int($v)
est vrai si entier.is_float($v)
est vrai si décimal.is_string($v)
est vrai si chaine.is_array($v)
est vrai si tableau.is_object($v)
est vrai si objet.$v instanceof MaClasse
est vrai si l'objet est de type "MaClasse".
Conversions
modifierEn PHP, il n'y a pas de déclaration de variable selon un type figé. Pour le forcer, il faut donc utiliser les fonctions suivantes, ou un cast (vers un type entre parenthèses).
Soit une variable $v, et $s un séparateur :
intval($v)
ou(int) $v
convertit en entier.floatval($v)
ou(float) $v
convertit en flottant.chr($v)
convertit en caractère.strval($v)
ou(string) $v
convertit un scalaire en chaine de caractères.implode($s, $v)
oujoin($s, $v)
transforme un tableau en chaine selon un séparateur donné.explode($s, $v)
convertit une chaine en tableau avec un séparateur donné entre les valeurs.
De plus, il est possible de réaliser un transtypage en préfixant la variable avec le type entre parenthèses. Exemple :
$a = 1;
$b = (bool) $a;
print gettype($a); // integer
print gettype($b); // boolean
(bool) "false"
renvoie true
car toute string non vide est vraie.
URLs
modifierTous les caractères Unicode n'étant pas admis dans les URL, on utilisera urlencode()
pour convertir une chaine dans ce format.
De plus, si l'URL contient des paramètres HTTP, http_build_query()
permet, en plus de l'encodage, de les générer à partir d'un tableau associatif.
Références
modifier- ↑ http://fr2.php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc
- ↑ https://www.php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc
- ↑ https://github.com/microsoft/vscode/issues/137539
- ↑ https://www.php.net/manual/en/language.types.float.php
- ↑ http://php.net/manual/fr/language.variables.variable.php
- ↑ http://www.php.net/manual/fr/function.setcookie.php
- ↑ http://php.net/manual/fr/function.is-null.php
Variables superglobales
Les variables superglobales
modifierCes variables sont prédéfinies à PHP et sont destinées à stocker des informations bien spécifiques. Elles se présentent généralement sous la forme d'un tableau associatif à une ou deux dimensions. Elles sont disponibles dans tous les contextes d'exécution (fonctions ou méthodes).
Voici une liste non-exhaustive (comprenant les cas d'utilisation les plus courants) :
Variables de serveur : $_SERVER
modifierElle contient des informations sur le serveur (nom, IP, logiciels installés…)
Par exemple pour extraire l'URL de la page courante :
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
Références
modifier- « Extraire l’url de la page en cours » [html]
- (en) « $_SERVER » [html]
Variables d'environnement : $_ENV
modifierElle contient des informations sur l'environnement d'exécution du script PHP (c'est-à-dire sur le serveur). Elle est donc directement liée au serveur et à son système.
Prenons comme exemple, le prénom 'Paul' :
<?php
echo 'Mon nom d\'utilisateur est ' .$_ENV["USER"] . '!';
En imaginant que l'utilisateur 'Paul' exécute ce script, on aura alors :
Exemple
|
Mon nom d'utilisateur est Paul ! |
Cookies : $_COOKIE
modifierElle stocke les informations sur les cookies envoyés aux clients.
Un petit exemple pour illustre cela :
<?php
echo 'Bonjour ' . htmlspecialchars($_COOKIE["name"]) . '!';
On suppose que le cookie "name" a été défini précédemment, (on prendra Paul encore une fois)
L'exemple ci-dessus va afficher alors :
Exemple
|
Bonjour Paul ! |
GET variables : $_GET
modifierElle stocke les valeurs des arguments passés par URL. Ses clés sont donc par conséquent variables. Pour illustrer ces propos, imaginons que l'utilisateur ai entrée l'URL suivant : http://example.com/?name=Paul
<?php
echo 'Bonjour ' . htmlspecialchars($_GET["name"]) . '!';
L'exemple ci-dessus va afficher alors :
Exemple
|
Bonjour Paul ! |
POST variables : $_POST
modifierElle stocke les valeurs des informations passées par formulaire avec la méthode="post". Ses clés sont donc par conséquent variables.
L'exemple ci dessous est un formulaire comportant un champ de saisie et un bouton de soumission.
Quand un utilisateur soumet des données en cliquant sur "Soumettre", les données du formulaire sont envoyées dans un fichier spécial dans l'attribut d'action de la balise <form>
.
Puis, on peut utiliser $_POST
pour recueillir la valeur du champ de saisie.
Exemple
|
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Nom : <input type="text" nom="fnom">
<input type="soumettre">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// collecte la valeur du champ de saisie
$nom = $_REQUEST['fnom'];
if (empty($nom)) {
echo "Le nom est vide";
} else {
echo $nom;
}
}
?>
</body>
</html>
|
Variables de requête : $_REQUEST
modifierUn tableau associatif constitué du contenu des variables $_GET
, $_POST
, $_COOKIE
.
L'exemple ci dessous est un formulaire comportant un champ de saisie et un bouton de soumission.
Quand un utilisateur soumet des données en cliquant sur "Soumettre", les données du formulaire sont envoyées dans un fichier spécial dans l'attribut d'action de la balise <form>
.
Puis, on peut utiliser $_REQUEST
pour recueillir la valeur du champ de saisie.
Exemple
|
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Nom : <input type="text" nom="fnom">
<input type="soumettre">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// collecte la valeur du champ de saisie
$nom = $_REQUEST['fnom'];
if (empty($nom)) {
echo "Le nom est vide";
} else {
echo $nom;
}
}
?>
</body>
</html>
|
Variable de téléchargement : $_FILES
modifierElle stocke les informations sur un fichier envoyé via HTTP par le client par un formulaire.
Variables de session : $_SESSION
modifierElle contient les valeurs de la session en cours pour le client.
Variables globales : $GLOBALS
modifierElle stocke les variables globales de la page. Ses clés sont donc variables.
Ci-dessous, un exemple d'utilisation de la variable $GLOBALS
.
Exemple
|
<?php
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
|
Lorsqu'on exécute ce code, on obtient "100" (=> résultat de la variable 'z' + 'y').
filter_input()
modifierUne bonne pratique consiste à filtrer les contenus des variables superglobales, qui sont vulnérables aux injections de code[1].
Pour des raisons de sécurité, on évitera donc d'appeler directement les tableaux des variables superglobales comme dans les paragraphes précédents, pour leur préférer la syntaxe filter_input()
[2] :
<?php
echo filter_input(INPUT_GET, 'password'); // bien
echo $_GET['password']; // pas bien
Ne pas confondre avec la fonction filter_var() qui permet d'appliquer des validations ou nettoyages de certaines données[3] (ex : email, URL, adresse IP, booléen...).
Références
modifier
Constantes
Tout comme en C, PHP peut utiliser des variables dont on précise la valeur une fois pour toutes et qui ne pourra être modifiée jusqu'à la fin de l'exécution du code.
Nom
modifierLe nom d'une constante suit les mêmes règles que celles pour les variables, mis à part qu'il n'est pas précédé par $. Par convention on les baptise avec des lettres capitales.
// Noms valides
CONSTANTE1
CONSTANTE_2
// Noms invalides
0CONSTANTE
Déclaration
modifierPour déclarer une constante, on utilise la fonction define()
(depuis PHP3) qui renvoie un booléen true
en cas de réussite de déclaration et false
en cas d'échec[1].
La syntaxe de define
est la suivante :
define(chaine_de_caractere, valeur);
La chaîne de caractère est le nom de la constante, pouvant contenir lettre, tiret, underscore et chiffre (la première lettre de la chaîne est une lettre dans [a-zA-Z]).
Utilisation
modifierL'utilisation est semblable à celle des variables.
<?php
define("CONSTANTE", "Texte ici");
echo CONSTANTE; // affiche "Texte ici"
Depuis PHP 5, la déclaration de constantes à l'intérieur d'une classe peut se faire avec le mot-clé const de la façon suivante :
<?php
class MaClasse
{
const CONSTANTE = "Texte ici";
function afficher()
{
echo self::CONSTANTE;
}
}
$instance = new MaClasse;
$instance->afficher();
Ces constantes sont publiques par défaut, mais PHP 7.1 introduit la possibilité de les rendre privée avec : private const
.
Informations supplémentaires
modifierType de données
modifierUne constante, si elle peut être de type booléen, entier, nombre à virgule flottante ou chaîne de caractère, mais en aucun cas un objet
Depuis PHP 7, elle peut aussi être un tableau de scalaires.
<?php
// Le code suivant va générer une erreur en PHP 5 (mais pas en PHP 7)
define ("CONSTANTE", ["a", "b", "c"]);
print_r(CONSTANTE);
Depuis PHP7.4, les nombres entiers peuvent être rendus plus lisibles dans le code en ajoutant des "_" comme séparateurs. Ex :
echo 10_00_000; // affiche 10000000
Unicité de la déclaration
modifierLa redéclaration d'une constante portant le même nom est ignorée, et la valeur de la première déclaration reste valable.
<?php
define ("CONSTANTE", "première définition");
define ("CONSTANTE", "deuxième définition"); // ignoré
echo CONSTANTE; // retournera toujours "première définition"
D'où l'utilisation de defined()
pour déterminer si une constante est déjà définie ou pas[2] :
define("CONSTANTE", "première définition");
if (!defined("CONSTANTE")) {
//...
Conflit de nom
modifierIl existe des constantes intégrées à PHP, or on ne peut créer une constante portant leurs noms, cela entraînerait une erreur. En général, évitez la syntaxe suivante pour le nom d'une variable ou d'une constante :
__NOM__
Constantes prédéfinies
modifierIl en existe de deux types[3] :
- fixes en valeur
- dont la valeur est dynamique
Constantes intégrées à valeur fixe
modifierLes constantes suivantes ont des valeurs fixes, comme celles définies avec define
:
TRUE
: vrai (booléen) = 1.FALSE
: faux (booléen) = 0.INF
: l'infinie.PHP_VERSION
: version de PHP du serveur exécutant le script.PHP_OS
: nom du système d'exploitation du serveur exécutant le script.PHP_EOL
: end of line = \n.DIRECTORY_SEPARATOR
: '/' sur Linux et MacOS, '\' sur Windows.
Constantes intégrées à valeur dynamique
modifierLes constantes magiques[4] :
__DIR__
: dossier courant.__NAMESPACE__
: namespace courant.__FILE__
: chemin complet du fichier qui est actuellement exécuté par le serveur (exemple : /la/ou/est/le/fichier.php).__CLASS__
: nom de la classe dans laquelle on se trouve.__TRAIT__
: trait courant.__FUNCTION__
: nom de la fonction dans laquelle on se trouve.__METHOD__
: nom de la méthode dans laquelle on se trouve.__LINE__
: ligne du fichier qui est actuellement exécuté par le serveur.
Exemple d'utilisation :
<?php
echo 'Fichier: ' . __FILE__ . "\n";
echo 'Ligne: ' . __LINE__ . "\n";
class test
{
function foo()
{
echo 'Fonction: ' . __FUNCTION__ . "\n";
echo 'Classe: ' . __CLASS__ . "\n";
}
}
test::foo();
// ou alors
$test = new test();
$test->foo();
Qui affichera :
Fichier: /home/ze/toto.php Ligne: 3 Fonction: foo Classe: test Fonction: foo Classe: test
L'affichage de la première ligne, par exemple, dépend d'où est situé le fichier dans l'arborescence des fichiers.
Références
modifier
Opérateurs
Les opérateurs sont des symboles qui permettent de manipuler les variables.
Opérateurs arithmétiques
modifier= Opérateur d'affectation
modifier<?php
$un_chiffre = 4; //affectation de l'entier 4 à la variable un_chiffre
$un_mot = 'je suis fan des pâtes'; //affectation de la chaîne de caractères à la variable "un_mot"
+ Opérateur d'addition
modifier<?php
$mon_premier_chiffre = 3; //affectation du premier chiffre
$mon_deuxieme_chiffre = 4; //affectation du deuxième chiffre
$resultat = $mon_premier_chiffre + $mon_deuxieme_chiffre; //affectation de l'addition des deux chiffres
echo $resultat; //affiche 3+4 soit 7
Si les opérandes sont des tableaux, "+" est l'opérateur union[1].
- Opérateur de soustraction
modifier<?php
$mon_premier_chiffre = 3;
$mon_deuxieme_chiffre = 4;
$resultat = $mon_premier_chiffre - $mon_deuxieme_chiffre;
echo $resultat; //affiche 3-4 soit -1
* Opérateur de multiplication
modifier<?php
$mon_premier_chiffre = 3;
$mon_deuxieme_chiffre = 4;
$resultat = $mon_premier_chiffre * $mon_deuxieme_chiffre;
echo $resultat; //affiche 3*4 soit 12
** Opérateur d’exponentiation
modifier<?php
$mon_premier_chiffre = 2;
$mon_deuxieme_chiffre = 3;
$resultat = $mon_premier_chiffre ** $mon_deuxieme_chiffre;
echo $resultat; //affiche 2^3 soit 8
/ Opérateur de division
modifier<?php
$mon_premier_chiffre = 3;
$mon_deuxieme_chiffre = 4;
$resultat = $mon_premier_chiffre / $mon_deuxieme_chiffre;
echo $resultat; //affiche 3/4 soit 0,75
% Opérateur modulo
modifier<?php
$mon_premier_chiffre = 3;
$mon_deuxieme_chiffre = 4;
$resultat = $mon_premier_chiffre % $mon_deuxieme_chiffre;
echo $resultat; //affiche 3 modulo 4 soit 3 (le modulo est le reste entier de la division euclidienne)
Il sert à tester si un nombre est le multiple d'un autre :
<?php
if ($nb % 3 == 0) {
// $nb est un multiple de trois
}
fmod()
[2].Opérateurs logiques booléens
modifierLes opérateurs logiques agissent sur les types booléens (true
ou false
).
- ! : négation. Transforme
false
entrue
ettrue
enfalse
. - && : opérateur "et".
- and : opérateur "et" de moindre priorité.
- || : opérateur "ou"
- or : opérateur "ou" de moindre priorité.
Opérateurs logiques bit à bit
modifierLes opérateurs logiques bit à bit agissent sur chaque bit des valeurs entières.
- ~ Négation :
0
->1
et1
->0
- & Opérateur et (and)
- | Opérateur ou (or)
- ^ Opérateur ou exclusif (xor)
- >> : décalage à droite (division par deux)
- << : décalage à gauche (multiplication par deux).
Opérateurs d'assignation
modifierIls permettent de simplifier l'écriture des assignations.
- += additionne deux valeurs et stocke le résultat dans la variable ($x += 5 équivaut à $x = $x+5)
- -= soustrait deux valeurs et stocke le résultat dans la variable ($x -= 5 équivaut à $x = $x-5)
- *= multiplie deux valeurs et stocke le résultat dans la variable ($x *= 5 équivaut à $x = $x*5)
- /= divise deux valeurs et stocke le résultat dans la variable ($x /= 5 équivaut à $x = $x/5)
- %= donne le reste de la division de deux valeurs et stocke le résultat dans la variable ($x %=5 équivaut à $x = $x%5)
- |= effectue un OU logique entre deux valeurs et stocke le résultat dans la variable ($x |=5 équivaut à $x = $x|5)
- ^= effectue un OU exclusif entre deux valeurs et stocke le résultat dans la variable ($x ^= 5 équivaut à $x = $x^5)
- &= effectue un ET logique entre deux valeurs et stocke le résultat dans la variable ($x &= 5 équivaut à $x = $x&5)
- .= concatène deux chaînes et stocke le résultat dans la variable ($x .= 'test' équivaut à $x = $x.'test')
Opérateurs d'incrémentation
modifier- ++ : incrémente de 1 la valeur de la variable si "$x = 1 ", "$x++" vaut "++$x" qui vaut "2".
- -- : décrémente de 1 la valeur de la variable si "$x = 2", "$x--" vaut "--$x" qui vaut "1".
Ces opérateurs sont très utiles dans les boucles (notamment for).
Opérateurs de comparaison
modifier- == renvoie un booléen pour indiquer l'égalité (ce n'est pas =) : $x == 1 teste si la valeur $x est égale à 1.
- === renvoie un booléen pour indiquer à l'identique, c'est-à-dire l'égalité à la fois de la valeur et du type.
- != (alias <>) renvoie un booléen pour indiquer la différence : $x != 1 teste si la valeur $x est différente de 1.
- !== renvoie un booléen pour indiquer la différence ou de la valeur ou du type.
- > renvoie un booléen pour indiquer la supériorité stricte si $x > 1 teste si la valeur $x est strictement supérieure à 1.
- < renvoie un booléen pour indiquer l'infériorité stricte : $x < 1 teste si la valeur $x est strictement inférieure à 1.
- >= renvoie un booléen pour indiquer la supériorité-égalité si $x >= 1 teste si la valeur $x est supérieure ou égale à 1.
- <= renvoie un booléen pour indiquer l'infériorité-égalité si $x <= 1 teste si la valeur $x est inférieure ou égale à 1.
- <=>[3] renvoie 1 si le premier opérande est supérieur, 0 s'il est égal, et -1 s'il est inférieur au deuxième.
Si les opérandes sont des tableaux :
- "==" est l'opérateur d'égalité (mêmes paires clés/valeurs).
- "===" vérifie aussi le type et l'ordre des paires clés/valeurs.
- "!=" (alias "<>") est l'opérateur d'inégalité.
- "!==" est l'opérateur non identique.
Opérateurs divers
modifierOpérateur ?
modifierL'opérateur ?
permet de renvoyer une valeur ou une autre en fonction d'un test.
??
(depuis PHP 7) [4] (Null Coalescing Operator) opérateur binaire qui renvoie l'opérande qui le précède s'il existe (isset), sinon l'opérande qui le suit.?:
(depuis PHP 7) opérateur ternaire qui renvoie l'opérande qui le précède s'il existe et est non vide (empty), sinon l'opérande qui le suit.
Par exemple :
$appreciation = ($note>10) ? "bon" : "mauvais";
qui est équivalent au bloc PHP suivant :
if ($note > 10) {
$appreciation = "bon";
} else {
$appreciation = "mauvais";
}
Toutefois il présente un autre avantage que sa concision : la stratégie d'évaluation de cet opérateur ne calcule pas le "else" si le script n'a pas besoin d'y aller. Il devient donc moins gourmand en ressources.
En l'absence de premier résultat, le ternaire renvoie l'expression comparée si non nulle ou vide. Exemple :
print 1 ?: 2; // 1 print 0 ?: 2; // 2 print null ?: 2; // 2
print 'Un est plus ' . (1 > 2
? ' grand'
: ' petit'
). ' que deux.';
-> Opérateur objet
modifierL'opérateur objet -> permet d'accéder aux propriétés d'un objet (variables et méthodes de classe). Exemple :
print $voiture->couleur; $voiture->repeindre('bleu');
Depuis PHP 8 il a une version qui renvoie null si l'objet est null :
$voiture = null; print $voiture?->couleur;
:: Opérateur de résolution de portée
modifierL'opérateur ::, également appelé en PHP Paamayim Nekudotayim, permet d'accéder aux membres statiques ou constants d'une classe. Exemple :
print $voiture::couleur;
@ Opérateur de contrôle d'erreur
modifierL'arobase permet d'ignorer les erreurs de l'expression qui le suit. Ex :
print 1/0; //Warning: Division by zero, puis INF
print @(1/0); // INF
& Opérateur de référence
modifier"&" accolé avant une variable désigne sa référence[5], qui est en quelque sorte un pointeur en lecture seule. Elles sont utiles par exemple pour éviter copier un grand tableau en mémoire quand il est en paramètre d'une fonction. Exemple :
public function archive(&$db)
{
var_dump($db);
}
Son utilisation pour les fonctions sera détaillée dans le chapitre sur les fonctions, mais on peut aussi l'utiliser dans les boucles.
... Opérateur de fonction variadique
modifierDepuis PHP 5.6, "..." dans la liste des arguments d'une fonction indique que ceux-ci sont d'un nombre variable.
Exemple :
public function somme(...$nombres)
{
$somme = 0;
foreach ($nombres as $n) {
$somme += $n;
}
return $somme;
}
echo somme(1, 2, 3);
echo somme(1, 2, 3, 4);
Précédence des opérateurs
modifierQuand une opérande est entourée de deux opérateurs (ex : 1 + 2 * 3 = 7), des règles de priorités s'appliquent systématiquement pour résoudre les opérations[6].
Références
modifier
Fonctions
Définition de fonction
modifierOutre les dizaines de fonctions natives[1], PHP permet bien entendu d'écrire ses propres fonctions. Pour en définir une, il suffit d’utiliser le mot-clef function
. Comme le langage est faiblement typé, une fonction peut retourner n’importe quel type de valeur (chaîne, entier…) ou ne rien retourner du tout. Enfin, ses arguments peuvent avoir des valeurs par défaut, être nommés (depuis PHP8) et sont limités à 12 par fonction.
// foo retourne le résultat de la somme du deuxième paramètre et de 4.
// Si aucun second paramètre n'est donné, la fonction utilisera la valeur 0 par défaut.
function foo($arg1, $arg2 = 0)
{
print 'Fonction foo(' . $arg1 . ',' . $arg2 . ') donne : ';
return $arg2+4;
// tout ce qui suit ne sera jamais exécuté
}
//appel à la fonction
print foo(1,3); //affichera: Fonction foo(1,3) donne 7
print foo(5); //affichera: Fonction foo(5,0) donne 4
Notez que lorsqu'une fonction arrive à un return
, elle l'effectue puis se termine, même s'il y a d'autres instructions après.
Par ailleurs, en cas de gros volume de données à retourner, on peut utiliser yield
au lieu de return
pour les décomposer à l'aide du générateur PHP[2] (classe Generator).
Contrairement à d'autres langages, PHP ne permet pas d'appeler certains arguments par leurs noms : si l'on souhaite appeler un des derniers arguments, il faut donc définir tous ceux avant lui, même les optionnels. Toutefois pour éviter ce désagrément, on peut utiliser la classe ReflectionMethod
.
NB : il existe aussi ReflectionClass
[3].
Portée des variables
modifierLe problème de portée des variables est assez réduit en PHP. Une fonction n'a accès qu’à ses arguments, ses propres variables et aux variables globales importées statiquement (mot clé global
). De ce fait, il y a peu de confusion.
Toujours suivant le même principe, les variables utilisées dans une fonction sont toutes détruites à sa sortie (les variables globales non, bien entendu).
Exemple
|
$valeur1=10;
$valeur2=20;
function exemple($valeur)
{
global $valeur1; // récupération de la valeur globale de $valeur1
$valeur3=5;
$calcul=$valeur1+$valeur2+$valeur3+$valeur; // 10 + 0 + 5 + le paramètre qui sera entre parenthèses.
//$valeur2 n'ayant pas été définie comme valeur globale, la variable $valeur2 est donc vide.
return $calcul;
}
echo exemple(2); // affiche 17
|
On peut aussi trouver un peu plus compliqué si vous utilisez deux fichiers. L'un pour les variables, l'autre pour les traitements.
Espaces de noms
modifierDepuis PHP 5.3.0, des espaces de noms peuvent être définis pour cloisonner certains objets, à l'aide du mot clé namespace
utilisé en début de fichier[4]. Exemple de définition :
<?php
namespace Projet1;
...
Soit un fichier TestNS.php suivant :
<?php
namespace Projet1\SousProjet2;
function Fonction1()
{
echo "Fonction exécutée.\n";
echo __NAMESPACE__;
}
Le fichier doit être encodé en ANSI ou Unicode sans BOM, mais pas en Unicode seul, sous peine d’avoir l'erreur Namespace declaration statement has to be the very first statement in the script, et d'être obligé de coller le mot "namespace" à "?php").
Exemple d’utilisation :
<?php
require 'TestNS.php';
Projet1\SousProjet2\Fonction1();
require 'Projet1\SousProjet2\TestNS.php';
Références de variables
modifierLes références sont utiles lorsque l’on souhaite retourner plusieurs valeurs dans une fonction. On utilise alors le passage d'argument par référence, qui fait que quand une fonction modifie un argument, la valeur de la variable du programme principale change aussi.
Pour utiliser un argument en tant que référence, il suffit d'y mettre l'opérateur de référence, le symbole &
devant, dans la déclaration de la fonction.
Un exemple concret devrait vous faire comprendre :
Exemple
|
function foo(&$arg1, &$arg2, $arg3)
{
$arg1 = 4;
$arg2 = 6;
$arg3 = 8;
}
foo($var1, $var2, $var3);
print $var1; //affichera 4
print $var2; //affichera 6
print $var3; //affichera NULL car $arg3 n'est pas une référence (pas de &)
|
Fonctions variables
modifierOn appelle "fonction variable" une fonction dont on ne peut prédire le nombre d'arguments. Ce genre de fonction pourra se révéler pratique pour exécuter certains codes répétitifs ou le programmeur n'a pas envie de recopier le nom de la fonction pour n valeurs.
Pour cela, il faut retenir deux fonctions importantes :
- func_num_args : permet de compter le nombre d'arguments (retourne true ou false).
- func_get_args : permet de récupérer la valeur d’un argument (retourne un tableau de valeur)[5].
Ces deux fonctions ne peuvent s'utiliser qu’à l'intérieur d’une fonction; dans le cas contraire un message d'erreur s'affichera.
Exemple
|
function afficher_variables ()
{
$nb_args = func_num_args();
$list_args = func_get_args();
for ($i = 0; $i < $nb_args; $i++) {
echo $list_args[$i].' ';
}
}
$var1 = 'programmeur';
afficher_variables('Je suis', $var1, ', c\'est utile', ', c\'est intéressant.'); // Et on peut en rajouter autant que nécessaire.
|
Le code se comprend de lui-même. Il affichera : Je suis programmeur, c’est utile, c’est intéressant.
Fonctions de rappel
modifierPour passer une fonction en argument d'une autre, il faut utiliser call_user_func()
. Ex :
function fonctionAppelante(string $nomDeFonctionAppelee)
{
return call_user_func($nomDeFonctionAppelee);
}
Fonctions anonymes
modifierUne fonction sans nom peut être stockée dans une variable permettant de l'appeler. Le mot clé use
permet d'injecter des variables globales dedans. Ex :
$variableGlobale = 'Hello';
$fonctionAnonyme = function ($argument) use ($variableGlobale) {
return $variableGlobale.' '.$argument.PHP_EOL;
};
echo $fonctionAnonyme('World'); // Hello World
echo $fonctionAnonyme('You'); // Hello You
Fonctions fléchées
modifierDepuis PHP7.4, on peut définir une fonction anonyme avec l'opérateur "=>" et le mot réservé fn
. Ex :
$fonctionFlechee = fn($argument) => $variableGlobale.' '.$argument.PHP_EOL;
echo $fonctionFlechee('World'); // Hello World
echo $fonctionFlechee('You'); // Hello You
Fonctions prédéfinies
modifierVoici une liste des fonctions globales prédéfinies en PHP les plus usuelles.
print()
(aliasecho
) : affiche le contenu de la variable placée en paramètre.printf()
et dérivés (ex :sprintf
) : print formaté, affiche un texte dont on remplace les marqueurs, numérotables, par les variables en paramètre[6]. Exemple :
printf('Compteur : %s. ', 1); // Compteur : 1.
printf('Compteur : %s. ', 2); // Compteur : 2.
printf('Compteur : %s, taille : %s. ', 3, 1); // Compteur : 3, taille : 1.
printf('Compteur : %2$s, taille : %1$d. ', 1, 4); // Compteur : 4, taille : 1.
printf('Compteur : %1$d, taille : %1$d. ', 5); // Compteur : 5, taille : 5.
echo vsprintf('Tailles : %d, %d, %d, %d', [1, 2, 3, 4]); // Tailles : 1, 2, 3, 4
Les types suivants sont généralement utilisés :
- d : digit
- f : float
- s : string
- Pour échapper les "%" pour sont interprétés par ces fonctions, ce n'est pas "\" mais "%".
- Ne pas utiliser les doubles quotes sous peine de
Undefined variable: d
.
sleep($secondes)
: attend un certain nombre de secondes (utilisation déconseillée quand un humain doit attendre un résultat).call_user_func_array('maFonction', 'mesArguments')
: exécute une fonction à partir de son nom en chaîne de caractères.getenv()
: affiche toutes les variables d'environnement, ou celle demandée en paramètre.ignore_user_abort(true)
: ("false" par défaut) continue l'exécution d'un script lancé par un utilisateur, même s'il change de page ou clique annule le chargement.header()
: ajoute une clé dans l'en-tête HTTP de la réponse.ini_get()
: lit le php.ini.ini_set()
: modifie le php.ini le temps de l'instance.set_time_limit()
: redéfinit la limite de temps du php.ini.require()
: importe le code PHP d'un autre fichier, avec une erreur si c'est impossible[7].require()_once
: idem en garantissant que chaque fichier n'est ajouté qu'une fois.include()
: importe le code PHP d'un autre fichier, sans erreur si c'est impossible.include_once()
: idem en garantissant que chaque fichier n'est ajouté qu'une fois.getmypid()
: retourne l'ID du processus courant dans l'OS.
Sur les chaînes
modifiertrim($string)
: supprimer les espaces et retours chariots en début et fin de chaîne par défaut. Son second paramètre permet de remplacer les symboles à retirer.strip_tags()
: supprime les balises HTML de la chaîne mentionnée en paramètre 1, en conservant ceux en paramètre 2 (sous la forme d'une chaine comme '<p><br>').ucfirst()
: met une majuscule en début de chaîne.lcfirst()
: met une minuscule en début de chaîne.strtoupper()
: met en lettres capitales toute la chaîne.strtolower()
: met en bas de casse toute la chaîne.strlen()
: compte la taille d'une chaîne en octets. Pour avoir le nombre de caractères, utilisermb_strlen()
(pour multibyte).str_contains($chaine, $cle)
: cherche si une chaîne contient une sous-chaîne.- <codestr_starts_with($chaine, $cle) : vérifie si une chaîne commence par une sous-chaîne.
str_replace($ancien, $nouveau, $texte)
: remplace des caractères par d'autres dans un texte ou un tableau[8].str_ireplace($ancien, $nouveau, $texte)
: fait la même chose en ignorant la casse.strtr($texte, $ancien, $nouveau)
(string translate) : réputée plus rapide questr_replace
[9].strpos($meubleDeFoin, $aiguille)
[10] : première position d'une sous-chaine. Attention : ne jamais utiliser comme si elle renvoyait un booléen () car si la recherche est en première position (0) elle sera considérée comme fausse avec le typage faible. Il faut tester l'existence avecif (strpos())
if (false !== strpos())
.stripos($meubleDeFoin, $aiguille)
: fait la même chose en ignorant la casse.strrpos($meubleDeFoin, $aiguille)
: dernière position d'une sous-chaine.substr($texte, $debut , $fin)
: tronque un texte en sous-chaine. Utilisermb_substr
en Unicode.- Pour accéder à un seul caractère d'une chaine, PHP peut la considérer comme un tableau (ex :
$chaine[0]
). - Ex :
echo substr('Hello World', 0, 2); // "He" : les deux premiers caractères
echo substr('Hello World', -2); // "ld" : les deux derniers caractères
echo substr('Hello World', 0, -1); // "Hello Worl" : tout sauf le dernier caractère
substr_count($chaine, $sous-chaine)
: compte le nombre de sous-chaine dans une chaine.str_pad()
: complète une chaine avec un caractère pour qu'elle atteigne la taille demandée si ce n'était pas le cas. Ex :
echo str_pad(10, 2, '0'); // 10
echo str_pad(9, 2, '0'); // 90
echo str_pad(9, 2, '0', STR_PAD_LEFT); // 09
eval($chaine)
: exécute une chaine comme un script PHP.count_chars($chaine)
: renvoie un tableau avec en clés chaque caractère de la chaine, et en valeur son nombre d'occurrences. Pratique pour détecter les anagrammes.
Encodage
modifier- Pour plus de détails voir : Coder avec Unicode/Conversion#PHP.
utf8_encode($chaine)
etutf8_decode($chaine)
sont dépréciée en PHP 8.2, il faut utiliser à la placemb_convert_encoding($chaine, 'UTF-8')
etmb_convert_encoding($chaine, 'ISO-8859-1')
.
URLs
modifierparse_url()
: découpe une chaîne en partie d'une adresse URL (protocole, domaine et chemin d'accès).http_build_query()
: crée une URL à partir d'un tableau d'arguments GET. Par défaut le séparateur est "&" (3e argument). Cette fonction échappe les séparateurs. Ex :
php -r "var_dump(http_build_query(['x' => 1, 'y' => 2]));"
string(7) "x=1&y=2"
php -r "var_dump(http_build_query(['x' => '1/', 'y' => '2&'], '/', '/'));"
string(13) "x=1%2F/y=2%26"
Sur les nombres
modifierpow($nombre, $exposant)
(power) : élève un nombre à la puissance de l'exposant donné.sqrt($nombre)
(square root) : racine carrée.max($nombre1, $nombre2, ...)
[11] : affiche le plus grand nombre parmi ceux en paramètres.min($nombre1, $nombre2, ...)
: affiche le plus petit nombre d'une liste.round($nombre)
: arrondit un nombre à l'entier le plus proche, ou selon une précision en deuxième paramètre s'il est renseigné[12]. Exemple :
echo round(5.49); // 5 echo round(5.50); // 6 echo round(5.555, 2); // 5.56
number_format($nombre, 2, ',', ' ')
: formate un nombre donné, où "2" représente le nombre de chiffres après la virgule, "," le séparateur décimal et " " le séparateur de milliers.
Ne jamais comparer des nombres issus du number_format()
car les séparateurs faussent les calculs. Exemple :
-1000.00 < -1000.02 // false -1,000.00 < -1,000.02 // -1
Bufferisation de sortie
modifierLa bufferisation de sortie bloque l'envoie de données au client HTTP pour les mettre dans une mémoire tampon à la place[13].
ob_start()
: démarre l'utilisation du tampon.ob_get_contents
: affiche le contenu du tampon.ob_clean()
: efface le tampon sans l'envoyer.ob_flush()
: envoie le tampon au client.
Références
modifier- ↑ http://php.net/manual/fr/indexes.functions.php
- ↑ http://php.net/manual/fr/language.generators.syntax.php
- ↑ http://php.net/manual/fr/reflectionclass.getdoccomment.php
- ↑ http://php.net/manual/fr/language.namespaces.rationale.php
- ↑ http://php.net/manual/fr/ref.funchand.php
- ↑ http://php.net/manual/fr/function.sprintf.php
- ↑ https://www.alsacreations.com/article/lire/254-le-point-sur-la-fonction-include-php.html
- ↑ http://php.net/manual/fr/function.str-replace.php
- ↑ https://www.keycdn.com/blog/php-performance#10-use-the-strongest-str-functions
- ↑ http://php.net/manual/fr/function.strpos.php
- ↑ http://php.net/manual/fr/function.max.php
- ↑ http://php.net/manual/fr/function.round.php
- ↑ https://www.php.net/manual/fr/ref.outcontrol.php
Tableaux
Création de tableau
modifierUn tableau (en anglais array
) est une collection d'objet. En PHP, ces objets n'ont pas forcément le même type (cohabitation entre des entiers, des chaines…). Chaque objet est identifié par une clé appelée indice, que l'on met entre crochets (ex : $tableau[indice]
).
Il existe trois manières de déclarer un tableau vide :
$tab = []; // depuis PHP 5.4
$tab = {}; // moins permissif aux concaténations
$tab = array(); // déconseillé depuis PHP 7
Pour créer un tableau non vide :
$t1 = array('champ1', 'champ2');
$t2 = ['champ1', 'champ2'];
$t3[0] = 'champ1';
$t3[1] = 'champ2';
// Affiche les trois mêmes tableaux : Array ( [0] => champ1 [1] => champ2 )
var_dump($t1);
var_dump($t2);
var_dump($t3);
print
ne fonctionne pas pour les tableaux, il faut utiliser var_dump
ou print_r
. Par ailleurs, pour récupérer la chaine affichée par ces fonctions, utiliser print_r(MonTableau1, true)
.
Autres exemples :
$tab[0] = 1; // entier
$tab[1] = 2.0; // flottant
array_push($tab,'Ligne 3');
$tab[] = 'Ligne 4';
var_dump($tab);
Il en est de même pour les tableaux à deux dimensions.
$tab = [];
$tab[0][0] = '0-0';
$tab[0][1] = '0-1';
$tab[1][0] = '1-0';
$tab[1][1] = '1-1';
var_dump($tab);
On distingue deux types de tableau :
- Le tableau standard, dont la clé est son indice (le numéro de ligne en partant de zéro). Pratique pour être parcouru par une variable compteur, ou pour être rempli dans un certain ordre.
- Le tableau associatif, auquel on accède par le nom d'une clé en chaine de caractères.
Tableau itératifs
modifierLes clés du tableaux sont des nombres. Ils ont l'avantage de pouvoir être parcourus par un compteur.
Exemple
|
$tab = ['val1', 'val2', 'val3']; // $tab[0] vaut val1 /-/ $tab[1] vaut val2 /-/ etc.
for($i = 0; $i<2; $i++)
echo $tab[$i];
|
Ce code affichera : val1val2.
En PHP, on peut aussi directement affecter des indices du tableau, comme suit :
Notez que les indices ne sont pas typés (on pourra indifféremment utiliser $tab[1] et $tab['1']).
Tableaux associatifs
modifierIls fonctionnent de la même manière que les tableaux itératifs, sauf que l'utilisateur en choisit la clé. À chaque clé correspond une valeur (injection).
Voici un exemple de déclaration :
Exemple
|
$tab = ['cle1' => 'val1', 'cle2' => 'val2', 'cle3' => 'val3'];
print $tab['cle2']; //affichera : val2
//parcours du tableau en boucle
foreach ($tab as $key => $value)
print $key." : ".$value.". ";
|
Résultat : cle1 : val1. cle2 : val2. cle3 : val3.
Pour ne garder que les valeurs on peut utiliser implode()
, qui convertit un tableau en chaine avec séparateur :
print implode(". ", $tab).". ";
Résultat : val1. val2. val3.
Fonctions de lecture
modifiercount
: cette fonction renvoie le nombre d'éléments présent dans le tableau.
key
: clé de l'élément courant du tableau, celui vers lequel le pointeur fait référence.current
: valeur de l'élément courant.reset
: valeur du premier élément.end
: valeur du dernier élément.each
: valeur de l'élément courant, et avance le pointeur au suivant.prev
: valeur de l'élément précédent.next
: valeur de l'élément suivant.array_values($tab)
: renvoie un tableau contenant toutes les valeurs du tableau en paramètre. S'utilise pour reconstruire des clés consécutives sans changer les valeurs.array_keys($botteDeFoin, $aiguille)
: renvoie un tableau contenant toutes les clés du tableau en paramètre. De plus, si une valeur est définie en paramètre deux, le résultat ne contient que les clés associées à celle-ci.array_key_exists($cle, $tab)
: renvoie "vrai" si la clé est dans le tableau.array_key_first($tab)
: renvoie la première clé d'un tableau.array_key_last($tab)
: renvoie la dernière clé d'un tableau.array_diff($t1, $t2)
: renvoie le tableau des différences entre ceux en paramètres (peut servir pour supprimer par valeur).array_sum($tab)
: renvoie la somme des valeurs du tableau.array_intersect($t1, $t2)
: intersection entre plusieurs tableaux.
Exemple
modifier $tab = ["mixte valeur<sub>1</sub>","mixte valeur<sub>2</sub>","...","mixte valeur<sub>n</sub>"];
echo key($tab);
echo ' : ';
echo current($tab);
Affiche 0 : mixte valeur1
Les fonctions key()
et current()
peuvent accéder aux autres éléments du tableau après each()
ou next()
.
Il existe aussi différentes méthodes liées aux tableaux, des méthodes de tri, de recherche, de concaténation de tableaux, des méthodes d'ajouts et de suppressions d'éléments, etc.
Recherches
modifierin_array($aiguille, $botteDeFoin)
: recherche de présence par valeur. Renvoie un booléen si l'élément est trouvé.array_search($aiguille, $botteDeFoin)
: recherche de position par valeur. Renvoie la clé de l'élément trouvé, ou false sinon.array_keys($botteDeFoin, $aiguille)
: recherche par clé (déjà décrit au paragraphe précédent).
php -r "var_dump(in_array(0, ['test']));"
= true
Comparaison
modifierPour comparer deux tableaux :
$a1 == $a2; // compare le contenu et la taille
$a1 === $a2; // compare le contenu, la taille et l'index
Condition
modifierUn tableau vide dans une condition vaudra "faux", alors qu'un non vide vaudra "true".
Fonctions d'écriture
modifierPour manipuler des tableaux il est indispensable de connaitre les fonctions suivantes :
str_split($string)
: convertit une chaine de caractères en tableau itératif, chaque ligne étant composée d'un caractère.mb_str_split($string)
: idem mais en caractères multi-octets.explode($separateur, $tableau)
: convertit une chaine de caractères en tableau itératif, donc le contenu correspond aux sous-chaines situées autour d'un séparateur donné.implode($separateur, $tableau)
: convertit un tableau en chaine de caractères. Le séparateur à placer dans la chaine est facultatif.sizeof($tableau)
: renvoie la taille du tableau (le nombre d'objets qu'il contient). Attention : avant PHP 7.2 cette fonction pouvait aussi remplacerstrlen()
.array_push($monTableau, $valeur)
: ajoute une ligne à la fin du tableau, équivaut à$monTableau[]
[1] (empile).array_unshift($monTableau, $valeur)
: ajoute une ligne au début du tableau[2].array_pop($monTableau)
: retire la dernière ligne du tableau, en la renvoyant[3] (dépile).array_shift($monTableau)
: retire la première ligne du tableau, en la renvoyant[4].array_merge($monTableau1, $monTableau2, $monTableau3...)
: fusionne plusieurs tableaux[5].array_merge_recursive()
: idem en multidimensionnel.array_replace($monTableau1, $monTableau2, $monTableau3...)
: fusionne plusieurs tableaux en replaçant les clés existantes du premier par celles des autres. Cela permet par exemple de fusionner deux tableaux en préservant leurs clés.array_replace_recursive()
: idem en multidimensionnel.array_unique($tableau)
: filtre les valeurs en doublon (quelles que soient leurs clés).array_filter($tableau, fonction)
: filtre les lignes selon une fonction exécutée sur chaque élément. Pour injecter des variables dans la fonction, utiliser "use" (ex :array_filter($tableau, function($ligne) use($variable1){
...).array_column($tableau, colonne)
: filtre par colonne. Renvoie uniquement les valeurs d'un champ donné pour chaque élément.array_reduce($tableau, fonction)
: transforme le tableau selon une fonction exécutée sur chaque élément.array_map(fonction, $tableau)
exécute une fonction sur chaque valeur du tableau[6]. Exemples :- Pour trimer chaque ligne d'un tableau :
array_map('trim', $tableau)
- Pour créer un tableau de tableau :
array_map(function($ligne) { return explode('=', $ligne); } , $tableau)
- Pour trimer chaque ligne d'un tableau :
array_walk($tableau, fonction)
: exécute une fonction sur chaque élément (clé ou valeur).array_chunk($tableau, $taille)
: découpe le tableau fourni en tableaux de la taille fournie.array_slice($tableau, $début, $taille)
: renvoie la partie du tableau à partir de l'élément dont le numéro est le premier paramètre, de la taille en paramètre deux.array_flip($tableau)
: inverse les clés et valeurs. Attention : un tableau ne peut avoir que des types primitifs en clé, pas des objets (sinon c'est l'erreur Illegal offset type).unset($tableau[$index])
: supprimer la ligne.
Exemple
|
$chaine = 'MonFichier.2016.txt';
$tab = explode('.', $chaine); // au niveau des points, on explose la chaine (en trois)
var_dump($tab); /* affiche :
array(3) {
[0]=> string(10) "MonFichier"
[1]=> string(4) "2016"
[2]=> string(3) "txt"
}
*/
echo $tab[0]; // affiche : MonFichier
echo 'L\'extension du fichier est : '.$tab[sizeof($tab)-1]; // affiche : L'extension du fichier est : txt
|
Comme le premier indice du tableau est zéro, le dernier est égal à sa taille moins un.
Joindre les éléments "id" d'un tableau de tableaux
|
echo implode(', ', array_map(function ($ligne) {
return $ligne['id'];
}, $tableau));
|
Tris
modifierarray_multisort($tableau, SORT_ASC)
permet de trier un tableau dans l'ordre croissant de ses valeurs.sort($tableau)
: trie le tableau par valeurs croissantes, en recréant des clés numériques.asort($tableau)
: trie le tableau par valeurs croissantes, en conservant les clés associées.arsort, fonction)
: trie le tableau par valeurs décroissantes, en conservant les clés associées.ksort($tableau)
: trie par clés croissantes par défaut.krsort($tableau)
: trie par clés décroissantes par défaut.usort($tableau, fonction)
: trie selon une fonction donnée[7].
Exemple
|
$array = array("name"=>"Toyota", "type"=>"Celica", "colour"=>"black", "manufactured"=>"1991");
array_multisort($array, SORT_ASC);
var_dump($array);
// array(4) { ["manufactured"]=> string(4) "1991" ["type"]=> string(6) "Celica" ["name"]=> string(6) "Toyota" ["colour"]=> string(5) "black" }
// On remarque que les majuscules sont avant les minuscules.
arsort($array);
var_dump($array);
// array(4) { ["colour"]=> string(5) "black" ["name"]=> string(6) "Toyota" ["type"]=> string(6) "Celica" ["manufactured"]=> string(4) "1991" }
asort($array);
var_dump($array);
// array(4) { ["manufactured"]=> string(4) "1991" ["type"]=> string(6) "Celica" ["name"]=> string(6) "Toyota" ["colour"]=> string(5) "black" }
sort($array);
var_dump($array);
// array(4) { [0]=> string(4) "1991" [1]=> string(6) "Celica" [2]=> string(6) "Toyota" [3]=> string(5) "black" }
ksort($array);
var_dump($array);
// array(4) { ["colour"]=> string(5) "black" ["manufactured"]=> string(4) "1991" ["name"]=> string(6) "Toyota" ["type"]=> string(6) "Celica" }
|
Pour trier de l'Unicode il faut utiliser le flag "SORT_LOCALE_STRING".
Exemple :
$array = ['à', 'i', 'o', 'u', 'é'];
sort($array);
print_r($array);
setlocale(LC_COLLATE, 'fr'); // parfois 'fr_FR.UTF-8'
sort($array, SORT_LOCALE_STRING);
print_r($array);
donne :
Array ( [0] => i [1] => o [2] => u [3] => à [4] => é )
Array ( [0] => à [1] => é [2] => i [3] => o [4] => u )
Tableaux multi-dimensionnels
modifierLa clé d’un tableau peut pointer sur un second tableau créant ainsi un tableau multi-dimensionnel.
$indiv[] = [
'nom' => 'Hubert',
'poste' => 'Gérant',
'Email' => 'hubert@example.com',
'idBureau' => 1
];
$indiv[] = [
'nom' => 'Jean',
'poste' => 'Réceptionniste',
'Email' => 'reception@example.com',
'idBureau' => 1
];
$indiv[] = [
'nom' => 'Amélie',
'poste' => 'Président',
'Email' => 'contact@example2.com',
'idBureau' => 2
];
$affBureau = 1;
foreach ($indiv as $no => $data) {
if ($data['idBureau'] == $affBureau) {
echo $no .'-'. $data['nom'] .' <i>'. $data['poste'] .'</i> : '. $data['Email'] .'<br />';
}
}
Résultat :
- 0-Hubert Gérant : hubert@example.com
- 1-Jean Réceptionniste : reception@example.com
- NB : Dans cet exemple, une base de données serait sûrement plus adéquate.
ArrayAccess
modifierCette classe native permet de redéfinir l'opérateur d'index ([]
) dans les objets qui en héritent. Par exemple, pour lui faire accepter un autre tableau ou NULL comme index, ou déclencher un évènement quand on le modifie[8].
Destructuration
modifierPHP ne gère pas la destructuration avec l'opérateur égal comme le fait JavaScript ou Python (ex : x, y = getXY()
). À la place, il propose plusieurs fonctions :
list($x, $y)
: traite les variables en paramètre comme un tableau[9]. Ex :list($x, $y) = getArrayWithTwoLines();
compact($x, $y)
: crée un tableau avec les noms des variables en paramètre comme clés, et leurs valeurs comme valeurs[10].extract($tableau)
: déclare et assigne une variable pour chaque ligne du tableau en paramètre, de nom la clé de la ligne, et de valeur la valeur de la ligne[11] (contraire decompact()
).
Références
modifier- ↑ http://php.net/manual/fr/function.array-push.php
- ↑ http://php.net/manual/fr/function.array-unshift.php
- ↑ http://php.net/manual/fr/function.array-pop.php
- ↑ http://php.net/manual/fr/function.array-shift.php
- ↑ http://php.net/manual/fr/function.array-merge.php
- ↑ http://php.net/manual/fr/function.array-map.php
- ↑ http://php.net/manual/fr/function.usort.php
- ↑ http://php.net/manual/fr/class.arrayaccess.php
- ↑ http://php.net/manual/fr/function.list.php
- ↑ http://php.net/manual/fr/function.compact.php
- ↑ http://php.net/manual/fr/function.extract.php
Structures de contrôle
Une structure conditionnelle fonctionne de manière à ce que si la valeur de la condition est true
alors tel schéma est appliqué, et si la valeur est false
, un autre schéma est réalisé.
if - else
modifierLa structure la plus simple se présente sous la forme d'un if() {}
et d'un else {}
. Le if
teste une condition :
- Si elle est réalisée le code entre les accolades après le if sera exécuté, puis le serveur passera au code après le
else {}
; - Si elle n'est pas réalisée c'est ce qui est entre les accolades suivant le
else
qui sera exécuté.
<?php
if (condition) {
instruction au cas où la condition serait réalisée;
} else {
instruction au cas où la condition ne serait pas réalisée;
}
Emploi de if seul
modifierUn if
peut être employé seul, en fait le else
étant l'alternative, le code à exécuter par défaut, on peut s'en passer pour n'exécuter un code seulement si une condition est réalisée.
<?php
if (condition) {
instruction au cas où la condition est réalisée;
}
//si la condition n'est pas réalisée, il ne se passe rien
Emploi de elseif
modifierLorsqu'une condition n'est pas réalisée, plutôt que de passer directement à l'exécution du code par défaut (déclaré par else
), il peut être plus judicieux de tester une autre condition (déclarée par elseif
). En clair la structure est semblable à un ordre de préférence :
Symboliquement | Traduction en code |
---|---|
Soit une condition 1 La condition 1 est elle réalisée ? OUI code 1 (puis sortie de la structure hypothétique) NON la condition 2 est elle réalisée ? OUI code 2 (puis sortie de la structure hypothétique) NON la condition 3 est elle réalisée ? OUI code 3 (puis sortie de la structure hypothétique) NON ... (aucune des conditions annexes n'ont été vérifiées) Par défaut exécutons le code défaut |
<?php
if (condition 1) {
code 1;
} elseif(condition 2) {
code 2;
} elseif(condition 3) {
code 3;
} else {
code par défaut;
}
|
Imbrication
modifierOn peut imbriquer les if
les uns dans les autres. Simplement lorsqu'un if
imbriqué aura fini d'être exécuté, il retournera à l'étape logique suivante du rang hiérarchique supérieur.
<?php
if() {
if() { }
elseif() { }
else { }
}
elseif() {}
else {}
Notons que dans ce cas mieux vaut imaginer tous les cas de figure pour ne pas se retrouver avec une structure hypothétique vacillante en ce que la situation n'aura pas été prévue.
switch
modifierLorsque l'on teste des conditions en nombre important sur une même valeur, l'utilisation de if
est fastidieuse. Il existe bien heureusement une structure créée à cet usage : le switch
. On déclare la variable à tester avec switch
: switch($surlasellette) {}
. Dans ce switch
on utilise case
pour déclarer la valeur de la variable pour laquelle une action est envisagée : case "valeur":
(ici ne pas oublier les deux points !) une suite d'instructions s'ensuit et est généralement clôturée par break;
pour que les autres cas ne soient pas traités à la suite. La valeur par défaut, corollaire du else
pour if
, est introduite par default:
.
Avec if | Traduction en switch |
---|---|
<?php
$valeur = "testable";
if ($valeur == "ce n'est pas cela") {
echo "ok";
} elseif ($valeur == "ce n'est pas non plus cela") {
echo "ok";
} elseif($valeur == "c'est encore moins cela" or $valeur == "ou cela") {
echo "ok";
} else {
echo "pas d'accord";
}
|
<?php
switch (variable) {
case valeur_1:
instruction(s);
break;
case valeur_2:
instruction(s);
break;
case valeur_3:
case valeur_4:
instruction(s);
break;
default:
instruction(s);
}
|
switch
s'imbrique aussi comme if
.
Le plus important étant de ne pas oublier de mettre l'instruction break
avant un nouveau case
.
Le switch compare avec "==" et pas "===".
match
modifierDepuis PHP8, cette structure retourne une valeur selon plusieurs conditions[1]. Ex :
echo match ($variable) {
'clé_1' => 'valeur 1',
'clé_2' => 'valeur 2',
default => 'unknown value',
};
Syntaxe alternative
modifierPHP propose une syntaxe alternative aux accolades pour ses structures de contrôle, qui sont le ":" puis "end_nom_de_la_structure;"[2]. Ex :
if ($a == $b):
echo "Test";
endif;
C'est notamment pratique si vous utilisez php comme moteur de templating
<?php if ($a == $b): ?>
<p>Ici un paragraphe</p>
<?php else if ($a > $b): ?>
<p>Paragraphe alternatif</p>
<?php else: ?>
<p>Paragraphe si rien ne correspond</p>
<?php endif; ?>
Références
modifier
Boucles
Concept
modifierUne boucle est une instruction qui exécute un code tant qu'une condition établie est vérifiée. Si la condition est toujours vérifiée, on se trouve dans une boucle infinie. Les boucles permettent le parcours des tableaux et d'utiliser des données rendues sous la forme de tableau par une fonction de php dialoguant par exemple avec un autre langage.
Il en existe de deux types (avec des variantes) :
while()
: le programme se répète tant qu'une condition est vraie (ex : tant que x est inférieur à 10).for()
: le programme se répète un certain nombre de fois (ex : pour x allant de 1 à 10 avec un pas de +1 à chaque itération).
while
modifierwhile
est un mot anglais signifiant "tant que" en français. Le programme exécute une routine tant que la condition est vraie.
while (condition) {
instructions(s);
}
Deuxième syntaxe (moins courante) :
while (condition):
instructions(s);
endwhile;
Troisième syntaxe (assez rare), quand la condition contient une méthode qui change à chaque itération, jusqu'à renvoyer faux :
while (condition);
do while
modifierIdem avec premier passage obligatoire : la condition est vérifié en fin de bloc.
do {
instructions(s);
} while (condition);
for
modifierfor est un mot anglais signifiant "pour" en français. Le programme exécute une routine pour des valeurs d'une variable qui vérifient une certaine condition. Généralement cette condition est de type "intervalle", c'est-à-dire pour des valeurs plus petites qu'une borne.
for (première expression ; condition d'arrêt ; itération) {
instruction;
}
- Le premier élément est exécuté au début de la boucle dans tous les cas.
- Le second élément (la condition) est testé avant chaque exécution de l'instruction ou itération, s'il renvoie
TRUE
l'instruction sera exécutée, siFALSE
est renvoyé on sort de la boucle. - La dernière expression est exécutée après chaque itération.
Attention la structure dans la parenthèse est for( ; ; )
foreach
modifierLes boucles foreach
apparues avec PHP 4, constituent une manière simple de parcourir des tableaux. Il existe deux syntaxes :
- La plus simple s'intéresse aux clés dans les tableaux. Le type de ces clés dépend des valeurs contenues dans le tableau.
foreach
simplifie une tache qui aurait certes été possible avecfor
, mais fastidieuse :
Avec for | Avec foreach |
---|---|
$array = array('valeur1', 'valeur2', 'valeur3');
for($i = 0; $i < count($array); $i++) {
echo $array[$i]; //renvoie "valeur1valeur2valeur3"
}
|
$array = array('valeur1', 'valeur2', 'valeur3');
foreach($array as $value) {
echo $value; // renvoie "valeur1valeur2valeur3"
}
|
as
signifiant "comme", on récupère une variable contenant la valeur dans la cellule correspondante.
- La seconde se penche davantage sur les tableaux associatifs du type
$array = array( "ville" => "Montargis", "température" => "15 degrés" );
Ainsi on récupère le nom de la clé et la valeur du champ. En fait la structure $cle => $valeur
est celle de la déclaration du tableau.
foreach($array as $cle => $valeur) {
commandes;
}
Par ailleurs, il est possible d'itérer des objets depuis PHP 5.
break et continue
modifierLes mots clés :
break
: sort de la boucle avant la fin.continue
: passe immédiatement à l'itération suivante.
Pour sortir ou continuer la boucle mère :
break 2;
continue 2;
GFDL | Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture. |