Bases du langage du php

Introduction

Vous allez commencer ici à utiliser PHP à travers un outil en ligne qui va vous permettre de vous approprier les bases du langage sans avoir à installer quoi que ce soit sur votre ordinateur. Cet outil propose en effet un environnement qui autorise l’exécution de code PHP saisi par l’utilisateur.

On vous propose d’utiliser le service PHP Sandbox link mais il en existe d’autres (ex. : PHP Fiddle link).

php sandbox

Noter que dans l’exemple figurant dans le screenshot ci-dessus, la balise fermante ?> a été omise. Ceci suit la recommandation du site de référence de PHP qui indique dans la section “Balises PHP” link :

[...] Si un fichier est purement du code PHP, il est préférable de ne pas placer la balise de fermeture à la fin du fichier. Ceci permet d’éviter d’oublier un espace ou une nouvelle ligne après la balise de fermeture de PHP, ce qui causerait des effets non voulus car PHP commencera à afficher la sortie, ce qui n’est souvent pas ce qui est désiré.

💻 Travail n° 1 : Découverte du langage

À partir d’internet, de cet aide-mémoire PHP link et du service PHP Sandbox link, donner les instructions ou suites d’instructions PHP qui permettent d’effectuer les opérations spécifiées dans les questions suivantes.

Exemples de sites bien utiles pour pouvoir répondre aux questions posées

🎯 Travail à faire :

  1. Afficher la chaîne de caractères Hello world ! avec l’instruction echo

  2. Afficher la chaîne de caractères Qui a dit : "Veni, vidi, vici" ? avec l’instruction echo
    (Noter les doubles guillemets autour de la locution latine)

  3. Afficher le nombre 1802

  4. Déclarer, initialiser une variable numérique anneeNaissance avec le nombre 1802 puis l’afficher

  5. Afficher bout à bout les 2 chaînes de caractères “Hello” et “␣world !” en n’utilisant qu’une seule instruction echo (→ opérateur de concaténation).

  6. Afficher le texte Victor Hugo est né en 1802 en utilisant la variable anneeNaissance.

    Vous utiliserez pour cela 2 méthodes :

    1. concaténation d’une chaîne de caractères et d’une variable

    2. évaluation de la variable au sein de la chaîne de caractères (→ variable expansion)

  7. Déclarer, initialiser une variable booléenne à “vrai” puis l’afficher avec l’instruction echo, la fonction var_dump() et la fonction print_r().

    Expliquer les différences entre ces 3 manières d’afficher une variable.

  8. Définir une constante pour la valeur de PI et l’afficher.

  9. Déclarer, initialiser un tableau nommé fruits avec les 3 fruits pomme, abricot, orange puis l’afficher avec print_r() et var_dump()

  10. Ajouter le fruit pêche au tableau précédent en dehors de sa déclaration et de son initialisation réalisées à la question précédente

  11. Déterminer par programmation la longueur du tableau de fruits et l’afficher

  12. Afficher à l’aide d’une boucle for() tous les élément du tableau

    Un retour à la ligne peut être obtenu en concaténant la constante PHP PHP_EOL à la chaîne à afficher.

  13. Modifier la déclaration et l’initialisation du tableau de fruits de façon à associer à chaque fruit une information qui indique si c’est un fruit à pépin (→ valeur pépin) ou à noyau (→ valeur noyau).

    Ceci consiste donc à déclarer un tableau associatif dont chaque élément sera constitué d’une paire clé/valeur avec le nom du fruit (→ clé) et son type (→ valeur : noyau ou pépin).

  14. Ajouter le fruit cerise au tableau précédent après son initialisation

  15. Afficher à l’aide d’une boucle foreach() tous les élément du tableau de fruits

  16. Ajouter une condition dans la boucle pour n’afficher que les fruits à noyau.

  17. Créer une fonction utilisateur typeFruit() qui prend en paramètre un nom de fruit et qui retourne son type (→ noyau, pépin) ou inconnu lorsque celui-ci n’appartient pas au tableau des fruits.

    Consignes
    • La définition du tableau fruits sera déplacé au sein de cette fonction.

    • Des appels à cette fonction seront réalisés pour vérifier son bon fonctionnement

  18. Créer une fonction infoFruitPrefere() — sans paramètre — qui vante les qualités du fruit présent dans une variable définie en dehors de ce cette fonction (→ variable globale). Ceci vous permettra de voir comment accéder à une variable globale en PHP depuis le corps d’une fonction.

    Consignes
    • Utiliser la structure de contrôle switch()/case pour sélectionner le texte à afficher selon le fruit préféré.

    • Débuter chaque affichage par une présentation générique du fruit qui indique son type :

      La pomme est un fruit à pépin. Ces vertus sont les suivantes :
      
      . réhydratante
      
      . antioxydante
      
      . ...

      La 1ère phrase sera ainsi affichée, quel que soit le fruit, à partir du contenu de la variable globale et de l’information sur son type extraite du tableau associatif.

      Le reste sera du texte spécifique à chaque fruit c’est-à-dire affiché depuis chaque clause case du switch().


