Apprendre le PHP de zéro – tutoriel des fondamentaux sur le langage PHP

Découvrez comment développer une application web grâce au langage de développement PHP. Tutoriel sur les fondamentaux du langage de dévéloppement du PHP.

  Publié le

Qu'est-ce que le PHP ?

Le PHP (pour Hypertext Preprocessor) est un langage de développement interprété open source.
Sa syntaxe est relativement proche de celle du C++. Le PHP est l'un des 3 principaux langages employés dans la production de site internet à contenu dynamique. Ses principaux atouts sont une grande souplesse, et une facilité d'accès aux néophytes de par l'absence d'un typage fort. Le PHP couvre les concepts de la programmation orientée objet (encapsulation, polymorphisme, héritage de classe, surcharge). L'exécution d'un script en PHP nécessite un serveur (le plus souvent : Apache ou NGINX).

Points abordés dans cette première partie du tutoriel pour apprendre le PHP : 

Comment monter un serveur Apache avec WAMPP sous Windows ?

Rendez-vous sur : https://www.wampserver.com/
Téléchargez l'application et suivez le processus d'installation par défaut.
À l'issue de celui-ci vous aurez déployé un serveur Apache, MySQL sur votre PC.
En bas à droite de votre barre de tâche une nouvelle icône de notification est présente un petit W (vert voir image) pour signaler que les services sont actifs (ou rouges s’ils sont inactifs).
Ouvrez votre navigateur et rendez-vous à l'URL : http://127.0.0.1.
Cette adresse IP correspond à votre boucle locale (votre PC se connectant à lui-même).
Les informations qui s'affichent sont le résultat du script PHP C:\wamp64\www\index.php nous prendront bien soin de ne pas l'altérer.
Le dossier www est celui qui contiendra les différents sites hébergés par votre serveur.
Créez un dossier tests C:\wamp64\www\tests qui servira de conteneur pour la suite.

Comment créer un fichier PHP ?

Un fichier PHP commence toujours par la balise <?php et peut se terminer par la balise ?>. Dans le cas d'un fichier de script PHP qui ne contiendra rien d'autre, il est recommandé de ne pas utiliser balise de fermeture.

Les noms de fichiers ne doivent pas avoir de caractère spécial ni d'espace blanc. Ils doivent se terminer avec l'extension ".php".

