Skip to content

La syntaxe Objet

Ce document présente la syntaxe objet avec des exemples PHP, Java & Kotlin

Sommaire

Introduction

La POO c'est 4 concepts

  • Concept de modélisation à travers la notion de classe et d’instanciation de ces classes.
  • Concept d’action à travers la notion d’envoi de messages et de méthodes à l’intérieur des objets.
  • Concept de construction en créant un objet en reposant sur la définition d’une classe.
  • Concept d'encapsulation l'accès aux propriétés se fait via un getter et un setter. (inaccessible de l'exterieur).

Mais surtout

Ça permet de représenter informatiquement quelque chose du monde réel.

Deux notions

  • Les classes
  • Les objets

Définition

La programmation orientée objet (POO) est un paradigme de programmation qui utilise des objets pour représenter des entités du monde réel. Les objets sont des instances de classes, qui peuvent contenir des données et des méthodes. Les classes sont des modèles pour créer des objets.

Avantages

  • Réutilisation : on peut réutiliser des classes déjà existantes.
  • Abstraction : on peut cacher les détails d'implémentation.
  • Encapsulation : on peut cacher les données et les méthodes.
  • Héritage : on peut créer des classes à partir d'autres classes.

La modélisation

Avant de parler des classes ou des objets, je vous propose de regarder le principe de la modélisation

Voir la version UML / Classe

Les classes

  • Serviront de moule pour créer des objets.
  • Une classe étant une définition, elle nous servira plus tard à créer des objets.

Une classe est composée de :

  • D'attributs (variable d'instance ou propriété).
  • De méthodes (actions / opération au niveau de la classe).

Les attributs sont les valeurs qui feront fonctionner notre objet (exemple nom, prenom, age etc.).

Les méthodes vont permettre d'effectuer des actions dans notre objet (exemple presenter(), bouger(), etc.).

