PHP PHP: Hypertext Preprocessor

Programmer en PHP

PHP est un langage interprété, dynamiquement typé, impératif et orienté aux objets avec une syntaxe inspirée par Perl, C et d’autres languages similaires.

<?php
    echo "Hello World!";
?>

Versions courantes : 5.6, 7.0.

PHP est aussi un framework web (assez basique):

  • API HTTP(S),
  • Moteur de templates (PHP est un langage de templating),
  • Sessions,
  • Abstraction de bases de données (SQL).

Délimiteurs PHP

PHP est orienté au texte :

  • Seul le code entre les délimiteurs <?php et ?> est exécuté.
  • Tout autre texte est affiché verbatim.
<?php
    echo "Hello World!\n";
?>
Hello Again!
Hello World!
Hello Again!
  • NOUS NE NOUS SERVIRONS PAS de cela ! Nos fichiers vont contenir uniquement du code PHP exécutable.

  • Il est conseillé d’omettre le ?> fermant dans les fichiers qui ne contiennent que du code PHP.

Commentaires

Les commentaires s’écrivent comme en C

<?php
    echo "Hello "; // Un commentaire
    /*
       Un commentaire
	   sur plusieurs lignes
    */

Ou comme en Perl

<?php
    echo "World!"; # Encore un commentaire

Variables

Les noms de variables commencent toujours par dollar ($).

<?php
    $a = 10;
    echo $a;
10

Les variables n’ont pas de type, elles ne sont pas déclarées, elles sont initialisées a une valeur par défaut.

<?php
    $foo = 10;
    echo $foo;
	echo "\n";
    $foo .= " apples";
    echo $foo;
10
10 apples

Conversions

Les variables sont converties automatiquement, ou leur type peut être forcé par un cast (comme en C).

<?php
  $foo = "10";
  $foo += 2;
  echo $foo;
  $bar = "\n" . $foo . " apples\n";
  echo $bar;
  $fee = (boolean) $bar;
  echo $fee == True;
12
12 apples
1

Portée

Les variables ont portée locale. Les fonctions introduisent une nouvelle portée locale.

<?php
  $a = "Hello";
   
  function foo() {
      echo $a;    # Cette variable est locale à foo
  }
    
  foo();          # N'affiche rien et donne un warning en PHP5

Variables globales

Une fonction peut déclarer explicitement ses variables global, pour les importer d’une portée externe.

<?php
    $a = "Hello";
    
    function foo() {
        global $a;
        echo $a;       # Cette variable est globale
    }
    
    foo();             # Affiche "Hello";

À utiliser avec parcimonie !

Constantes

Les constantes ne sont pas précédées par un symbole $. Elles peuvent être définies avec la fonction define, ou avec le mot clef const

<?php
    define("COLOR1", "blue");
    echo COLOR1;
    const COLOR2 = "red";
    echo COLOR2;
blue
red

Leur portée est toujours globale

<?php
    const COLOR = "blue";
    
    function foo() {
        echo COLOR;
    }
    
    foo();
blue

Chaînes de caractères (guillemets simples)

<?php
  echo 'Bonjour, ';
  # Il faut échapper les ' avec un backslash \
  echo 'J\'apprends "PHP". ';
  echo 'Les retours à la ligne
sont permis
   entre guillemets simples
';
  # On doit échapper les backslash avant le guillmet
  echo 'Ceci est un backslash \\';
  # Tous les autres sont pris tels quels
  echo ' ceci \ aussi. ';
  echo 'Même ceci : \n';

Sortie

Bonjour, J'apprends PHP. Les retours à la ligne
sont permis
   entre guillemets simples
Ceci est un backslash \ ceci \ aussi. Même ceci : \n

Chaînes de caractères (guillemets doubles)

<?php
  # Il faut échapper les "
  echo "V'là un \"backslash\": \\
";
  echo "Ceci est un retour à la ligne : \n";
  $foo = 42;
  echo '$foo est une variable';
  # Les variables sont substituées
  echo "\nLa réponse est : $foo \n";
  # Les accolades évitent les ambiguïtés
  echo "Votre {solde} est 2*${foo}00\n";

Sortie

V'là un "backslash": \
Ceci est un retour à la ligne :
$foo est une variable
La réponse est : 42 
Votre {solde} est 2*4200

Chaînes de caractères (Heredoc)

Syntaxe pour des chaînes complexes. On commence par <<<Identifier et on termine par Identifier, où Identifier est n’importe quel nom valide.

<?php
    echo <<<EOT
