9 juin 2024
La Programmation Orientée Objet
1# Définition
La programmation orientée objet est une méthode de programmation informatique de plus en plus plébiscitée, que ce soit dans le développement logiciel ou la data science. Organisée autour des objets, ou données, la programmation orientée objet offre de nombreux avantages.
La programmation orientée objet ou POO est une nouvelle façon de développer, en effet, cela permet d’organiser son code de manière non-procédurale. La POO permet une interaction plus facile avec nos différents objets. Cette façon de développer est incluse dans la plupart des langages de programmation.
2# La POO
<?php
class
MonObjet
{
}
?>
Pour définir un objet en POO, il faut instancier un objet, pour cela, on utilise les « class
». Regardons ça avec un exemple plus concret :
<?php
class
Utilisateur
{
}
?>
<!DOCTYPE
html
>
<html
lang
=
"en"
>
<head>
<meta
charset
=
"UTF-8"
>
<meta
name
=
"viewport"
content
=
"width=device-width, initial-scale=1.0"
>
<title>
Document
</title>
</head>
<body>
<?php
$user
=
new
Utilisateur
();
?>
</body>
</html>
On a notre objet appelé « Utilisateur
», pour créer une nouvelle instance de celle-ci, il faut utiliser le mot-clef « new
». Cela permet de créer un nouvel objet Utilisateur, si besoin, nous pourrions avec notre objet créer un utilisateur dans notre base de données.
Dans une classe, on peut ajouter des valeurs par défaut en instanciant un « constructeur » ainsi que des variables ouvertes.
<?php
class
Utilisateur
{
private
$nom
;
private
$prenom
;
private
$service
;
public
function
__construct
(
$nom
,
$prenom
,
$service
)
{
$this
->
nom
=
$nom
;
$this
->
prenom
=
$prenom
;
$this
->
service
=
$service
;
}
}
Détaillons rapidement le code :
class
Utilisateur
= L’objet.
private
$nom
;
= Variable utilisable uniquement dans notre classe.
public
function
__construct
()
= Constructeur de notre objet pour lui définir des valeurs par défaut.
$this
->
nom
=
$nom
;
= Notre objet prendra la valeur de la variable compris dans le constructeur.
Le $this
permet d’utiliser la class directement pour définir ou utiliser des fonctions et/ou variables disponibles dans la class.
Le constructeur permet simplement de définir des valeurs à notre objet, ce n’est pas obligatoire. Regardons un autre exemple :
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
}
?>
public
$nom
;
= Variable publique, elle peut être utilisée directement depuis l’objet.
Essayons ça :
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
}
?>
<!DOCTYPE
html
>
<html
lang
=
"en"
>
<head>
<meta
charset
=
"UTF-8"
>
<meta
name
=
"viewport"
content
=
"width=device-width, initial-scale=1.0"
>
<title>
Document
</title>
</head>
<body>
<?php
$user
=
new
Utilisateur
();
$user
->
nom
=
"Arkunis"
;
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
var_dump
(
$user
);
?>
</body>
</html>
Le var_dump sert à débugger nos différentes variables. Regardons le résultat de notre exemple :
<body>
object(Utilisateur)#1 (3) {
["nom"]=> string(7) “Arkunis”
["prenom"]=> string(12) "Cours Du Dev"
["service"]=> string(14) "Développement"
}
</body>
Pour récupérer une valeur en particulier, il faudra utiliser le symbole « -> » (variable d’instance).
var_dump
(
$user
->
nom
);
On aura en retour string(7) "Arkunis"
.
Pour récupérer ou modifier une valeur de notre objet, il est coutume d’utiliser les setter et getter.
<?php
class
Utilisateur
{
private
$nom
;
public
$prenom
;
public
$service
;
public
function
getNom
(){
return
$this
->
nom
;
}
public
function
setNom
(
$nom
){
$this
->
nom
=
$nom
;
}
}
?>
Détaillons ce morceau de code :
private
$nom
;
= Variable uniquement disponible depuis ma class.
public
function
getNom
(){
}
= On appellera cette fonction pour afficher ce que notre variable $nom aura.
return
$this
->
nom
;
= Return permet d’afficher notre variable à l’appel de la fonction.
public
function
setNom
(
$nom
){}
= On utilisera cette fonction pour définir une valeur à notre variable $nom en utilisant le paramètre $nom.
$this
->
nom
=
$nom
;
= La classe Utilisateur qui a comme variable privée $nom prendra la valeur de notre paramètre $nom.
<body>
<?php
$user
=
new
Utilisateur
();
$user
->
setNom
(
"Arkunis"
);
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
echo
$user
->
getNom
();
?>
</body>
Et on aura donc en retour Arkunis
.
Revenons rapidement sur les types possibles de visibilité des propriétés. On va pouvoir définir trois niveaux de visibilité ou d’accessibilité différents pour nos propriétés, méthodes (fonctions) et constantes (depuis PHP 7.1.0) grâce aux mots-clefs public, private et protected.
Les propriétés, méthodes ou constantes définies avec le mot-clef public vont être accessibles partout, c’est-à-dire depuis l’intérieur ou l’extérieur de la classe.
Les propriétés, méthodes ou constantes définies avec le mot-clef private ne vont être accessibles que depuis l’intérieur de la classe qui les a définies.
Les propriétés, méthodes ou constantes définies avec le mot-clef protected ne vont être accessibles que depuis l’intérieur de la classe qui les a définies ainsi que depuis les classes qui en héritent ou la classe parente.
3# Les classes étendues
Il est possible de créer une nouvelle classe tout en a liant avec une autre pour hériter de ses fonctions ou variables qui ne sont pas privées (private).
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
}
class
Professeur
extends
Utilisateur
{
}
?>
Ajoutons un exemple plus parlant :
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
}
class
Professeur
extends
Utilisateur
{
public
function
hello
()
{
return
"Bonjour "
.
$this
->
nom
;
}
}
?>
<!DOCTYPE
html
>
<html
lang
=
"en"
>
<head>
<meta
charset
=
"UTF-8"
>
<meta
name
=
"viewport"
content
=
"width=device-width, initial-scale=1.0"
>
<title>
Document
</title>
</head>
<body>
<?php
$user
=
new
Utilisateur
();
$user
->
nom
=
"Arkunis"
;
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
$prof
=
new
Professeur
();
$prof
->
nom
=
"Professeur"
;
echo
$prof
->
hello
();
?>
</body>
</html>
Résultat : Bonjour Professeur
On instancie Professeur pour créer un nouvel objet, et on peut utiliser les variables publiques pour interagir depuis notre nouvelle classe. Nous pourrions même utiliser les fonctions :
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
public
function
getNom
(){
return
$this
->
nom
;
}
}
class
Professeur
extends
Utilisateur
{
public
function
hello
()
{
return
"Bonjour "
.
$this
->
nom
;
}
}
?>
<!DOCTYPE
html
>
<html
lang
=
"en"
>
<head>
<meta
charset
=
"UTF-8"
>
<meta
name
=
"viewport"
content
=
"width=device-width, initial-scale=1.0"
>
<title>
Document
</title>
</head>
<body>
<?php
$user
=
new
Utilisateur
();
$user
->
nom
=
"Arkunis"
;
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
$prof
=
new
Professeur
();
$prof
->
nom
=
"Professeur"
;
echo
$prof
->
getNom
();
?>
</body>
</html>
Résultat : Professeur
On constate que l’extension de classe peut avoir un impact très fort sur la conception d’un projet. Mais il y a quelques problèmes liés à ça.
Le premier problème qui peut survenir est que certains développeurs peuvent par mégarde ou tout simplement par manque d’application surcharger (c’est-à-dire réécrire ou encore substituer) certaines méthodes ou propriétés de classes lorsqu’ils créent leurs modules et le faire d’une façon qui va amener des bugs et des problèmes de sécurité sur les boutiques en cas d’installation du module en question.
Finalement, notez que si vous créez une architecture en POO PHP et que vous laissez la possibilité à des développeurs externes de modifier ou d’étendre cette architecture, vous devrez toujours faire bien attention à proposer une rétrocompatibilité de votre code à chaque mise à jour importante.
4# Constante, un objet très peu utilisé et pourtant très puissant
La constante comme son nom lui indique est là pour avoir une valeur constante, c’est-à-dire immuable. Prenons un exemple d’utilisation avec une constante :
<?php
class
Utilisateur
{
public
$nom
;
public
$prenom
;
public
$service
;
public
function
getNom
(){
return
$this
->
nom
;
}
}
class
Professeur
extends
Utilisateur
{
public
CONST
TAXE =
20
;
public
function
achatFourniture
(
$parametre
)
{
return
$parametre
+
self
::TAXE;
}
}
?>
Pour déclarer une constante, il ne faut pas lui mettre le symbole "$" devant comme une variable. De plus pour appeler une constante, il faut utiliser : self ou parent (si elle est comprise dans une classe étendue).
<body>
<?php
$user
=
new
Utilisateur
();
$user
->
nom
=
"Arkunis"
;
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
$prof
=
new
Professeur
();
$prof
->
nom
=
"Professeur"
;
echo
$prof
->
achatFourniture
(
30
);
?>
</body>
Dans notre exemple, le professeur donne la liste des fournitures scolaires, et on en a pour un total de 30€ ($prof
->
achatFourniture
(
30
);
), puis à cela, on ajoute une taxe que prend l’école pour avoir fournis le matériel qui est de 20€ (public
CONST
TAXE =
20
;
). Si on additionne le tout (return
$parametre
+
self
::TAXE;
) on a bien notre résultat de 50€ au total.
Si nous avions mis la taxe dans Utilisateur, on aurait dû changer le self par parent.
NB : L'opérateur de résolution de portée (aussi appelé Paamayim Nekudotayim) ou, en termes plus simples, le symbole "double deux-points" (::), fournit un moyen d'accéder a une constante, une propriété statique, ou une méthode statique d'une classe ou de l'une de ses classes parentes.
5# Les classes abstraites
Une classe abstraite est une classe qui ne va pas pouvoir être instanciée directement, c’est-à-dire qu’on ne va pas pouvoir manipuler directement.
Une méthode abstraite est une méthode dont seule la signature (c’est-à-dire le nom et les paramètres) va pouvoir être déclarée, mais pour laquelle on ne va pas pouvoir déclarer d’implémentation (c’est-à-dire le code dans la fonction ou ce que fait la fonction).
<?php
class
Utilisateur
extends
prix
{
public
$nom
;
public
$prenom
;
public
$service
;
public
function
getNom
(){
return
$this
->
nom
;
}
public
function
setPrix
(
$param
){
return
$param
+
parent
::TAXE;
}
}
class
Professeur
extends
Utilisateur
{
}
abstract
class
prix
{
public
CONST
TAXE =
20
;
abstract
public
function
setPrix
(
$param
);
}
?>
Ici, on déclare une fonction sans rien dedans, tout le contenu de cette fonction sera mis dans notre classe Utilisateur puis utilisé par Professeur :
<?php
$user
=
new
Utilisateur
();
$user
->
nom
=
"Arkunis"
;
$user
->
prenom
=
"Cours Du Dev"
;
$user
->
service
=
"Développement"
;
$prof
=
new
Professeur
();
$prof
->
nom
=
"Professeur"
;
echo
$prof
->
setPrix
(
30
);
?>
6# Méthode magique
Sans vous en rendre compte, vous avez utilisé une fonction dites magique, en effet, vous avez utilisé le constructeur (__construct).
Voici la liste des méthodes magique :
__construct
();
__destruct
();
__call
();
__callStatic
();
__get
();
__set
();
__isset
();
__unset
();
__toString
();
__clone
();
__sleep
();
__wakeup
();
__invoke
();
__set_state
();
__debugInfo
();
Pour en apprendre plus sur les méthodes magique, je vous invite à vous rendre sur la documentation officielle : https://www.php.net/
J’espère que vous avez appris des choses.
Mots clés:
php symfony poo
Cours Du Dev
Recevez les dernières formations disponibles en vous inscrivant à la newsletter
Créé par arkunis