Objets
PHP est un langage orienté objets, bien qu'il n'ait pas besoin d'être utilisé en tant que tel, puisque la plupart des fonctions PHP ne sont pas orientées objets.
Dans la programmation orientée objets, une class
e est une définition
d'un objet, alors qu'un object
est une instance d'un objet, ce qui
signifie qu'à partir d'une classe vous pouvez créer de nombreux objets.
Par exemple, définissions une classe pour un étudiant.
class Student {
// constructeur
public function __construct($first_name, $last_name) {
$this->first_name = $first_name;
$this->last_name = $last_name;
}
public function say_name() {
echo "Mon nom est " . $this->first_name . " " . $this->last_name . ".\n";
}
}
$alex = new Student("Alex", "Jones");
$alex->say_name();
Analysons le code. Remarquez que la classe Student
a une fonction
constructeur, qui est exécutée quand l'objet est créé. Le constructeur
reçoit des arguments qui sont fournis plus tard quand on construit
l'objet avec le mot-clé new
.
Après que nous ayons construit l'objet dans la variable $alex
nous
pouvons maintenant utiliser les méthodes de l'objet.
Nous avons implémenté une méthode d'objet say_name
, qui affiche le
nom de l'étudiant. Remarquez que la fonction
say_name
ne reçoit pas d'arguments, mais elle a accès aux nom et
prénom de l'étudiant, parce qu'ils ont été précédamment définis dans
le constructeur.
Voici quelques définitions importantes liées aux objets :
- Classes définissent comment les objets se comportent. Les classes ne contiennent pas de données.
- Objets sont des instances des classes, qui contiennent les données.
- Membres sont des variables qui appartiennent à un objet.
- Méthodes sont les fonctions qui appartiennent à un objet, et ont accès à ses membres.
- Constructeur est une méthode spéciale qui est exécutée quand un objet est créé.
Héritage
La fonctionnalité la plus importante de la programmation orientée objets est l'héritage. Cette fonctionnalité nous permet de réutiliser le code que nous avons écrit et de l'étendre. Par exemple, disons que nos souhaitons définir un étudiant en maths, qui sait également comment additionner deux nombres.
class Student {
// constructeur
public function __construct($first_name, $last_name) {
$this->first_name = $first_name;
$this->last_name = $last_name;
}
public function say_name() {
echo "Mon nom est " . $this->first_name . " " . $this->last_name . ".\n";
}
}
$alex = new Student("Alex", "Jones");
$alex->say_name();
class MathStudent extends Student {
function sum_numbers($first_number, $second_number) {
$sum = $first_number + $second_number;
echo $this->first_name . " dit que " . $first_number . " + " . $second_number . " est " . $sum;
}
}
$eric = new MathStudent("Éric", "Chang");
$eric->say_name();
$eric->sum_numbers(3, 5);
Remarques que l'objet d'Éric dispose aussi du même constructeur et de
la fonction say_name
, en plus de la nouvelle méthode appelée
sum_numbers
, qui permet à Éric de calculer la somme de deux
nombres. Remarques aussi que la nouvelle fonction a accès aux mêmes
membres que nous avons déjà définis dans la classe Student (first_name
, last_name
).
Fonctions publiques et privées
Nous pouvons utiliser les modifieurs public
et private
respectivement pour définir des fonctions auxquelles on peut accéder
depuis l'extérieur de l'objet ou non, pour des besoins
d'encapsulation. Ceci permet de mieux définir comment les objets
devraient être utilisés, pour distinguer entre les fonctions qui sont
utilisées pour des besoins internes, ou à l'inverse pour une interface externe.
class Student {
// le constructeur devrait être public
public function __construct($first_name, $last_name) {
$this->first_name = $first_name;
$this->last_name = $last_name;
}
// pour utilisation externe
public function say_name() {
echo "Mon nom est " . $this->full_name() . "\n";
}
// pour utilisation interne
private function full_name() {
return $this->first_name . " " . $this->last_name;
}
}
$alex = new Student("Alex", "Jones");
$alex->say_name();
// ceci ne marchera pas
// echo $alex->full_name();
Exercise
Créez une classe appelée Car (voiture) avec un constructeur qui reçoit la marque
et l'année de fabrication de la voiture, et une fonction appelée
print_details
qui affiche les détails de la voiture.
Par exemple, pour une voiture Toyota de 2006, la ligne suivante serait affichée :
Cette voiture est une Toyota de 2006.