Nous avons donc deux types membres dans la classe

  • Des propriétés (le données de l'objet) avec une visibilité
  • Des méthodes (les actions possibles : accélérer, freiner, etc.) avec une visibilité

La visibilité ?

  • Privée : accessible que dans l'objet.
  • Public : accessible hors de l'objet.
  • Protected : Accessible aux enfants (héritage), mais pas hors de la classe.

Les méthodes

  • Comme une fonction, mais encapsulé dans la classe.
  • Possède une visibilité.
  • Possède des paramètres.
  • Surcharge: plusieurs méthodes peuvent avoir le même nom et des paramètres différents (type et/ou ordre).

Les types de méthodes

Dans une classe nous avons différents types de méthodes :

  • Le constructeur.
  • Les méthodes d'actions.
  • Les méthodes accesseurs / mutateurs.

Le constructeur est une méthode qui permet d'initialiser un objet. Il est appelé automatiquement lors de la création d'un objet (new). Son rôle est d'initialiser les attributs de l'objet avec des valeurs spécifiques, selon les paramètres fournis lors de la création de l'objet. Il est possible de définir plusieurs constructeurs dans une classe (surcharge). Il permet de garantir l'intégrité des objets et de s'assurer qu'ils sont initialisés de manière cohérente.

Les méthodes d'actions sont des méthodes qui permettent d'effectuer des actions sur l'objet. Exemple : accelerer(), freiner(), tourner(), etc.

Les méthodes accesseurs / mutateurs sont des méthodes qui permettent de lire ou d'écrire les propriétés de l'objet. Exemple : getVitesse(), setVitesse(), etc. Elles sont appelées getter et setter.

Exemple

Exemple modélisation

Ce qu'il faut retenir

  • Les classes sont instanciables (création d'objets, $unPersonne = new Personne(…)).
  • Les propriétés sont les « variables » de l'objet.
  • Les méthodes sont les « actions » de l'objet.
  • Les méthodes et les propriétés ont des visibilités.
  • Les méthodes peuvent être surchargées.

Les objets

Chaque objet représente un objet du monde réel. Exemple : une voiture, une personne, un élément de menu, etc.

exemple :

  • une personne précise
  • une voiture spécifique
  • Un élément de menu.

⚠️ Utilise les classes précédemment définies ⚠️

👀 Créer un objet == Instancier 👀


Définir une classe

Instanciation (créer un objet)

Le constructeur

Accès à une méthode

Accès à une propriété // Accesseur et Mutateur

Attention

L'accès aux propriétés ne fonctionnera que si la visibilité (private, public, protected) ne vous y autorise :

VisibilitéAccès depuis
privateSeulement depuis l'objet en lui-même
publicDepuis n'import où (objet, depuis l'objet, ou depuis l'héritage)
protectedComme, private mais non accessible depuis la classe fille en cas d'héritage

Les collections

Représentation UML

Le losange vide

Agrégation

Ce symbole signifie la notion de composition. Dans notre cas, une Entreprise n’est composée de personne.

Permets de regrouper des listes d'objets.

Représentation UML

En modélisation, la flèche signifie un lien entre les deux classes. En l'occurrence, dans le cas des collections, nous aurons :

  • Le nom « de la collection » qui va contenir les objets.
  • Le nombre minimum & maximum.
  • Exemple, 1 étudiant possède plusieurs devoirs.

Fonctionnellement, nous allons donc avoir dans l'étudiant une collection d'objets du type devoirs. Celle-ci sera nommée lesDevoirs. lesDevoirs sera une propriété de la classe Étudiant.

Déclaration

Utilisation

Parcours de collection

L'héritage

L'héritage permet de généraliser le fonctionnement d'un objet. L'idée est de mettre dans un « objet parent » la logique de plusieurs objets qui fonctionne de la même façon. Exemple

  • Un humain et une baleine partage des propriété et fonctionnement commun. Nous allons donc créer une super classe mammifère, celle-ci contiendra les méthodes et les propriétés communes.
  • Une Voiture et une Moto sont des véhicules. Nous pouvons donc créer une super classe « Véhicule ».

Comment identifier qu'il s'agit d'un héritage ? C'est simple, si vous pouvez dire « est un » alors il s'agit d'un héritage. Exemple :

  • Un humain est un mammifère.
  • Une Voiture est un Véhicule.
  • Mais nous ne pouvons pas dire qu'un Pompier est un Camion. Il n'y a pas d'héritage.

Le mot clé extends permet de définir une classe enfant. Exemple

Synthèse héritage

  • La classe mère contient la logique partagée.
  • La classe fille contient la logique spécifique.
  • Si nous pouvons dire « est un » alors il s'agit d'un héritage.
  • Un mot-clé Extends class Humain extends Mammifere.
  • Vous devez construire le parent dans le constructeur de l'enfant.
  • Permets de généraliser un objet afin de partager des propriétés communes..
  • mais il est également possible de spécialiser / redéfinir un objet.
    • Redéfinition, comme la surcharge, mais entre la classe fille et la classe mère.
  • Il est possible d'appeler une méthode de la classe mère depuis la classe fille.
    • parent::manger(); // super.manger();
    • Ou d'appeler la méthode la plus proche de la classe fille :
    • $this->manger();

Le polymorphisme

Le polymorphisme peut être vu comme la capacité de choisir dynamiquement la méthode qui correspond au type réel de l’objet. C’est un concept fondamental de la programmation orientée objet.

Le mot polymorphisme vient du grec poly (plusieurs) et morphisme (forme). Il signifie donc « plusieurs formes ». L'héritage est une forme de polymorphisme.

L'encapsulation

Mécanisme consistant à rassembler les données et les méthodes au sein d'une structure en cachant l'implémentation de l'objet, c'est-à-dire en empêchant l'accès aux données par un autre moyen que les services proposés.

L'encapsulation

Sécurité ?

Vous avez ici un élément important, la notion de visibilité et de gestion de l'accès aux propriétés est fondamentale. L'encapsulation fait partie d'une des raisons pourquoi la POO est à favoriser pour réaliser un développement sécurisé.

Les méthodes statiques

Les méthodes statiques sont des méthodes qui peuvent être appelées sans avoir besoin d'instancier un objet. Elles sont déclarées avec le mot-clé static. Les méthodes statiques sont souvent utilisées pour créer des fonctions utilitaires.

Abstraction et Interface

Les classes abstraites

Définition :

  • Une classe abstraite est une classe qui ne peut pas être instanciée.
  • Permets de définir des comportements (méthodes) dont l'implémentation (le code dans la méthode) se fait dans les classes filles.

Ainsi, on a l'assurance que les classes filles respecteront le contrat défini par la classe mère abstraite.

Nous aurons donc deux types de classes :

  • Des classes abstraites (sans code, non instanciable).
  • Des classes concrètes (avec du code, et instanciable).

Une classe abstraite doit posséder au moins une méthode abstraite (c'est-à-dire sans code). Si nécessaire, elle peut également avoir des méthodes concrètes (avec du code).

Les classes abstraites :

  • Ne peuvent pas être instanciées (pas de new).
  • Sont des modèles pour d'autres classes.
  • Permettent de factoriser du code.
  • Doivent être héritée depuis une classe fille.
  • Apporte une sécurité grâce à l'encapsulation.

Abstract UML

Les Interfaces

Une Interface ressemble beaucoup à une classe abstraite. Sauf que celle-ci ne possède pas de code. Une Interface définit un comportement qui devra être implémenté par la classe fille.

Les classes filles implémentent une interface, une classe fille peut implémenter plusieurs interfaces.

Quand une classe implémente une interface, elle doit définir l'ensemble des méthodes de l'interface.

C'est obligatoire. C'est une sorte de contrat entre la classe fille et l'interface.

À quoi sert une interface ? A définir un comportement.

Les interfaces :

  • Ne contiennent que des méthodes publiques.
  • Ne contiennent pas de code.
  • N'est pas instanciable.
  • Son « un contrat » que les classes filles devront implémenter.

UML Interface

Interfaces ou classes abstraites ?

Les interfaces et les classes abstraites remplissent un rôle différent :

  • Les classes abstraites servent à factoriser du code.
  • Les interfaces servent à définir un contrat de service.

Un instant !

L'avantage d'une Interface est qu'il est possible pour une classe d'implémenter plusieurs « contrat » (Interface). Alors que dans la plupart des langages, il n'est pas possible d'hériter de plusieurs classes abstraites.

Redéfinition (Remplacement de méthode)

La redéfinition est la possibilité d’utiliser exactement la même signature pour définir une méthode dans une classe mère et dans une classe fille. Contrairement à la surcharge, la signature (nom et paramètre doivent être identiques).

Concept de redéfinition

La méthode move() remplace donc la définition de celle de la classe mère, et donc son comportement.

Un instant !

  • Nous parlons de redéfinition uniquement dans le cadre de l'héritage.
  • Il ne faut pas confondre la redéfinition avec la surcharge de méthode au sein d'un objet.

Les méthodes spécialisées

Il est également possible de spécialiser une méthode, dans ce cas nous ne remplacerons pas complètement la méthode, nous viendrons la compléter en appelant la méthode mère avant notre traitement. Exemple :

Polymorphisme

Le polymorphisme peut être vu comme la capacité de choisir dynamiquement la méthode qui correspond au type réel de l’objet.

  • Si la classe B hérite de la classe A

    • Classe B "EST-UN" Classe A
    • Toutes les méthodes de la classe A peuvent donc être appelées sur la classe B.
  • Le polymorphisme nous permettra :

    • Manipuler un objet sans en connaître le type précis.
    • Manipulation de liste sans connaître le type des objets.

Pratique !

Grâce au polymorphisme, nous allons pouvoir créer des array (liste, tableau …) avec des objets de types différents. Exemple :

Les namespaces (organisation des classes)

Les namespaces permettent d'organiser les classes en groupes. Cela permet de mieux s'y retrouver dans un projet et de mieux gérer les dépendances. Les namespaces sont des espaces de noms. Ils permettent de regrouper des classes ayant un nom identique, mais qui ne sont pas les mêmes. Par exemple, si vous avez une classe Personne dans votre projet, vous pouvez avoir une classe Personne dans un namespace Mammifere et une classe Personne dans un namespace Primate. Les deux classes Personne ne seront pas les mêmes.

php
namespace Mammifere\Primate ;

class Personne { // etc...
}