Débuter avec PHP

Sortie HTML du serveur Web

PHP peut être utilisé pour ajouter du contenu aux fichiers HTML. Alors que le HTML est traité directement par un navigateur Web, les scripts PHP sont exécutés par un serveur Web et le HTML résultant est envoyé au navigateur.

Le balisage HTML suivant contient une instruction PHP qui ajoutera “Hello World!” à la sortie :

<!DOCTYPE html>
<html>
    <head>
        <title>PHP!</title>
    </head>
    <body>
        <p><?php echo "Hello world!"; ?></p>
    </body>
</html>

Lorsqu’il est enregistré en tant que script PHP et exécuté par un serveur Web, le code HTML suivant est envoyé au navigateur de l’utilisateur :

<!DOCTYPE html>
<html>
    <head>
        <title>PHP!</title>
    </head>
    <body>
        <p>Hello world!</p>
    </body>
</html>

echo a également une syntaxe de raccourci, qui vous permet d’imprimer immédiatement une valeur. Avant PHP 5.4.0, cette syntaxe courte ne fonctionnait qu’avec le paramètre de configuration [short_open_tag][1] activé.

Par exemple, considérez le code suivant :

<p><?= "Hello world!" ?></p>

Sa sortie est identique à la sortie de ce qui suit :

<p><?php echo "Hello world!"; ?></p>

Dans les applications du monde réel, toutes les données générées par PHP vers une page HTML doivent être correctement échappées pour empêcher les attaques XSS ([Cross-site scripting][2]) ou la corruption de texte.

Voir aussi : [Strings][3] et [PSR-1][4], qui décrit les meilleures pratiques, y compris l’utilisation correcte des balises courtes (<?= ... ?>).

[1] : http://php.net/manual/en/ini.core.php#ini.short-open-tag [2] : https://www.wikiod.com/fr/php/securite#Script intersite (XSS) [3] : https://www.wikiod.com/fr/php/les-types#Cordes [4] : http://www.php-fig.org/psr/psr-1/

Bonjour le monde!

La construction de langage la plus largement utilisée pour imprimer la sortie en PHP est echo :

echo "Hello, World!\n";

Alternativement, vous pouvez également utiliser print :

print "Hello, World!\n";

Les deux instructions remplissent la même fonction, avec des différences mineures :

  • echo a un retour void, tandis que print renvoie un int avec une valeur de 1
  • echo peut prendre plusieurs arguments (sans parenthèses uniquement), alors que print ne prend qu’un seul argument
  • echo est [légèrement plus rapide][1] que print

echo et print sont des constructions de langage, pas des fonctions. Cela signifie qu’ils n’ont pas besoin de parenthèses autour de leurs arguments. Pour une cohérence esthétique avec les fonctions, des parenthèses peuvent être incluses. De nombreux exemples d’utilisation de echo et print sont [disponibles ailleurs][3].

printf de style C et les fonctions associées sont également disponibles, comme dans l’exemple suivant :

printf("%s\n", "Hello, World!");

Voir [Sortir la valeur d’une variable][4] pour une introduction complète sur la sortie de variables en PHP.

[1] : http://www.phpbench.com/ [3] : https://www.wikiod.com/fr/php/sortie-de-la-valeur-dune-variable#écho et impression [4] : https://www.wikiod.com/fr/php/sortie-de-la-valeur-dune-variable

Sortie non HTML du serveur Web

Dans certains cas, lorsque vous travaillez avec un serveur Web, il peut être nécessaire de remplacer le type de contenu par défaut du serveur Web. Dans certains cas, vous devrez peut-être envoyer des données au format “texte brut”, “JSON” ou “XML”, par exemple.

La fonction [header()][header] peut envoyer un en-tête HTTP brut. Vous pouvez ajouter l’en-tête “Content-Type” pour informer le navigateur du contenu que nous envoyons.

Considérez le code suivant, où nous définissons Content-Type comme text/plain :

header("Content-Type: text/plain");
echo "Hello World";

Cela produira un document en texte brut avec le contenu suivant :

Bonjour le monde

Pour produire du contenu [JSON][1], utilisez plutôt le type de contenu application/json :

header("Content-Type: application/json");

// Create a PHP data array.
$data = ["response" => "Hello World"];

// json_encode will convert it to a valid JSON string.
echo json_encode($data);

Cela produira un document de type application/json avec le contenu suivant :