💻 Travail n° 2 : Programmation objet 1/2

PHP — tout comme le langage C++ ou Python — permet de faire de la programmation objet.

Dans les questions suivantes, on vous demande donc de tranposer en PHP les principes de la programmation objet étudiés jusqu’à présent à travers du langage C++ ou de Python de façon, à se rendre compte de leur universalité.

Vous pourrez trouver des informations sur la programmation en objet en PHP sur Apprendre à PHProgrammer link. Les rubriques “Les classes et objets”, “Visibilité des propriétés et des méthodes”, “Méthodes magiques : __set() et __get()” seront particulièrement utiles pour répondre aux questions.

🎯 Travail à faire :

  1. Définir une classe FormeGeometrique possédant les attributs privés suivants :

    • xOrigine

    • yOrigine

    • type

  2. Enrichir la classe pour lui ajouter un constructeur qui initialise ses attributs xOrigine et yOrigine à 0 et son attribut type à Carré.

  3. Enrichir la classe avec les méthodes magiques __get() et __set() pour permettre de lire ou de modifier les valeurs de ses attributs privés.

    Cette fonctionnalité n’est pas disponible de base en C++ mais correspond à ce qu’on appelle des accesseurs (→ getters) ou mutateurs (→ setters) dans ce langage.

    En revanche, cette fonctionnalité existe dans le langage C# à travers la notion de “propriété”.

  4. Instancier la classe FormeGeometrique puis modifier ses attributs avant de réaliser un affichage qui renseigne sur la forme géométrique instanciée (Ex. : “L’objet présent dans la variable $maFormeGeometrique est un cercle dont les coordonnées d’origine sont (10, 50)”)

Solution :

<?php
class FormeGeometrique {
    private $xOrigine;
    private $yOrigine;
    private $type;
      
    function __construct() {
        echo "Appel du constructeur" . PHP_EOL;
        $this->xOrigine = 0;
        $this->yOrigine = 0;
        $this->type = "Carré";
    }
    
    function __get($attribut) { // Lire la valeur attribut
        echo "Appel de __get(" . $attribut . ")" . PHP_EOL;
        
        switch($attribut) {
            case 'xOrigine' :
                return $this->xOrigine;
                break;
            case 'yOrigine' :
                return $this->yOrigine;                
                break;
            case 'type' :
                return $this->type;                
                break;
            default :
                throw new Exception('Attribut inconnu !');
                break;
        }
    }
    
    function __set($attribut, $valeur) {
        echo "Appel de __set(" . $attribut . ", " . $valeur . ")" . PHP_EOL;
        
        switch($attribut) {
            case 'xOrigine' :
            case 'yOrigine' :
                if ( ctype_digit($valeur) || is_numeric($valeur) ) { // 123
                    $this->$attribut = (int) $valeur;
                } else {
                   throw new Exception("valeur non valide pour l'attribut \$" . $attribut . " !"); 
                   // On utilise le concept de "variable variable" ($$attribut) pour afficher le nom 
                   // du paramètre invalide (xOrigine ou, yOrigine)                     
                }
                break;
            case 'type' :
                if ( in_array($valeur, ["Carré", "Cercle", "Triangle", "Rectangle"]) ) {
                    $this->$attribut = $valeur;
                } else {
                    throw new Exception("valeur non valide pour l'attributt \$" . $attribut . " !");                   
                }              
                break;
            default :
                throw new Exception('Attribut inconnu !');
                break;
        }        
    }
}


$maFormeGeometrique = new FormeGeometrique();


// On affiche les valeurs des attributs en appelant la méthode __get()
echo "La forme géometrique est actuellement un " . $maFormeGeometrique->type . " dont l'origine est (" . $maFormeGeometrique->xOrigine . ", " . $maFormeGeometrique->yOrigine .")" . PHP_EOL;

$maFormeGeometrique->type = "Triangle"; // appel de $maFormeGeometrique->__set("type", "Triangle")
$maFormeGeometrique->xOrigine = "50"; // appel de $maFormeGeometrique->__set("xOrigine", "50")
$maFormeGeometrique->yOrigine = 75; // appel de $maFormeGeometrique->__set("yOrigine", 75)


echo "La forme géometrique est désormais un " . $maFormeGeometrique->type . " dont l'origine est (" . $maFormeGeometrique->xOrigine . ", " . $maFormeGeometrique->yOrigine .")";
?>

