3. Développement objet
Définition de briques logicielles représentant un concept, une idée
ou une entité ainsi que leurs interactions : les objets
Un objet est une structure de données comprenant également les
fonctionnalités de traitement des données
L’objet est vu au travers de ses spécifications
Les concepts associés sont :
Encapsulation
Héritage
Polymorphisme
3
13:36:50 Programmation Web 2022-2023
4. Classe
Une classe définit un modèle, un moule, à partir duquel tous les
objets de la classe seront créés
La classe décrit les données internes ainsi que les fonctionnalités
des objets
La classe est une vision « inerte », une recette de cuisine, visant
à décrire la structure et le comportement des objets qui seront
créés
La construction d’un objet à partir de la classe génératrice
s’appelle instanciation
Les objets, entités « vivantes » en mémoire, sont des instances
de la classe
4
13:36:50 Programmation Web 2022-2023
5. Instanciation
La classe est une description « inerte »
Les objets doivent être instanciés à partir de la classe génératrice
pour exister et devenir fonctionnels
Exemple : la classe Animal
$bambi = new Animal();
$scrat = new Animal();
$melman = new Animal();
5
13:36:50 Programmation Web 2022-2023
6. Encapsulation
Procédé consistant à rassembler les données et les traitements
au sein des objets
L’implémentation interne des objets est cachée
Les objets sont vus à travers leurs spécifications
Les données internes et les fonctionnalités possèdent un niveau
de visibilité et peuvent éventuellement être masquées :
Public
Privé
Protégé
6
13:36:50 Programmation Web 2022-2023
7. Encapsulation
Les données internes des objets sont appelées attributs (ou
propriétés voire champs)
Les fonctionnalités des objets sont appelées méthodes
Méthodes habituelles :
Constructeur / destructeur
Accesseurs / modificateurs (getters / setters)
Référence à l’objet courant dans la description de la classe :
$this
7
13:36:50 Programmation Web 2022-2023
8. Visibilité
Publique :
Les données internes et les méthodes sont accessibles par tous
Protégé :
Les données internes et les méthodes sont accessibles aux
objets dérivés
Privé :
Les données internes et les méthodes ne sont accessibles qu’aux
objets de la classe
8
13:36:50 Programmation Web 2022-2023
9. Héritage ou dérivation ou extension
Création de nouvelles classes à partir du modèle d’une classe
existante
La nouvelle classe possède tous les attributs et méthodes de la
classe mère
La nouvelle classe peut proposer de nouveaux attributs et de
nouvelles méthodes ou spécialiser des méthodes de la classe
mère
9
13:36:50 Programmation Web 2022-2023
Impala Caribou
Herbivore
Guépard Léopard
Carnivore
Mammifère
10. Polymorphisme
Choix dynamique de la méthode qui correspond au type réel de
l’objet
Méthode eats()
function food(Mammifere $m) {
return $m->eats();
}
$i = new Impala(); food($i);
$c = new Carnivore(); food($c);
10
13:36:50 Programmation Web 2022-2023
Impala
herbe
Caribou
mousse
Herbivore
plantes
Guépard
impala
Léopard
impala
Carnivore
viande
Mammifère
nourriture
herbe
viande
11. CLASSE, ATTRIBUTS ET MÉTHODES
D’INSTANCE
11
13:36:50 Programmation Web 2022-2023
12. Définition d'une classe
class MyClass
{
private string $myData;
public function __construct(string $param) {
$this->myData = $param;
}
public function __destruct() {
echo 'Destruction...’;
}
public function show(): void {
echo 'my data : ' . $this->myData;
}
}
12
13:36:50 Programmation Web 2022-2023
Attribut privé
Déclaration de classe
Constructeur public
Référence à l’instance
courante
Méthode publique
Accès à un attribut
Destructeur public
13. Utilisation d'une classe
<?php
require 'myClass.php';
// Nouvel objet
$object = new MyClass(12);
// Utilisation d'une méthode
$object->show();
$object->myData = 'coucou';
unset($o);
13
13:36:50 Programmation Web 2022-2023
Inclusion de la définition
de la classe
Création d'un objet
Méthode affiche de
l'objet $object
L'attribut est privé
Fatal error: Cannot access private
property MyClass::$myData in dummy.php on
line 25
class MyClass {
private $myData;
...
Destruction de l'objet
$object
Destruction...
function __destruct() {
echo 'Destruction...'; }
14. Valeur par défaut des attributs
class MyClass
{
private string $myData = 'Défaut';
public function set(string $value): void
{ $this->myData = $value; }
public function show(): void
{ echo 'my data : '.$this->myData; }
}
$o = new MyClass();
$o->show();
$o->set('Nouvelle');
$o->show();
14
13:36:50 Programmation Web 2022-2023
Attribut avec valeur par
défaut
Nouvel objet
Affichage
Affectation
Affichage
my data : Défaut
my data : Nouvelle
16. Attributs et méthodes de classe
Mot clé static
Attributs et méthodes utilisables sans instance de la classe
(=attributs et méthode de classe)
Attributs NE peuvent PAS être accédés depuis une instance
($objet->attribut)
Attributs partagés par toutes les instances de la classe
Méthodes peuvent être accédés depuis une instance
($objet->methode() mais c’est mal !)
Dans les méthodes, $this n'est pas disponible
16
13:36:50 Programmation Web 2022-2023
17. Attributs de classe (static)
class MyClass {
private static int $n = 0;
public function __construct() {
echo ++MyClass::$n
.' instance(s)'; }
public function __destruct() {
echo 'destruction'; self::$n--; }
}
$s = new MyClass();
$t = new MyClass();
unset($t);
$u = new MyClass();
$v = new MyClass();
echo MyClass::$n;
17
13:36:50 Programmation Web 2022-2023
Attribut privé statique :
ne peut être accédé que
par des méthodes de la
classe
Accès à l'attribut
statique
1 instance(s)
2 instance(s)
destruction
2 instance(s)
3 instance(s)
Fatal error: Cannot access private property
MyClass::$n in dummy.php on line 37
18. Méthodes de classe (static)
class MyClass {
private static int $n = 0;
public function __construct() {
echo ++MyClass::$n." instance(s)n"; }
public function __destruct() {
MyClass::$n--; }
public static function f(int $i): void {
echo 'Dans f() : '.($i*$i); }
}
$s = new MyClass();
$s->f(2);
MyClass::f(3);
18
13:36:50 Programmation Web 2022-2023
Méthode publique de
classe
Appel à partir d'une instance
Toléré
Appel sans instance
1 instance(s)
Dans f() : 4
Dans f() : 9
20. Constantes de classe
class MyClass {
public const MY_CONSTANT = 'Valeur';
public function show(): void
{
echo self::MY_CONSTANT;
}
}
$c = new MyClass();
$c->show();
echo MyClass::MY_CONSTANT;
20
13:36:50 Programmation Web 2022-2023
Constante publique de
classe
(visibilité depuis
PHP7.1)
Accès à la constante de
classe depuis la classe
Accès à la constante de
classe à l'extérieur de la
classe
Valeur
Valeur
22. Héritage
22
13:36:50 Programmation Web 2022-2023
class Simple {
function show(): void {
echo 'Je suis Simple'; }
}
class Extended extends Simple {
function show(): void {
parent::show();
echo ' mais aussi Extended';
}
}
$s = new Simple();
$e = new Extended();
$s->show();
$e->show();
Classe simple
Une méthode publique
Classe étendue héritant
de la classe simple
Surcharge de la méthode
Appel de la méthode du
parent
Je suis Simple mais aussi Extended
Je suis Simple
24. Assignation (affectation) d'objets
class Point {
private int $x;
private int $y;
public function __construct(int $x=0, int $y=0) {
$this->x = $x;
$this->y = $y; }
public function set(int $x, int $y): void {
$this->x = $x;
$this->y = $y; }
public function __toString(): string {
return "({$this->x}, {$this->y})"; }
}
24
13:36:50 Programmation Web 2022-2023
29. Arguments / paramètres nommés
class Point {
private int $x;
private int $y;
public function __construct(int $x=0, int $y=0) {
$this->x = $x;
$this->y = $y; }
Passer un argument selon son nom et pas sa position
$point = new Point(0);
$point = new Point(y: 0);
29
13:36:50 Programmation Web 2022-2023
30. OBJETS DANS LES CHAÎNES DE CARACTÈRES
30
13:36:50 Programmation Web 2022-2023
31. Objets dans les chaînes de caractères
Problèmes :
ambiguïté
non évaluable
Chaîne contenant :
un attribut d'un objet dans une chaîne
"a : $myObject->attribute"
le résultat d'une méthode d'un objet dans une chaîne
"résultat : $myObject->compute()"
une entrée de tableau associatif
"valeur : $myArray['key']"
une variable suivie de texte (sans espace)
"$amount contient $amuonteuros"
31
13:36:50 Programmation Web 2022-2023
32. Objets dans les chaînes de caractères
Solution :
effectuer des concaténations (pénible)
délimiter par { }
Chaîne contenant :
un attribut d'un objet dans une chaîne
"a : {$myObject->attribute}"
le résultat d'une méthode d'un objet dans une chaîne
"résultat : {$myObject->compute()}"
une entrée de tableau associatif
"valeur : {$myArray['key']}"
une variable suivie de texte (sans espace)
"$amount contient {$amount}euros"
32
13:36:50 Programmation Web 2022-2023
34. Gestion des erreurs : exceptions
Gestion des exception identiques à C++/Java
Exception peut être :
Jetée : throw
Essayée : try
Capturée : catch
Exception jetée : code après throw non exécuté
Capture : 1 ou plusieurs blocs (selon type)
Exception non capturée : erreur fatale
34
13:36:50 Programmation Web 2022-2023
35. Utilisation des exceptions
try {
$error = 'Toujours lancer cette erreur';
throw new Exception($error);
/* Le code après une exception n'est
jamais exécuté. */
echo 'Jamais exécuté'; }
catch (Exception $exception) {
echo "Capture Exception: "
.$exception->getMessage()." n"; }
// Poursuite de l'exécution
echo 'Bonjour le monde';
35
13:36:50 Programmation Web 2022-2023
Déroutement
Essayer
Lancer
Capturer
Capture Exception: Toujours lancer cette erreur
Bonjour le monde
36. Classe Exception PHP 8
<?php
class Exception {
protected string $message = ''; // message de l'exception
protected int $code = 0; // code de l'exception
protected string $file; // fichier source de l'exception
protected int $line; // ligne de la source de l'exception
public function __construct(string $message="", int $code=0);
final public function getMessage(): string // message de l'exception
final public function getCode(): mixed // code de l'exception
final public function getFile(): string // nom du fichier source
final public function getLine(): int // ligne du fichier source
final public function getTrace(): array // un tableau de backtrace()
final public function getTraceAsString(): string // chaîne de trace
public function __toString(): string // chaîne pour l'affichage
} 36
13:36:50 Programmation Web 2022-2023
37. Catch multiple
class Test {
public function testing() {
// ...
throw new InvalidArgumentException();
// ...
throw new RuntimeException();
// ...
}
}
try {
$foo = new Test; $foo->testing();
} catch (InvalidArgumentException | RuntimeException $exception) {
var_dump(get_class($exception));
}
37
13:36:50 Programmation Web 2022-2023