PHP et l'OO ============ .. topic:: `Wikipédia `_ La programmation orientée objet (POO), ou programmation par objet, est un paradigme de programmation informatique élaboré par les Norvégiens Ole-Johan Dahl et Kristen Nygaard au début des années 1960 et poursuivi par les travaux d'Alan Kay dans les années 1970. Il consiste en la définition et l'interaction de briques logicielles appelées objets ; un objet représente un concept, une idée ou toute entité du monde physique, comme une voiture, une personne ou encore une page d'un livre. Il possède une structure interne et un comportement, et il sait interagir avec ses pairs. Il s'agit donc de représenter ces objets et leurs relations ; l'interaction entre les objets via leurs relations permet de concevoir et réaliser les fonctionnalités attendues, de mieux résoudre le ou les problèmes. Dès lors, l'étape de modélisation revêt une importance majeure et nécessaire pour la POO. C'est elle qui permet de transcrire les éléments du réel sous forme virtuelle * Nouveau modèle objet en PHP 5 (versus PHP 4 (qui est complétement mort))‏ * Concepts de : classes (abstraites et concrètes), attributs, méthodes, objets... * Principes de : héritage, encapsulation et même ... un peu de polymorphisme !!! La création d'une classe ------------------------ * Mot-clef: class * Syntaxe : class { } * Peut être défini n'importe où * Est un « type », construit par le programmeur .. code-block:: php class Voiture { // contenu } Les attributs : --------------- - Déclarés comme public, private ou protected, mais ne sont pas typés ! - Avec une valeur affectée (valeur par défaut)‏ - Constitueront les « données » de l'objet instantié .. code-block:: php class Voiture { public $marque = Null; public $puissance = "2CV"; } Les méthodes : -------------- - Se déclarent comme des fonctions - Une seule méthode du même nom par classe (pas de surcharge !!!)‏ - Peuvent prendre des paramètres, qui peuvent être typés . On ne peut que typer des paramètres de fonction par des objets (et pas des types de base). - Peuvent retourner une valeur. .. code-block:: php class Voiture { function donneConso() { return 30; } } class Voiture { function donneConso($nbreKm){ return 30 * $nbreKm; } } Les constantes : ---------------- - Définir des constantes locales à une classe. - Se déclare avec const et sans le symbole $ - Par convention, en majuscule .. code-block:: php class Voiture { const PROPULSION = 1; const TRACTION = 2; } L'instantiation d'un objet -------------------------- * Mot-clef: new - Syntaxe : $ = new [()]; - Un objet est une instance de classe (une variable dont le type est la classe)‏ - La classe doit être déclarée, avant d'être instantiée .. code-block:: php $bagnole = new Voiture(); **Exemple complet :** .. code-block:: php class Voiture { public $marque; public $puissance = "2CV"; } $bagnole = new Voiture(); echo $bagnole->puissance; echo $bagnole->attributVide; Accéder aux méthodes : ----------------------- * Uniquement sur un OBJET créé - Opérateur: -> - Référence à l'objet courant : $this - Valeur de retour directement utilisable . * On peut même avoir: .. code-block:: php $objet->methode()->methode(); // en PHP 7 on peut même aller plus loin ‏$bagnole = (new Voiture())->donneConso(15); .. code-block:: php nbreLitre * $nbreKm; } function donneConsoAnnuelle($nbreKm,$nbreJours=20) { return $this->donneConso($nbreKm) * $nbreJours; } } $uneVoiture = new Voiture; echo $uneVoiture->donneConsoAnnuelle(10); Le constructeur : ----------------- * Méthode d'initialisation de l'objet * Appelée automatiquement avec le « new » * Peut prendre des paramètres * (constructeur parent pas appelé implicitement)‏ => __construct() ‏ Le destructeur : ---------------- * Méthode de destruction de l'objet * Appelée automatiquement avec les fonctions unset() ou delete()‏ * (desctructeur parent pas appelé implicitement)‏ * Nommée __destruct()‏ .. code-block:: php jour = $jour; $this->mois = $mois; $this->annee = $annee; echo 'objet créé'; } function __destruct() { echo 'objet detruit'; } } $monAnniversaire = new Date(18,4,1911); echo $monAnniversaire->jour . "/" . $monAnniversaire->mois . "/" . $monAnniversaire->annee; unset($monAnniversaire); Objets passés par référence : ------------------------------ * On manipule des références et non pas le contenu des objets .. code-block:: php jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = $monAnniversaire; $tonAnniversaire->annee = 1982; echo $tonAnniversaire->annee; // affiche 1982 echo "
"; echo $monAnniversaire->annee; // affiche aussi 1982 * 2 conséquences : - Comparer deux objets: comparer le contenu et pas seulement la référence !!! - Copier un objet (2 objets différents, mais au contenu identique) nécessite un traitement particulier (clone()) Comparer deux objets : ----------------------- * Tester l'égalité de tous les attributs : opérateur == * Tester l'égalité des références (identité des objets): opérateur === .. code-block:: php jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $unAnniversaire = new Date(); $unAnniversaire->jour = 18; $unAnniversaire->mois = 4; $unAnniversaire->annee = 1911; $tonAnniversaire = $monAnniversaire; if ($monAnniversaire == $tonAnniversaire) echo "monAnniversaire == tonAnniversaire"; if ($monAnniversaire === $tonAnniversaire) echo "monAnniversaire === tonAnniversaire"; if ($monAnniversaire == $unAnniversaire) echo "monAnniversaire == unAnniversaire"; if ($monAnniversaire === $unAnniversaire) echo "monAnniversaire === unAnniversaire"; Copier un objet : ------------------ * Fonction : clone * Où est l'objet à copier. * Copiage bit à bit de toutes les valeurs de l'objets source vers l'objet destination * Possible de redéfinir son comportement en définissant une méthode __clone() dans la classe, pour modifier l'objet cloné par clone() (en utilisant $this)‏ **clone un objet** .. code-block:: php jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = clone $monAnniversaire; echo $tonAnniversaire->jour . "/" . $tonAnniversaire->mois . "/" . $tonAnniversaire->annee; **méthode clone** .. code-block:: php jour +=1; $this->mois +=1; $this->annee +=1; } } $monAnniversaire = new Date(); $monAnniversaire->jour = 18; $monAnniversaire->mois = 4; $monAnniversaire->annee = 1911; $tonAnniversaire = clone $monAnniversaire; echo $tonAnniversaire->jour . "/" . $tonAnniversaire->mois . "/" . $tonAnniversaire->annee;