💻 Travail n° 3 : Programmation objet 2/2

Vous allez devoir ici mettre en place un héritage depuis une classe abstraite.

Vous pourrez trouver des informations sur l’héritage en PHP — notamment appliqué aux classes abastraites — dans la rubrique “Les classes abstraites et finales” du site Apprendre à PHProgrammer link.

🎯 Travail à faire :

  1. Modifier la classe FormeGeometrique pour la rendre abstraite et rendre ses attributs protected plutôt que private.

  2. Tenter d’instancier cette classe. Qu’indique PHP ? Expliquer.

  3. Ajouter à cette classe une méthode abstract nommée calculerPerimetre() qui permet de calculer le périmètre de la forme géométrique.

  4. Créer une classe Cercle qui hérite de FormeGeometrique et dont le constructeur prend en paramètre la longueur de son rayon.

  5. Implémenter le code de calculerPerimetre() pour la classe Cercle puis tester son bon fonctionnement (→ instanciation d’un objet de type Cercle puis appel de sa méthode calculerPerimetre)

Solution :

<?php
abstract class FormeGeometrique {
    protected $xOrigine;
    protected $yOrigine;
    protected $type;
    
    function __construct() {
        $this->xOrigine = 0;
        $this->yOrigine = 0;
        $this->type = "Carré";
    }
    
    function __get($attribut) {
        switch($attribut) {
            case 'xOrigine' :
                return $this->xOrigine;
                break;
            case 'yOrigine' :
                return $this->yOrigine;                
                break;
            case 'type' :
                return $this->type;                
                break;
            default :
                throw new Exception('Attribut inconnu !');
                break;
        }
    }
    
    function __set($attribut, $valeur) {
        switch($attribut) {
            case 'xOrigine' :
            case 'yOrigine' :
                if ( ctype_digit($valeur) || is_numeric($valeur) ) {
                    $this->$attribut = (int) $valeur;
                } else {
                   throw new Exception("valeur non valide pour l'attribut \$" . $attribut . " !"); 
                   // On utilise le concept de "variable variable" ($$attribut) pour afficher le nom 
                   // du paramètre invalide (xOrigine ou, yOrigine)                     
                }
                break;
            case 'type' :
                if ( in_array($valeur, ["Carré", "Cercle", "Triangle", "Rectangle"]) ) {
                    $this->$attribut = $valeur;
                } else {
                    throw new Exception("valeur non valide pour l'attributt \$" . $attribut . " !");                   
                }              
                break;
            default :
                throw new Exception('Attribut inconnu !');
                break;
        }        
    }
    
    abstract function calculerPerimetre() : float;
}


class Cercle extends FormeGeometrique {
    function __construct($rayon) {
        parent::__construct();
        $this->rayon = $rayon;
        parent::__set('type', "Cercle");
    }
    
    final function calculerPerimetre() : float {
        return 2 * M_PI * $this->rayon; 
    }

    function __get($attribut) {
        switch($attribut) {
            case 'rayon' :
                return $this->xOrigine;
                break;
            default :
                //throw new Exception('Attribut inconnu !');
                return parent::__get($attribut);
                break;
        }
    }
    
    function __set($attribut, $valeur) {
        
        switch($attribut) {
            case 'rayon' :
                if ( ctype_digit($valeur) || is_numeric($valeur) ) {
                    $this->$attribut = (int) $valeur;
                } else {
                    throw new Exception("valeur non valide pour l'attribut \$" . $attribut . " !");                   
                }
                break;
            default :
                //throw new Exception('Attribut inconnu !');
                parent::__set($attribut, $valeur);
                break;
        }        
    }

}

$monCercle = new Cercle(20);
$monCercle->xOrigine = "10"; // Le setter accepte les nombres sous leur format numérique ou leur représentation textuelle
$monCercle->yOrigine = 50;

echo <<<HEREDOC
La forme géométrique est un  {$monCercle->type} de rayon {$monCercle->rayon} dont l'origine est en ({$monCercle->xOrigine}, {$monCercle->yOrigine}).
Sa circonférence est {$monCercle->calculerPerimetre()}
HEREDOC
?>

Conclusion

Vous avez découvert rapidement dans cette activité la syntaxe de base du langage PHP pour mettre en œuvre les concepts de base de la programmation informatique :

  • variables (simples, tableaux, tableaux associatifs)

  • structures de contrôle itératives et conditionnelles

  • fonctions

  • programmation objet (constructeur, attributs, méthodes…​)

Bien d’autres choses sont à apprendre pour maitriser le langage mais vous avez pu vous rendre compte qu’il n’était pas si difficile de passer d’un langage comme le C/C++ ou Python au PHP lorsqu’on a assimilé les bases de la programmation informatique.

🞄  🞄  🞄