'A thousand kisses buys my heart from me;
And pay them at thy leisure, one by one.
What is ten hundred touches unto thee?
Are they not quickly told and quickly gone?
Say, for non-payment that the debt should double,
Is twenty hundred kisses such a trouble?

EOT;

Mêmes propriétés qu’entre guillemets doubles, à l’exception de l’échappement de ".

Concaténation de chaînes

Le point (.) est l’opérateur de concaténation.

<?php
  $a = 'Hello' . " World";
  $b = "$a!";
  $c = (2 * 10) . " " . $b;
  echo $c
20 Hello World!

Tableau associatifs

En PHP les index des tableaux peuvent avoir tout type

<?php
    $tab[0] = "Hello";
    $tab["one"] = "World";
    $tab[true] = "!";
    echo "$tab[0] ${tab['one']} ${tab[true]}";

Sortie

Hello world !

Il sont construits par la fonction array et affichés avec la fonction print_r.

<?php
    $tab = array(0 => 10,
	             "nested" => array(6 => 5, 13 => 9, "a" => 42));
    print_r($tab);

Sortie

Array
(
    [0] => 10
    [nested] => Array
        (
            [6] => 5
            [13] => 9
            [a] => 42
        )

)

Syntaxe impérative

<?php
    if ($a > $b) {
        echo "a is bigger than b";
    } elseif ($a == $b) {
        echo "a is equal to b";
    } else {
        echo "a is smaller than b";
    }
  • else if peut être utilisé à la place de elseif.

  • Il existe aussi une instruction switch, comme en C.

Boucles

<?php
    $i = 1;
    while ($i <= 10) {
        echo $i++;
    }
<?php
	$i = 1;
	do {
		echo $i++;
    } while ($i <= 10);
<?php
    for ($i = 1; $i <= 10; $i++) {
        echo $i;
    }

Boucle foreach

<?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as $value) {
        echo $value * 2;
    }
<?php
    $jours = array(
        "Sunday" => "Lundi",
        "Monday" => "Mardi",
        "Tuesday" => "Mercredi"
    );
    foreach ($jours as $eng => $fr) {
        echo "$eng is not $fr.\n";
    }
Sunday is not Lundi.
Monday is not Mardi.
Tuesday is not Mercredi.

Fonctions (arguments par défaut, variadiques)

<?php
    function foo($a, $b, $c=true) {
        if ($c)
            return $a + $b;
        else
            return $a - $b;
    }
	echo foo(1, 2) . " ";
    echo foo(1, 2, false);
3 -1
<?php
	# Uniquement dans PHP >=5.6
	function variadique($a, ...$b) {
		foreach ($b as $x)
			echo "$a : $x\n";
	}
	variadique('fruits', 'pomme', 'poire', 'mangue');
fruits : pomme
fruits : poire
fruits : mangue

Fonctions anonymes et clôtures

Les fonctions sont des objets de première classe en PHP

<?php
  $counter = 10;
  $incr = function($i) use ($counter) {
    $counter += $i;
    echo $counter . ' ';
  };
  
  $incr(1); $incr(2); $incr(3);
  echo "\n$counter";
11 12 13
10
  • Le mot clef use indique quelles variables de la portée externe sont importées dans la fonction.

  • Les variables importées par use sont copiées au moment de la définition (différent des clôtures de JavaScript, et beaucoup moins utile).

Importation

PHP ne possède pas un vrai système de modules, se contentant d’un système d’inclusion similaire à un pré-processeur.

<?php
  # exécute script1.php
  include 'script1.php';
  # comme avant, mais erreur si le fichier n'existe pas
  require 'script1.php';
  # exécute script2.php, seulement s'il ne l'a pas déjà été
  include_once 'script2.php'; 
  # comme avant, mais erreur si le fichier n'existe pas
  require_once 'script2.php';
  • Toutes les inclusions sont textuelles : les variables globales de chaque fichier sont disponibles pour tous les autres.

  • La portée des variables s’étend aux fichiers inclus, et inversement.

API HTTP

PHP fournit quelques variables globales par défaut qui représentent la requête HTTP courante

  • $_GET paramètres de l’URL (query string),
  • $_POST, $_FILES contenu de la requête,
  • $_SERVER entêtes HTTP,
  • $_COOKIE cookies,
  • $_SESSION stockage volatile.

Nous n’allons PAS NOUS SERVIR de cela, non plus !

À la place, nous utiliserons un framework plus avancé : Silex, framework léger dérivé de Symfony.

Lectures

Fork me on GitHub