{“response”:“Bonjour le monde”}

Notez que la fonction header() doit être appelée avant que PHP ne produise une sortie, sinon le serveur Web aura déjà envoyé des en-têtes pour la réponse. Alors, considérez le code suivant :

// Error: We cannot send any output before the headers
echo "Hello";

// All headers must be sent before ANY PHP output
header("Content-Type: text/plain");
echo "World";

Cela produira un avertissement :

Attention : Impossible de modifier les informations d’en-tête - les en-têtes ont déjà été envoyés par (la sortie a commencé à /dir/example.php:2) dans /dir/example.php sur la ligne 3

Lorsque vous utilisez header(), sa sortie doit être le premier octet envoyé par le serveur. Pour cette raison, il est important de ne pas avoir de lignes vides ou d’espaces au début du fichier avant la balise d’ouverture PHP <?php. Pour la même raison, il est considéré comme une bonne pratique (voir [PSR-2][2]) d’omettre la balise de fermeture PHP ?> des fichiers contenant uniquement PHP et des blocs de code PHP à la toute fin d’un fichier .

Consultez la [section de mise en mémoire tampon de sortie][output-buffering] pour savoir comment “capturer” votre contenu dans une variable à sortir plus tard, par exemple, après avoir sorti les en-têtes.

[output-buffering] : https://www.wikiod.com/fr/php/mise-en-memoire-tampon-de-sortie [en-tête] : http://php.net/manual/en/function.header.php

[1] : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse [2] : http://www.php-fig.org/psr/psr-2/#2-2-files

Serveur PHP intégré

PHP 5.4+ est livré avec un serveur de développement intégré. Il peut être utilisé pour exécuter des applications sans avoir à installer un serveur HTTP de production tel que nginx ou Apache. Le serveur intégré est uniquement conçu pour être utilisé à des fins de développement et de test.

Il peut être démarré en utilisant le drapeau -S :

php -S <host/ip>:<port>

Exemple d’utilisation

  1. Créez un fichier index.php contenant :

  2. Exécutez la commande php -S localhost:8080 à partir de la ligne de commande. N’incluez pas http://. Cela démarrera un serveur Web écoutant sur le port 8080 en utilisant le répertoire actuel dans lequel vous vous trouvez comme racine du document.

  3. Ouvrez le navigateur et accédez à http://localhost:8080. Vous devriez voir votre page “Hello World”.

Configuration

Pour remplacer la racine du document par défaut (c’est-à-dire le répertoire courant), utilisez le drapeau -t :

php -S <host/ip>:<port> -t <directory>

Par exemple. si vous avez un répertoire public/ dans votre projet, vous pouvez servir votre projet à partir de ce répertoire en utilisant php -S localhost:8080 -t public/.

Journaux

Chaque fois qu’une demande est faite à partir du serveur de développement, une entrée de journal comme celle ci-dessous est écrite sur la ligne de commande.

