Le support est disponible ici : https://cours.davidannebicque.fr/programmation-orientee-objet-en-php/
Ce module aborde les concepts théoriques de la POO et quelques exercices. Mais le lien sera directement fait avec Symfony, qui est un framework PHP orienté objet.
Quelques TD et TP seront consacrés à des exercices pratiques, guidés sur les concepts de la POO.
Les derniers TP seront consacrés l'utilisation dans Symfony et en lien avec WR319.
Au fur et à mesure que les programmes écrits avec une approche procédurale grossissent, ils deviennent fragiles et mettent en danger les données (et c'est compliqué à maintenir/corriger... souvenez vous du S2)
Pour un être humain :
Pour un humain :
public $taille = 175;
protected $poids = 180;
private $couleurCheveux = 'blond';
let age = 38;
let anneeBac = 2001;
public function courir() {...}
protected function sauter() {...}
On verra la syntaxe d'une classe dans la seconde partie du cours
Un objet renferme ses propriétés et ses méthodes (selon la définition donnée par la classe).
class Personne {
public $age;
public $prenom;
...
}
$p = new Personne();
$p->age = 'David';
$p->prenom = 30;
Ce code est syntaxiquement correct, et rien ne va interdire de mettre un nombre dans prénom et une chaîne de caractères dans âge.
Une erreur se déclenchera peut-être, plus tard lors de l'utilisation de cet objet (par exemple augmenter l'age)
class Personne {
private $age; //on change public par private
private $prenom; //on change public par private
...
}
$p = new Personne();
$p->age = 'David';
$p->prenom = 30;
Ce code va provoquer une erreur, on ne peut plus accéder directement.
class Personne {
...
public function setAge($age) {
if (is_int($age)) { //on peut faire un test
$this->age = $age;
} else {
echo 'indiquer un nombre';
}
}
}
$p = new Personne();
$p->setAge(30);
Le code est un peu plus long, mais plus fiable. On peut ajouter des tests pour s'assurer que les bonnes informations sont passées dans les propriétés.
Lorsque l'on travaille à plusieurs, on est sûr que les données ne sont pas modifiées par un autre développeur et on est certain des données que l'on récupère.
Lorsque l'on travaille à plusieurs, on est sûr que les données ne sont pas modifiées par un autre développeur et on est certain des données que l'on récupère.
Programme : les données d'un cercle sont une couleur et un rayon. Le code fournit un diamètre, une aire et une circonférence.
Solution 1
Solution 2
Expliquez les avantages que représente l’encapsulation lorsque vous avez à conduire plusieurs types ou marques de véhicules.
Image de brgfx sur Freepik
class Animal { public $name; public function __construct($name) { $this->name = $name; } public function eat() { echo $this->name . " is eating."; } } class Dog extends Animal { public function bark() { echo $this->name . " is barking."; } } $dog = new Dog("Fido"); $dog->eat(); // Output: Fido is eating. $dog->bark(); // Output: Fido is barking. ``
class Animal { public $name; public function __construct($name) { $this->name = $name; } public function eat() { echo $this->name . " is eating."; } } class Dog extends Animal { public function bark() { echo $this->name . " is barking."; } } $dog = new Dog("Fido"); $dog->eat(); // Output: Fido is eating. $dog->bark(); // Output: Fido is barking. ``
Les concepts sont les mêmes quelque soit leur langage, mais leur mise en place peut dépendre du langage. Même si la logique est souvent assez similaire.
Nous verrons donc dans cette partie comment cela se concrétise en PHP, et nous ferons le lien avec Symfony.
<?php class UneClasse { // les propriétés public $propriete1; public $propriete2; // les méthodes public function methode1() { //une méthode est une fonction en PHP } public function methode2($arg1, $arg2) { //une autre méthode possédant deux arguments obligatoires } } ?>
<?php class UneClasse { // les propriétés public $propriete1; public $propriete2; // les méthodes public function methode1() { //une méthode est une fonction en PHP } public function methode2($arg1, $arg2) { //une autre méthode possédant deux arguments obligatoires } } ?>
<?php class UneClasse { // les propriétés public $propriete1; public $propriete2; // les méthodes public function methode1() { //une méthode est une fonction en PHP } public function methode2($arg1, $arg2) { //une autre méthode possédant deux arguments obligatoires } } ?>
<?php class UneClasse { // les propriétés public $propriete1; public $propriete2; // les méthodes public function methode1() { //une méthode est une fonction en PHP } public function methode2($arg1, $arg2) { //une autre méthode possédant deux arguments obligatoires } } ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
<?php class Voiture { public string $marque; function freiner(float $forceDeFreinage): void { //code de la fonction } } $mavoiture = new Voiture(); $mavoiture->marque = 'Renault'; echo 'Marque de ma voiture : '; echo $mavoiture->marque; ?>
Quelques mots sur le typage en PHP. Depuis les vers 7.2 et suivante le typage en PHP a été grandement amélioré, et même s'il n'est pas obligatoire est devenu la norme depuis PHP 7.4 et 8 (et suivantes).
Symfony tout comme PHP n'impose pas le typage, ceci étant, si vous utilisez des outils de qualité de code, des tests, si vous intervenez sur des projets, ... il y a fort à parier que le code est typé ou qu'il doivent obligatoirement l'être. C'est donc une très bonne habitude à prendre.
Cela permet aussi d'aider vous outils à vous indiquer si vous faites des erreurs dans votre code avant même son execution.
Le typage consiste à indiquer le type de données attendu pour une variable, une propriété, un argument d'une fonction, ...
<?php
class Voiture {
public string $marque;
function freiner(float $forceDeFreinage): void
{
//code de la fonction
}
}
Les types possibles sont les types définis par le langage :
Il est possible de définir des types plus spécifiques :
Il est également possible de définir un type en retour pour les fonctions/méthodes
On peut utiliser les mêmes types que pour les variables, mais aussi :
__construct()
est une méthode magique (c'est à dire qui est automatiquement déclenché lorsque les conditions sont remplies, ici la création d'une instance d'une classe)<?php class Voiture { public string $marque; public int $puissance; public float $kilometrage; public function __construct( string $arg1, int $arg2, float $arg3 ) { $this->marque = $arg1; $this->puissance = $arg2; $this->kilometrage = $arg3; } public function lireCaracteristiques() { return 'Marque : '.$this->marque.', puissance : '.$this->puissance.', kilométrage : '.$this->kilometrage; } public function utiliser(float $distance) { $this->kilometrage += $distance; // équivalent à : $this->kilometrage = $this->kilometrage + $distance; } } ?>
<?php class Voiture { public string $marque; public int $puissance; public float $kilometrage; public function __construct( string $arg1, int $arg2, float $arg3 ) { $this->marque = $arg1; $this->puissance = $arg2; $this->kilometrage = $arg3; } public function lireCaracteristiques() { return 'Marque : '.$this->marque.', puissance : '.$this->puissance.', kilométrage : '.$this->kilometrage; } public function utiliser(float $distance) { $this->kilometrage += $distance; // équivalent à : $this->kilometrage = $this->kilometrage + $distance; } } ?>
<?php class Voiture { public string $marque; ... public function freiner (int $forceDeFreinage) { //instruction de la méthode } } // Instanciation $maVoiture = new Voiture(); $maVoiture->marque = 'Renault'; echo 'Marque de ma voiture : ' . $maVoiture->Marque; ?>
<?php class Voiture { public string $marque; ... public function freiner (int $forceDeFreinage) { //instruction de la méthode } } // Instanciation $maVoiture = new Voiture(); $maVoiture->marque = 'Renault'; echo 'Marque de ma voiture : ' . $maVoiture->Marque; ?>
require('classe.php');
dans le fichier qui contient le code qui instancie.