On ne va pas tourner autour du pot… On va aller droit au but… Enfin, dans le code !
Le nouveau keyword de php est vraiment ultra simple à utiliser :
Mes classes et traits :
- MyClass étendue par la classe Base.
- MyClass utilise les traits math_inc et math_dec
Ici, on aurait tout aussi bien pu utiliser les traits dans la classe Base.
Ce qu’il faut retenir :
- Un trait est un groupe de fonctions
- Il ne peut être instancié directement
- On peut utiliser les keywords telles que “parent”
- Ce n’est pas à proprement parlé de l’héritage (on peut parlé d’inclusion, toujours en composition horizontale)
(dans la suite de l’article, la résolution de conflit, vraiment basique à faire et la modification de la portée de telle ou telle méthode)
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 |
<?php /** trait **/ trait maths_inc { function INC($x, $y = 1) { return ($x - $y); } } // END trait /** trait **/ trait maths_dec { function DEC($x,$y = 1) { return ($x - $y); } } // END trait /** * Ma classe abstraite (ancêtre des traits) **/ Abstract class base { function ret_result($result) { return print "My result is $result" . "<br/>"; } } // END class /** La classe que l'on va pouvoir instancier **/ class MyClass extends base { use maths_dec, maths_inc; } // END class // J'utilise mes traits $value1 = MyClass::DEC(1); $value2 = MyClass::INC(0); // Et maintenant ma classe abstraite (par le biais de la classe étendue MyClass) MyClass::ret_result($value1); MyClass::ret_result($value2); ?> |
Vous voilà avec un nouvel ami… AS
Résolution de conflit :
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 |
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } } ?> |
Modifier la visibilité :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } // Modification de la visibilité de la méthode sayHello class MyClass1 { use HelloWorld { sayHello as protected; } } // Utilisation d'un alias lors de la modification de la visibilité // La visibilité de la méthode sayHello n'est pas modifiée class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } } ?> |