PHP orienté objet, constantes de classe, ORP, méthodes et attributs statiques (4)
Dans ce nouveau chapitre, nous allons voir les constantes de classes, l’opérateur de résolution de porté abrégé ORP et les méthodes et attributs statiques… On rentre un peu plus dans la technique de l’objet !
Les constantes de classes
Le principe d’une constante de classe est similaire à la déclaration d’une variable avec define. On peux accéder à notre constante de classe via l’opérateur ORP qui est le double deux points: « :: ».
Voici un petit exemple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php class vaisseau { /** * Force du vaisseau * * @var int */ private $_force; /** * Précision de tir du vaisseau * * @var int */ private $_precision; /** * Unité de vie du vaisseau * * @var int */ private $_vie; /** * Définition des constantes de précisions de TIR * */ const MIN_PRECISION = 10; const MOY_PRECISION = 50; const TOP_PRECISION = 100; public function __construct($precisionInit) { $this->_precision = $precisionInit; } } ?> |
Cette classe contient donc trois constantes de classe, la précision de tir minimale, la précision de tir moyenne et la plus haute. Si nous voulons construire un nouveau vaisseau avec une précision de tir basse, nous ferions:
1 2 3 | <?php $vaisseau = new vaisseau(vaisseau::MIN_PRECISION); ?> |
Nous envoyons le paramètre dès l’instanciation de classe car le constructeur de la classe prend le paramètre $precisionTir et comme le constructeur est une méthode magique appelée lors de l’événement d’instance, nous devons envoyer ce paramètre des la création de l’objet !
Autre point important, j’ai accéder à ma constante de classe via un ORP précédé du nom de la classe.
Mais pourquoi donc ?!
Une constante de classe appartient à la classe et non à l’objet, $this contient ce qui appartient à l’objet, alors nous n’aurons pas accès à la constante de classe depuis la pseudo variable $this. Pour résumer, une constante de classe appartient à une classe, pour y accéder on précède donc l’ORP du nom de la classe de la constante suivi du nom de la constante. Le nom d’une constante de classe s’écrit en majuscule par convention de nommage et non par obligation, c’est vous qui voyez
.
Les attributs et méthodes statiques
Voyons maintenant les attributs et les méthodes statiques.
Les méthodes statiques
Une méthode statique peut être appelé sans que l’objet existe, donc sans que la classe ne soit instancié… Une chose doit donc être très clair, $this n’existe pas au sein d’une méthode statique !
Pourquoi donc ?!
Si la classe n’est pas instancié, l’objet n’existe pas, logique puisque une instance de classe n’est autre que la création d’un objet. Si l’objet n’existe pas, $this n’existe pas. Si nous appelons une méthode statique sans instancier la classe, comme au sein de la méthode statique peut-on faire référence à $this ?
C’est peut être un peu flou mais vous allez vite comprendre, voici un exemple:
1 2 3 4 5 6 7 8 9 | <?php class myClass { public static function direBonjour() { echo 'bonjour'; } } ?> |
Dans cette classe, la méthode direBonjour est static, voici la façon d’y accéder:
1 2 3 | <?php myClass::direBonjour(); ?> |
Comme vous pouvez le remarquer, je n’instancie à aucun moment la classe ‘myClass‘ et pourtant, j’accède bien à la méthode static direBonjour via l’ORP.
Le grand intérêt d’une méthode statique est son indépendance, elle n’est rattachée à aucun objet ! Son but premier est donc d’agir sur la classe et non sur l’objet.
Les attributs statiques
Les attributs statiques sont très similaires aux méthodes statiques. La syntaxe est la même, il faut précéder un attribut du mot clé static pour le rendre statique. Tout les objets auront accès à un attribut statique et surtout, ce dernier aura la même valeur pour chacun des objets
.
Allez un petit exemple simple, on va compter le nombre d’appel à une méthode, mieux que ça même, vous vous souvenez de la classe vaisseau un peu plus haut ? J’espère que oui ! Hé bien on va compter combien de vaisseaux sont construits. Un vaisseau est construit à chaque instance de la classe, il suffit donc de compter les instances de classe !
Donc reprenons la classe vaisseau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?php class vaisseau { /** * Force du vaisseau * * @var int */ private $_force; /** * Précision de tir du vaisseau * * @var int */ private $_precision; /** * Unité de vie du vaisseau * * @var int */ private $_vie; /** * Nombre de vaisseaux construit * * @var int */ public static $nbVaisseau = 0; /** * Définition des constantes de précisions de TIR * */ const MIN_PRECISION = 10; const MOY_PRECISION = 50; const TOP_PRECISION = 100; public function __construct($precisionInit) { $this->_precision = $precisionInit; self::$nbVaisseau++; } public static function nbConstruction() { return self::$nbVaisseau; } } ?> |
Voyez ce qui change, j’ai rajouté un attribut static $nbVaisseau avec la valeur 0 affecté par défaut. La méthode statique nbConstruction() retourne le nombre de vaisseau construit. Nous nous étions dit qu’une instance était synonyme d’une construction, donc nous allons incrémenter le nombre de construction des l’instance de la classe et donc dans la méthode magique __construct()
ATTENTION, je vous avez dit que $this n’existait pas dans une méthode statique, pour accéder à un attribut, on utilise donc le mot clé self suivi de l’ORP. Faites bien attention à mettre le $ pas comme dans $this ou on ne met rien.
Pour voir le résultat il suffit de faire:
1 2 3 4 5 6 7 | <?php new vaisseau(vaisseau::MIN_PRECISION); new vaisseau(vaisseau::MOY_PRECISION); new vaisseau(vaisseau::TOP_PRECISION); echo vaisseau::nbConstruction(); ?> |
Si tout fonctionne bien, il doit s’afficher 3 sur votre écran.
Ce chapitre est assez complexe si vous découvrez la programmation orienté objet, aussi n’hésitez pas à lire et relire les passages qui vous semble encore obscur ou à poster un commentaire pour avoir des explications supplémentaires.
La synthèse et les points à retenir
- Une constante de classe est précéder du mot clé const et s’écrit en majuscule par convention de nommage. Une constante de classe est un attribut de la classe dont la valeur est constante, n’essayez donc pas de modifier la valeur d’une constante…
- Une méthode statique est utilisé pour modifier directement la classe, elle modifie par exemple les attributs de la classe. Dans une méthode statique, la pseudo variable $this n’existe pas car une méthode statique n’est pas rattaché à l’objet. Si l’on veux accéder à un attribut ou une méthode de la classe, on sert donc du mot clé self suivi de l’ORP et du nom de l’attribut ou de la méthode.
- Un attribut statique n’est pas rattaché à une instance, il sera donc unique et conservera toujours sa valeur. Il fonctionne de manière similaire qu’une méthode statique.
Voila pour ce chapitre un peu plus technique, dans le prochain chapitre, nous allons parler héritage et c’est un peu plus reposant
.
Laissez un commentaire