Cours de Rémi JarjatCours de Rémi Jarjat
  • Liste des cours
  • Culture numérique
  • Git
    • Terminologie
    • Avant de commencer
    • Créer un dépôt (local)
    • Enregistrer des changements
    • Des branches
    • Mise en commun du travail
    • Annuler des changements
    • Réécrire l'historique
    • Des outils pour se simplifier Git
    • Exercices
    • Exemples pratiques
  • Linux
    • Installation
    • Historique
    • Rangement des fichiers
    • Les processus
    • Commandes de base
    • Commandes avancées
    • /linux/6-other-technologies.html
    • Exercices
    • Correction des exercices
  • PHP
    • Environnement de travail
    • Bases du PHP
    • Tests et boucles
    • Procédures et fonctions
    • Interagir avec l'utilisateur
    • La temporisation de sortie
    • PHP Doc et PSR
    • PHP Orienté objet
    • Héritage et objets
    • Factorisation
    • Manipuler la BdD avec PDO (PHP Data Object)
    • Architecture MVC
    • Webservices REST
    • Exercices - Bases
    • Exercices - Séparer en plusieurs fichiers
    • Exercices - POST et SESSION
    • Exercices - Panier et validation
    • Exercices - Objets
    • Exercices - BdD avec PDO
    • Projet - montage d'ordinateurs
    • Projet - Personnages de Jeux de Rôle
  • Symfony
    • Installer Symfony et son environnement de travail
    • Structure et utilisation d'un projet
    • Le routing
    • Les controllers
    • Twig
    • Les services et l'injection de dépendances
    • Doctrine et la BdD
    • Formulaires
    • Les traductions
    • Event listeners/subscribers
    • Connexion et sécurisation
    • Bundles
    • Easy Admin Bundle
    • API Platform
    • Pense-bêtes
    • Symfony au quotidien
    • Travailler avec Docker
    • Projet : annonces de SPA / éleveurs
    • Exercices
  • Javascript
    • Les bases du langage
    • Manipulation logique
    • Le DOM
    • JQuery
    • Ajax
    • Programmation orientée objet
    • Webpack
    • Outils utiles
    • Révisions
  • Serveur Lamp
  • Déploiement
    • Des outils et manières de faire
    • Déploiement par FTP
    • Wordpress
    • Intégrer Git dans le processus
    • GitHub Pages pour déployer facilement
    • Symfony et Angular
  • Docker
  • Intégration continue
  • Sécurité informatique

Procédures et fonctions

  • Fonctions anonymes
  • Portée des variables
    • Variables $GLOBALS
  • Récursivité

En vidéo :

  • Fonction : fonction avec des arguments (ou non) retournant un résultat avec l'opérateur return
  • Procédure : fonction ne retournant aucun résultat

Par défaut, les paramètres n'ont pas de type (et peuvent prendre n'importe lequel sans erreurs).

// exemple de procédure
function foo()
{
    echo 'un exemple';
}

// exemple de fonction
// Noter que $argument a une valeur par défaut à 1
function doubleIt($argument = 1)
{
    return $argument * 2;
}

// exemple de fonction avec typage
function doubleItWithTypes(float $argument = 1): float
{
    return $argument * 2;
}

// exemple de fonction avec typage, pouvant également être null
function doubleItWithTypes(?float $argument = 1): ?float
{
    if (empty($argument)) {
        return null;
    }
    return $argument * 2;
}

Idéalement, il est utile d'ajouter des commentaires (annotations) pour préciser des éléments supplémentaires (types des paramètres et des retours, etc.). En php, on ne peut pas (encore) donner plusieurs types à un paramètre ou un retour et on ne peut que le faire avec une annotation.

/**
 * @param $argument int|float On précise ici que $argument peut être un entier ou un flottant
 * @return int|float On précise que la fonction retourne un entier ou un flottant
 */
function doubleIt($argument = 1)
{
    return $argument * 2;
}

/**
 * @param int|null $argument
 * @return int
 */
function doubleItInt(?int $argument = 1): int
{
    if (empty($argument)) {
        return 0;
    }
    return $argument * 2;
}

Appeler des fonctions :

function doubleIt($argument = 1)
{
    return $argument * 2;
}

echo doubleIt(); // Renvoie 2

echo doubleIt(8); // Renvoie 16

Fonctions anonymes

Dans certains cas, vous aurez besoin des fonctions anonymes : des fonctions que vous déclarez pour l'utiliser directement.

<?php
$tab = [1, 2, 3, 5, 6, 89, 8, 357, 68, 5, 3];

// ATTENTION, on passe $element par référence,
// c'est-à-dire qu'on va le modifier pendant le parcours
array_walk($tab, function (&$element) {
    // $element contient l'élément du tableau actuellement traité
    // On le modifie (ce qui n'aurait pas été possible sans le passage par référence)
    $element *= 2;
});

Comme toute fonction PHP, aucune valeur extérieure ne peut être appelée, mais on peut contourner ce souci grâce au mot-clé use !

<?php
$tab = [1, 2, 3, 5, 6, 89, 8, 357, 68, 5, 3];

// Cette fois, on va multiplier chaque élément du tableau
// par un nombre $nb défini en dehors de la fonction
$nb = 3;

// On peut injecter la variable $nb dans la fonction anonyme
// avec le mot-clé use
array_walk($tab, function (&$element) use ($nb) {
    $element *= $nb;
});

Portée des variables

En vidéo :

$a = 1; // Disponible dans l'espace de nom par défaut, disponible partout, hors fonctions

function doubleIt($argument = 1)
{
    // Ici, on ne peut pas appeler $a
    $b = $argument;
    
    return $b * 2;
}
// $b et $argument ne sont disponibles que dans la fonction et n'existent pas ici

On peut déclarer une variable comme globale, à n'importe quel endroit du code. Elle sera disponible après que le code ait été exécuté (un peu comme var en Javascript).

$a = 1; // Disponible dans l'espace de nom par défaut, disponible partout, hors fonctions

function foo($argument) {
    global $c;
    $c = $argument + 42;
}

foo($a);
echo $c; // affichera 43, $c est explicitement déclarée comme globale

Variables $GLOBALS

Il est possible, dans une fonction, d'accéder aux variables définies globalement, mais c'est fortement déconseillé :

$a = 1;
$b = 2;

function somme() {
    return $GLOBALS['a'] + $GLOBALS['b'];
}

echo somme(); // affichera 3

Récursivité

En vidéo :

Une fonction qui s'appelle elle-même :

function recursive($argument = 1) {
    $current = $argument;
    if ($current < 5) {
        $current = recursive($current + 1);
    }
    
    return $current; // cette fonction va invariablement finir par renvoyer,
    // sauf si l'argument contient un nombre plus grand
}
Dernières mise à jour :
Prev
Tests et boucles
Next
Interagir avec l'utilisateur