Définition de la POO
Si l'on en croit wikipedia, un objet est un conteneur symbolique et autonome qui contient des informations et des mécanismes concernant un sujet, manipulés dans un programme. Le sujet est souvent quelque chose de tangible appartenant au monde réel. C'est le concept central de la programmation orientée objet (POO).
En programmation orientée objet, un objet est créé à partir d'un modèle appelé classe ou prototype, dont il hérite les comportements et les caractéristiques. Les comportements et les caractéristiques sont typiquement basés sur celles propres aux choses qui ont inspiré l'objet : une personne (avec son état civil), un dossier, un produit...
Syntaxe
Par convention, les fichiers dans lesquels on écrit une classe commencent par une majuscule.
Une définition de classe basique commence par le mot-clé class, suivi du nom de la classe. Suivent des accolades contenant la définition des propriétés et des méthodes appartenant à la classe.
Instanciation
Pour créer une instance de la class Card (par exemple), on utilise le mot clé "new" qui appelle la fonction constructeur de la classe.
Constructeur
Le mot clé "__construct" est réservé pour déclarer la fonction "constructeur" de classe. Il va permettre de donner des valeurs à toutes ou parties des propriétés de la classe.
Propriétés et méthodes
Les propriétés et méthodes d'un objet peuvent être publiques ou privées (public, private). Tout ce qui est privé ne pourra être appelé qu'au sein du code de la classe. Ce qui est publique pourra être appelé depuis du code extérieur à la classe.
Pour appeler une propriété ou une méthode depuis l'instance d'un objet où dans le code qui de la classe,
on utilise "l'opérateur d'objet" (object operator)
-> que l'on appelle aussi "flèche" (par opposition à la double flèche "=>" utilisée pour les tableaux)
Méthode et propriété statiques
Une méthode ou une propriété statique est une méthode ou une propriété qui n'est pas liée à une instance d'un objet mais directement à la classe.
Prenons l'exemple de la méthode get_copyright qui renverra toujours le même contenu quel que soit l'instance de l'objet
Pour pouvoir l'appeler depuis du code externe à la classe, il faudra la déclarer avec les deux mots clés "public static "
Ex :
public static function get_copyright() { return "© Coopernet"; }
L'appel de cette méthode statique utilisera la syntaxe suivante :
Card::get_copyright();
Dans le cas d'une propriété statique, le code deviendrait :
public static $copyright = "© Coopernet";
La récupération de cette propriété statique utilisera la syntaxe suivante :
Card::$copyright
Utilisation d'une méthode ou d'une propriété statique à l'intérieure de leur propre classe
A l'intérieur de leur propre classe, on ne peut pas utiliser la syntaxe habituelle du type $this->copyright pour la bonne et simple raison que cette propriété n'est pas liée à une instance mais bien à la classe.
La syntaxe appropriée est :
self::$copyright
$this
La pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelant
Exemples
Ex de définition d'une classe :
<?php class Card { // déclaration des propriétés public $question; public $answer; function __construct($question, $answer) { $this->question = $question; $this->answer = $answer; $this->date = new DateTime(); } // déclaration des méthodes public function set_question($question) { $this->question = $question; } public function get_question() { return $this->question; } public function set_answer($answer) { $this->answer = $answer; } public function get_answer() { return $this->answer; } // déclaration d'une méthode statique public static function get_copyright() { return "© Coopernet"; } }
Ex d'instanciation d'un objet :
$card = new Card("Prénom et nom de l'inventeur du web ?", "Tim Berners-Lee");
Ex de modification d'un attribut de l'objet :
Si la propriété est déclarée "publique", on peut la modifier directement via l'object opérator même depuis du code externe à la classe :
$card->answer = "Tim BERNERS-LEE";
Si la propriété est déclarée "privée", on ne peut la modifier directement depuis du code extérieur à la classe, il faudra faire appel à une fonction "setter" :
$card->set_answer("Tim BERNERS-LEE");