Ah, je viens enfin de mieux comprendre à quoi servait l’opérateur cons ::
. Dans le précédent billet où j’en parlais je disais qu’il permet de résoudre un attribut ou une méthode, éh bien c’est tout à fait vrai !
- Pour appeler un attribut ou une méthode d’une class dans cette même class, on utilise
$this->methodeOuAttribut
. - Pour appeler un attribut ou une méthode d’une class lorsqu’on a instancié cette class, on utilise
$nomInstance->methodeOuAttribut
. - Pour appeler un attribut ou une méthode d’une class dans une autre class, on utilise
NomDeLaClass::methodeOuAttribut
. Les deux class doivent bien sûr se trouver dans le même fichier, ou on peut inclure l’une dans le fichier de l’autre avecinclude()
ourequire()
.
Dans le cas d’un attribut, si l’on tente d’y accéder avec le nom d’une class, cela signifie que notre attribut doit être static, il reste identique pour toutes les instances de cette class.
Prêt pour un petit exemple (débile) ?
<?php class DitBonjour { protected static $fr = 'Coucou le monde !'; public static $en = 'Hello world!'; public static $de = 'Guten tag!'; function saluer() { return 'Guten tag!'.'<br />'; } function saluer_en_langue($langue) { return $langue; } function fr() { return self::$fr; } function de() { return $this->de; } } class Appeler { function dire_bonjour() { echo DitBonjour::saluer(); } function dire_bonjour_en_langue() { echo DitBonjour::saluer_en_langue(DitBonjour::fr()).'<br />'; echo DitBonjour::saluer_en_langue(DitBonjour::$en).'<br />'; echo DitBonjour::saluer_en_langue(DitBonjour::de()).'<br />'; } } $appel = new Appeler(); $appel->dire_bonjour(); $appel->dire_bonjour_en_langue();
Ceci renverra :
Guten tag!
Coucou le monde !
Hello world!
Notice: Undefined property: Appeler::$de in F:\bn\Web\Test\PHPObjet\test2.php on line 26
Donc on voit bien que pour les méthodes il n’y a aucun problème, l’appel se fait très bien. (sauf si on avait rajouté des protected ou private, bref, je vous renvoie vers un précédent billet) Lorsqu’il s’agit des attributs… Pour le français, l’attribut $fr est protégé, j’ai donc utilisé un accessor avec self::
pour avoir la valeur de l’attribut pour cette class (ce qui oblige la staticité) : pas de problème. Mais l’anglais est la preuve que l’on peut aussi accéder directement à l’attribut s’il est en accès public. Quant à l’allemand, il renvoie une erreur puisque le $this->
implique que l’appel va chercher l’attribut $de dans la class Appeler, il n’existe pas, donc une erreur est renvoyé.
Bon, j’avoue que j’ai encore du mal à saisir les subtilités entre self, parent et $this, (ça parait pourtant tellement simple en théorie), mais encore quelques petits exemples, voir quelques petits tests, et ça devrait être bon 😀