[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /

Interface de ligne de commande PHP

PHP peut également être exécuté à partir de la ligne de commande directement à l’aide de la CLI (Command Line Interface).

CLI est fondamentalement le même que PHP à partir de serveurs Web, à l’exception de quelques différences en termes d’entrée et de sortie standard.

Déclenchement

L’interface de ligne de commande PHP permet quatre façons d’exécuter du code PHP :

  1. Entrée standard. Exécutez la commande php sans aucun argument, mais insérez-y le code PHP :
    echo ‘<?php echo “Hello world!”;’ | php
  2. Nom de fichier comme argument. Exécutez la commande php avec le nom d’un fichier source PHP comme premier argument :
    php hello_world.php
  3. Code comme argument. Utilisez l’option -r dans la commande php, suivie du code à exécuter. Les balises ouvertes <?php ne sont pas nécessaires, car tout dans l’argument est considéré comme du code PHP :
    php -r ’echo “Hello world!”;’
  4. Coque interactive. Utilisez l’option -a dans la commande php pour lancer un shell interactif. Ensuite, tapez (ou collez) le code PHP et appuyez sur return :
    $ php -a
    Mode interactif activé
    php > echo “Bonjour le monde !”;
    Bonjour le monde !

Production

Toutes les fonctions ou commandes qui produisent une sortie HTML dans le serveur Web PHP peuvent être utilisées pour produire une sortie dans le flux stdout (descripteur de fichier 1), et toutes les actions qui produisent une sortie dans les journaux d’erreurs du serveur Web PHP produiront une sortie dans le flux stderr (fichier descripteur 2).

Exemple.php

<?php
echo "Stdout 1\n";
trigger_error("Stderr 2\n");
print_r("Stdout 3\n");
fwrite(STDERR, "Stderr 4\n");
throw new RuntimeException("Stderr 5\n");
?>
Stdout 6

Ligne de commande Shell

$ php Example.php 2>stderr.log >stdout.log;\
> echo STDOUT; cat stdout.log; echo;\
> echo STDERR; cat stderr.log\

STDOUT
Stdout 1
Stdout 3

STDERR
Stderr 4
PHP Notice:  Stderr 2
 in /Example.php on line 3
PHP Fatal error:  Uncaught RuntimeException: Stderr 5
 in /Example.php:6
Stack trace:
#0 {main}
  thrown in /Example.php on line 6

Saisir

Voir : [Interface de ligne de commande (CLI)][4]

[1] : http://php.net/argc [2] : http://php.net/argv [3] : http://php.net/getopt [4] : https://www.wikiod.com/fr/php/interface-de-ligne-de-commande-cli

Séparation des instructions

Comme la plupart des autres langages de style C, chaque instruction se termine par un point-virgule. De plus, une balise de fermeture est utilisée pour terminer la dernière ligne de code du bloc PHP.

Si la dernière ligne de code PHP se termine par un point-virgule, la balise de fermeture est facultative s’il n’y a pas de code suivant cette dernière ligne de code. Par exemple, nous pouvons omettre la balise de fermeture après echo "No error"; dans l’exemple suivant :

<?php echo "No error"; // no closing tag is needed as long as there is no code below

Cependant, s’il y a un autre code suivant votre bloc de code PHP, la balise de fermeture n’est plus facultative :

<?php echo "This will cause an error if you leave out the closing tag"; ?>
<html>
    <body>
    </body>
</html>

Nous pouvons également omettre le point-virgule de la dernière instruction dans un bloc de code PHP si ce bloc de code a une balise fermante :

<?php echo "I hope this helps! :D";
echo "No error" ?>      

Il est généralement recommandé de toujours utiliser un point-virgule et d’utiliser une balise de fermeture pour chaque bloc de code PHP à l’exception du dernier bloc de code PHP, si aucun autre code ne suit ce bloc de code PHP.

Ainsi, votre code devrait essentiellement ressembler à ceci :

<?php
    echo "Here we use a semicolon!";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon and a closing tag because more code follows";
?>
<p>Some HTML code goes here</p>
<?php
    echo "Here we use a semicolon!";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon and a closing tag because more code follows";
?>
<p>Some HTML code goes here</p>
<?php
    echo "Here we use a semicolon!";
    echo "Here as well!";
    echo "Here as well!";
    echo "Here we use a semicolon but leave out the closing tag";

Balises PHP

Il existe trois types de balises pour désigner les blocs PHP dans un fichier. L’analyseur PHP recherche les balises d’ouverture et (le cas échéant) de fermeture pour délimiter le code à interpréter.

Balises standards

Ces balises sont la méthode standard pour intégrer du code PHP dans un fichier.

<?php
    echo "Hello World";
?>

Balises d’écho

Ces balises sont disponibles dans toutes les versions de PHP, et depuis PHP 5.4 sont toujours activées. Dans les versions précédentes, les balises d’écho ne pouvaient être activées qu’en conjonction avec des balises courtes.

<?= "Hello World" ?>

Balises courtes

Vous pouvez désactiver ou activer ces balises avec l’option short_open_tag.

<?
    echo "Hello World";
?>

Balises courtes :

  • sont interdits dans toutes les principales [normes de codage] PHP [1]
  • sont déconseillés dans [la documentation officielle][2]
  • sont désactivés par défaut dans la plupart des distributions
  • interférer avec les instructions de traitement XML en ligne
  • ne sont pas acceptés dans les soumissions de code par la plupart des projets open source

Balises ASP

En activant l’option asp_tags, les balises de style ASP peuvent être utilisées.

<%
    echo "Hello World";
%>

Celles-ci sont une bizarrerie historique et ne doivent jamais être utilisées. Ils ont été supprimés dans PHP 7.0.

[1] : http://www.php-fig.org/psr/psr-1/ [2] : https://secure.php.net/manual/en/language.basic-syntax.phptags.php