Bien que l'encodage dépende de beaucoup de l'environnement, il est recommandé d'appliquer l'encodage UTF-8 (sans Byte Order Mark idéalement bien que cela dépende aussi de la version de PHP et de l'environnement d'exécution du serveur qui héberge l'application).

Le fichier par défaut d'une application est le fichier index.php. Créez un fichier index.php à l'emplacement : C:\wamp64\www\tests et rajouter le contenu suivant :

<?php 
echo "mon premier script php";

Rendez-vous à l'URL http://127.0.0.1/tests puis à l'adresse http://127.0.0.1/tests/index.php
vous constaterez le même résultat.
Si vous créez un fichier qui porte un autre nom que index.php il vous faudra le spécifiez dans l'URL lors de l'appel. Créez un fichier test.php et ajouter le contenu suivant : 

<?php 
echo "mon second script php";

Il sera accessible uniquement à l'adresse : http://127.0.0.1/tests/test.php.

Les instructions et les fins d'instruction en PHP

En PHP une instruction est un ensemble de fragments de code qui manipule des variables, ou réalise des vérifications conditionnelles, utilise des fonctions, instancie des objets, etc. Certains blocs d'instructions sont délimités par des accolades ouvrante et fermante. C'est le cas des fonctions, des voids, des classes, des espaces de nom et des conditions.

Les données non interprétées (ou commentaire) en PHP

En PHP, un commentaire est désigné dans une ligne grâce aux caractères //. Il peut également être réalisé sur un ensemble de lignes avec les caractères /** et */ (pour désigner la fin du bloc de commentaire).
Un commentaire est une donnée non interprétée par l'interprétateur de code. L'objectif principal d'un commentaire est de permettre au développeur de s'y retrouver dans son code quand celui-ci devient important ou si il contient des subtilités.
Dans l'exemple ci-après, la première ligne de code est un commentaire technique à destination de l'équipe de développement, la seconde est un fragment de code désactivé. Bien que cette technique soit déconseillée, il n'est pas rare de voir dans des applications des fragments de code désactivés. Ils peuvent servir pour réaliser des tests, ou être des fragments obsolètes qui devraient (pour des raisons de sécurité) être définitivement supprimés de l'application.

//Information sur le code
/**$a = true;
*if($a){
*die();
*}
*/

Les constantes et les variables en PHP

Les constantes sont des conteneurs, qui une fois leur valeur assignée ne peuvent plus être modifiée lors de l'interprétation du code. Dans les conventions de développement, les constantes sont déclarées en majuscule.

DEFINE("NOM_CONSTANTE","lavaleur");

On peut tester si une constante existe en utilisant ce fragment de code :

if(defined('NOM_CONSTANTE')){
	//Faire quelque chose, car la constante est déclarée
}
else{
	//Faire autre chose, car la constante n'est pas déclarée
}

À l'inverse, les variables sont des conteneurs de données dont le contenu peut évoluer au fil de l'exécution du code par l'interpréteur. En PHP il n'est pas nécessaire de définir le typage de la variable lors de sont initialisation, ainsi une chaine de caractères ou un entier sera instancié de la même façon (ce dernier point est la force et paradoxalement la faiblesse de ce langage).

//instancier une chaine de caractères
$ma_variable = "contenu de ma variable sur le PHP";

//instancier un entier de valeur 10
$ma_variable = 10;

//instancier un tableau à une dimension avec 3 valeurs 
$ma_variable =  array(10,15,35);

Les primitives et les types de données en PHP

Comme dans l'ensemble des langages de développement décliné du C++ il existe deux catégories de types de données en PHP. Les types de valeur qui stockent la valeur brute de bas niveau aussi appelée primitive (chaine de caractères, entier, décimale, etc), et les types de références qui servent à définir une référence mémoire vers la valeur des données (tableau, objet).

Parmi les primitives (aussi appelées type scalaire) on trouve :
bool (true ou false)
int (valeur de -2,147,483,648 à 2,147,483,647)
float / double (valeur de -3.402823e38 à 3.402823e38)
string (ensemble de symboles Unicode utilisés dans un texte)

Parmi les types de références (aussi appelée types composés) :
array (tableau de données à 1 ou X dimensions max 512)
object (un objet complexe)
(on citera aussi le callable et l'itérable).

Le type d'une donnée en PHP n'est pas systématiquement défini par le développeur et peut être défini par l'interpréteur au moment même de l'exécution (ce qui peut poser pas mal de problèmes dans les opérations arithmétiques, comme pour n'importe quel langage de développement à typage faible).

Les tableaux en PHP

Les tableaux indexés en PHP

Un tableau sert à regrouper diverses données d'un ou de plusieurs types. Ces données sont ordonnées et disponibles grâce à leur index. En informatique, l'index de base d'un tableau commence systématiquement à zéro. Le dernier index d'un tableau correspond à la taille totale du tableau -1. Ces tableaux sont dit indexés.

Pour instancier un tableau indexé il existe deux syntaxes :

$mon_tableau = array(); 
//ce qui correspond éxactement à 
$mon_tableau  = [];

On peut également instancier un tableau indexé directement avec des valeurs :

 $mon_tableau = array("php","csharp","c","c++");
//ce qui correspond éxactement à 
 $mon_tableau = ["php","csharp","c","c++"];

Pour ajouter une valeur à la suite d'un tableau indexé en PHP :

$mon_tableau[] = "javascript";
//ce qui donnera comme résultat ["php","csharp","c","c++","javascript"];

 Pour modifier la valeur d'une donnée déja indexée : 

$mon_tableau[0] = "demo";
$mon_tableau[2] = "test";
//ce qui donnera comme résultat ["demo","csharp","test","c++","javascript"];

Pour des raisons de vitesse de temps dans la rédaction de vos codes et dans la taille de vos scripts, je vous invite à utiliser principalement la syntaxe courte à l'aide des crochets.

Les tableaux associatifs en PHP

Un tableau associatif utilise une clé unique sous forme de texte pour définir chaque enregistrement. Il ne dispose donc pas d'index numérique comme c'est le cas pour le tableau indexé.
Dans l'exemple suivant les clés sont respectivement pays et France :

$mon_tableau = ["pays"=>"France","metier"=>"développeur"];

Pour modifier la valeur d'une donnée d'un tableau associatif en PHP on utilisera la "clé" au lieu de l''index.

$mon_tableau["pays"] = "canada"; 
// Ce qui nous donnera comme résultat ["pays"=>"canada","metier"=>"développeur"];

Les superglobales en PHP

Le PHP inclut un second concept de variable disponible dans l'ensemble du code sans restriction, appelées superglobales.

$_SERVER : un tableau associatif contenant des informations aussi bien d'entête de requête, que sur le script en cours d'exécution.
L'usage le plus courant est :

$_SERVER["PHP_SELF"] : sert à connaitre l'emplacement relatif du script en cours d'exécution.
$_SERVER["SERVER_ADDR"] : pour connaitre l'adresse IP du serveur qui exécute le script.
$_SERVER["REQUEST_METHOD"] : permet de connaitre la méthode (GET,HEAD,POST,PUT) utilisée pour accéder à la page.
$_SERVER["HTTPS"] : permet de savoir si le script PHP est appelé en HTTPS.

$_SERVER["REMOTE_ADDR"] : l'adresse IP du client qui appel le script.

Attention, les éléments préfixés HTTP suivants peuvent être falsifiés et ne doivent pas être considérés comme fiables. Ils ne doivent pas faire partie de la politique de sécurité de l'application.

$_SERVER["HTTP_REFERER"] : permet de connaitre l'URL de la page qui à permit d'accéder à notre page.
$_SERVER["HTTP_USER_AGENT"] : fournit les informations sur le navigateur et le système d'exploitation utilisé pour se connecté au site.

$_FILES : Tableau associatif lié aux mécanismes de téléchargement d'un fichier. (Nous y reviendrons)

$_GET : tableau associatif des variables transmises en GET (dans l'URL par exemple). Il est préférable d'employer les requêtes GET pour récupérer des données depuis le serveur.
Imaginons une URL : http://127.0.0.1?pseudo=john&id=44
Les paramètres sont derrières le point d'interrogation et chaque paramètre est séparé de l'autre par le caractère &.
Ainsi avec notre URL nous avons les paramètres name et id disponible :

$unsafe_pseudo = $_GET["pseudo"];
$unsafe_id= $_GET["id"];

À noter que les paramètres pouvant être modifiés ils doivent faire l'objet d'un contrôle strict exclusif.

$_POST : tableau associatif des variables transmises par un formulaire ou une requête XHR ou plus globalement par un protocole HTTP lors de l'utilisation de l'entête HTTP : application/x-www-form-urlencoded ou multipart/form-data
Il est d'usage d'utiliser les requêtes POST pour envoyer des données vers le serveur. Imaginons le formulaire HTML suivant : 

<form method="post" action="index.php">
	<input type="email" name="email" />
	<button type="submit">envoyer</button>
</form>

Une fois le bouton pressé par l'utilisateur, le contenu du champ "email" sera envoyé sur la page http://127.0.0.1/index.php et mappé par rapport au "name" de l'input.
Ainsi pour récupérer la donnée il suffira de faire :

if(isset($_POST["email"])){
	$unsafe_email = $_POST["email"];
}

Comme pour les paramètres $_GET ils doivent faire l'objet d'un contrôle strict exclusif.

$_COOKIE : tableau associatif des cookies disponibles sur le poste client, et envoyés par la requête au script. Il est important de souligner que les cookies sont accessibles par le client. Ils peuvent donc êtres modifiés et/ou supprimés.

$_REQUEST : Tableau associatif qui contient les données des autres superglobales GET,POST,COOKIE. (Il est préférable d'utiliser spécifiquement $_GET,$_POST ou $_COOKIE en fonction du besoin, pour limiter la surface d'attaque).

$_SESSION : tableau associatif d'informations propre à l'instance en cours d'exécution et stockée sur le serveur. La session n'est pas perdue lors d'un changement de page. La session est propre à chaque utilisateur. Un utilisateur A ne peut pas avoir accès aux données delà session de l'utilisateur B. nativement elle est liée à un jeton unique stockée dans un cookie sur le poste client. Il est préférable d'éviter le stockage de données "sensible" dans la session. Il est recommandé de favoriser le stockage des données sensibles en base de données avec chiffrement et de faire un appel uniquement quand votre code à besoin de ces informations. (voir : https://www.php.net/manual/fr/session.security.ini.php pour effectuer un paramétrage de sécurité approprié des sessions sous PHP).

Pour assigner une nouvelle valeur dans la session :

$_SESSION["user_id"] = 10;

Et pour récupérer la valeur de user_id.

$user_id = $_SESSION["user_id"] ;

L'objet stdClass en PHP

L'objet stdClass est l'objet natif de PHP il est générique. Il permet de stocker des données sous une forme approchante de celle d'un tableau associatif.

Pour instancier un objet de la class stdClass :

$mon_objet = new stdClass();

Pour définir des couples "clé/valeur" dans l'objet :

$mon_objet->macle = "valeur";

macle est ici une "propriété" de l'objet. (gardez bien ça à l'esprit nous y reviendrons quand nous aborderons la programmation orientée objet dans la partie 2).

Convertir un tableau associatif en objet stdClass

On utilise simplement la syntaxe suivante :

$tableau_associatif = ["pays"=>"France","metier"=>"développeur"];
$mon_objet = (object)$tableau_associatif; 

//Ce qui correspond à :
$mon_objet = new stdClass();
$mon_objet-> pays = "france";
$mon_objet-> metier = "développeur";

Les conditions en PHP

En PHP une condition est une opération de contrôle qui permet de définir si une donnée A correspond au format attendu. Il est possible de comparer toutes sortes d'entités, que ce soit des primitives (scalaires) ou des objets.

Structurellement une condition répond toujours à la syntaxe :
valeur à tester opérateur de comparaison valeur de référence
Le résultat d'une condition est toujours une variable boolean (true ou false).
La condition est donc soit vrai, soit fausse.
Il est possible de cumuler les conditions à l'aide de plusieurs portes logiques (ET, OU,OU EXCLUSIF) et l'ordre de résolution s'effectue de gauche à droite, en respectant la primauté des parenthèses.

Les opérateurs de comparaisons en PHP

Les conditions se bâtissent à l'aide des opérateurs de comparaison. Les principaux opérateurs de comparaisons en PHP sont :

== Égalité (sans contrôle du typage)
=== Égalité (avec contrôle du typage)
!= différence
> Supérieur à
< Inférieur à
>= Supérieur ou égal
<= inférieur ou égal
! Négation stricte et inversion d'une condition

Les portes logiques AND, et OR en PHP

Comme expliqué plus haut, il est possible de réaliser des conditions multifactorielles en cumulant plusieurs contrôles conditionnels.En PHP on utilisera les portes logiques suivantes :
&& ET (pour effectuer une condition multifactorielle)
|| OU (pour effectuer une condition multifactorielle)

L'instruction conditionnelle IF en PHP

L'instruction IF permet de réaliser une action si une condition est remplie (vrai). Il existe trois syntaxes. Cette première façon permet de cumuler plusieurs lignes d'instructions entre les accolades.

$int $age = 1;
if($age == 21) {
	//Si age est strictement égale à 21 alors faire quelque chose
} 
else if($age >= 22 && $age <= 28) {
	//Si age est supérieur ou égale à 22 et inférieur ou égale à 58 alors faire quelque chose
}
else{
	//Dans les autres cas faire autre chose
}

Seconde syntaxe de l'instruction conditionnelle IF en PHP sans les accolades. Comme elle ne comporte pas les accolades pour délimiter les jeux d'instruction, il n'est possible d'ajouter qu'une seule ligne d'instruction par condition :

if($age == 21)  //action 
else if($age >= 22 && $age <= 28)  //action 
else   //action 

Dernière syntaxe, l'analyse conditionnelle se fait sur une seule ligne et elle permet d'assigner un résultat directement à une autre variable. Soit le résultat de la condition comme c'est le cas ici :

$allowed = $age == 21; 

Soit d'assigner une valeur spécifique d'une primitive ou d'un objet.

$ allowed = $age == 21 ? "autorisé" : "non autorisé" ;

Cette dernière est particulièrement pratique dans des cas d'assignations de paramètres, depuis la base de données ou d'un fichier de configuration.

$proxy_ip = $settings->get_ip() != null ? $settings->get_ip() : "127.0.0.1";

L'instruction conditionnelle SWITCH en PHP

L'instruction SWITCH s'utilise pour éviter d'écrire des instructions IF avec de nombreux cas.

$version = 5;
$result = null;
switch ($version)
{
	  case 4:
        case 5:
              	//Si la version est strictement égale à 4 ou à 5 alors faire quelque chose
		  $result = "votre version  de PHP est trop vieille";
                break;
        case 7:
        case 8:
                //Si version est strictement égale à 7,8  alors faire quelque chose
		$result = "votre version de PHP est à jour";
                break;
        default:
                //Autre cas 
			$result = "votre version de PHP  n'est pas une version stable";
                break;
}

On notera la présence de "break" qui permet de sortir du bloc de code (la zone délimitée par les accolades), d'est que la bonne condition est remplie. Le switch est donc beaucoup plus rapide que l'instruction IF en temps de traitement.

L'instruction conditionnelle MATCH en PHP

En plus du IF et du SWITCH, PHP inclus depuis la version 8, le MATCH.
Qui est sémantiquement identique au SWITCH mais qui permet d'assigner le résultat directement à une variable, en limitant les répétitions de codes.

$version = 5;
$result = match ($version) {
    4,5 => 'votre version  de PHP est trop vieille',
    7,8 => 'votre version de PHP est à jour',
    default => 'votre version de PHP  n'est pas une relase stable'
};


Les boucles en PHP

Les boucles servent à parcourir des collections d'objets, des tableaux, ou à réaliser des compteurs. Il existe trois boucles, while, for, foreach.

L'instruction WHILE en PHP

L'instruction WHILE sert à réaliser une boucle "tant que" la condition est vrai. La condition sera testée en début de boucle à chaque nouvelle itération.

$counter =1;
while ($counter <= 32) {
    echo "ligne " . $lignes;
    $counter++;
}

Dans notre exemple, le code réalisera 32 itérations et affichera à chaque fois "ligne 1", puis "ligne 2", etc, jusqu'a "ligne 32".

L'instruction FOR et FOREACH en PHP

Dans l'exemple suivant, nous réalisons une boucle de 10 occurrences, de 0 à 9. À chaque itération, la variable i est incrémentée de +1.

for ($i = 0; i < 10; i++)
{
   //faire quelque chose
}

Sur l'exemple ci-dessous, nous réalisons une boucle en PHP de 3 occurrences, de 0 à 15 avec une progression de +5 à chaque itération.

for ($i = 0; i < 15; i+=5)
{
	//sur 3 occurrences faire quelque chose
}

Maintenant nous allons voir comment parcourir un simple tableau de mots. Notre tableau contient plusieurs noms de lieux, et nous souhaitons la parcourir et quitter la boucle quand le lieu sera "Paris".

$lieux = ["Madrid", "Marseille", "Paris", "Lyon"];
foreach ($lieu in lieux)
{
	if($lieu == "Paris")  break;
}

Il est également possible d'arriver au même résultat en utilisant la boucle incrémentale en utilisant l'index des objets dans le tableau

$lieux = ["Madrid", "Marseille", "Paris", "Lyon"];
$max_lieux = count(lieux)

for ($i = 0; i < $max_lieux i++)
{
	if ($lieux[$i] == "Paris") break;

}

Par souci de performance, nous réalisons le comptage du nombre d'index dans le tableau lieux grâce à la fonction count(). Puis nous bouclons de 0 au nombre d'index.

Les différents types de fonctions en PHP

La méthode (ou fonction) est un fragment de code réutilisable. Il existe deux types de méthodes en PHP. La fonction déclarée et la fonction anonyme.

La fonction déclarée en PHP

Pour déclarer une fonction en PHP on utilise le mot réservé "function". Elle est délimitée par les accolades { }.
Le code produit dans la fonction est dit à porter "restreinte". Les variables déclarées à l'intérieur ne sont pas accessibles à l'extérieur.

function demo() {
	//Votre code réutilisable à portée restreinte 
	$test = 10; //Test est inaccessibles en dehors de la fonction
	return 1;
}

Une fonction à un nom unique (ici "demo").

Elle peut prendre de zéro à plusieurs paramètres d'entrées les paramètres sont toujours séparés par une virgule, et organisés du paramètre obligatoire vers les paramètres optionnels; les paramètres optionnels disposent d'une valeur auto assignée (ici $c est optionnel et est assigné à la valeur 10 par défaut).

function demo(int $a ,int $b,int $c = 10)

Depuis PHP 7 il est possible de forcer des typages de données par paramètres
Il est ainsi possible d'obliger un paramètre à être un entier, une chaine de caractère, un objet ou une interface. Typer vos paramètres d'entrées est une garantie de fiabilité dans votre code. Il est également possible d'autoriser une valeur null à l'aide de l'opérateur "?". Comme le présente l'exemple suivant avec le paramètre $d.

function demo(int $a ,string $b,array $c = [1,2], ?array $d = null)

Il est possible d'obliger un type de donnée de retour, dans l'exemple suivant notre fonction PHP s'engage à retourner un entier ou null (là encore spécifié par le caractère "?").

function demo(int $a ,int $b,int $c = 10) : ?int

Pour retourner un résultat une fonction doit utiliser le mot réservé return.

function demo(int $a ,int $b,int $c = 10) : ?int{
	return $a +$b+$c;
}


Si la valeur de retour ne correspond pas au typage de la promesse de retour, PHP lèvera une erreur fatale.

Pour utiliser une fonction et récupérer son résultat, on appliquera la syntaxe suivante :

$result = demo(5,10,3);

Avec ces paramètres, notre function demo produira un résultat de 18.

Une fonction peut être une promesse de retour d'un résultat comme dans notre exemple ci-dessus, ou à l'inverse sans résultat. Si une fonction ne doit jamais rien retourner (fonction de sécurité par exemple). Il est préférable de lui adjoindre le mot réservé "void".

function disconnect_user() : void
{
  //Code qui ne retourne rien
}

Dans le corps de la fonction, on prêtera une attention particulière à utiliser soit "return;" pour sortir de la fonction sans envoyer de résultat. Ou à ne rien mettre (la fonction s'arrêtant à la fin de son exécution).

Fonction anonyme

Il est également possible de produire des fonctions dites anonymes. Elles peuvent être créées sans déclarer leur nom.
Leur création vise principalement à répondre aux problématiques :
Pour la création des fonctions de rappel.
Pour rattacher de fonction à des variables.
À restreinte des portées d'exécution.
Forcer des paramètres
Elles peuvent au même titre que les fonctions nommées avoir des arguments obligatoires ou optionnels, avoir des types de retour ou être des void.

Pour déclarer une fonction anonyme non liée à une variable :

function () {
	//votre code 
}

Pour déclarer une fonction anonyme liée à une variable :

$mafunction = function (int $a) : bool {
	return $a >= 10;
}

Pour l'employer, on utilisera la syntaxe :

$result = $mafunction(11);

Ici result sera égale à true.

Une seconde syntaxe existe pour forcer des paramètres à l'aide du mot réservé "use":

$t = 10;
$mafunction = function (int $a) use(int $t) : bool {
	return ($a+$t) >= 10;
}
$result = $mafunction(1);

Ici result sera à nouveau égale à true.

Fin de la partie 1

Dans la partie 2 :

Les niveaux d'accessibilités en PHP
La programmation orientée objet ou POO en PHP
Les classes en PHP
L'abstraction et l'héritage de classe en PHP
Les interfaces de classe en PHP
Les espaces de nom en PHP
La gestion des erreurs et l'instruction TRY CATCH en PHP
L'inclusion de fichier en PHP

Les expressions régulières en PHP
La réflexion de classe en PHP et les concepts avancés d'initialisation d'objet