Salut,
J'avais déjà dû le voir, mais maintenant ça me choque.
Imaginons :
une interface "say" qui déclare une méthode "hello".
une classe "behavior" qui implémente cette interface et qui déclare aussi une méthode public "byebye"
une classe "person" qui a une propriété "protected $_behavior" et un setter "public function setBehavior(say $behaviorSay)" et un getter "public function getBehavior()"
A votre avis, dans setBehavior() qu'est ce que je peux faire ?
tic, tac, tic, tac
attention l'heure tourne.
petit indice je fais un print_r/var_dump sur $behavior et PHP va m'afficher "behavior Object()"
tic, tac, tic, tac
Et bien, PHP m'autorise à utiliser la méthode "byebye" alors même qu'elle n'est pas déclarée dans l'interface "say".
Perso, ça me semble anormal car ça permet aux développeurs de faire ce qu'ils veulent dès lors que c'est public et ce, même si on a tenté de brider via un typage de paramètre. Evidemment je sais qu'on ne peut pas typer une propriété, du coup quand on appel le getter getBehavior(), je sais que j'aurais accès à tous ce qui est public dans l'objet qui a été injecté (au niveau de l'IDE si les commentaires sont bons on peut ~typer la propriété et brider l'autocomplétion proposé). Mais quand cela est possible aussi dans la méthode qui n'est censé utiliser que l'implémentation de l'interface, là ça me gène.
Je suis seul à penser ça ? j'ai raté quelque chose ? je me pose trop de question ? je me pose les mauvaises questions ?
PS : c'est la même chose si on utilise une classe abstraite et que l'on se sert de cette classe pour typer le paramètre : c'est le type de l'objet qui prime.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 interface say { public function hello(); }; interface move { public function walk(); } class behavior implements say, move{ public function hello(){echo 'hello';} public function byebye(){echo 'bye bye';} public function walk(){echo 'i am walking';} }; $a = new behavior; class person { /** * permet de brider l'auto-complétion de l'IDE sur les méthodes disponibles dans l'interface say * @var say */ protected $_behavior; public function setBehavior(say $behavior){ $this->_behavior = $behavior; // ne devrait pas être accessible $behavior->byebye() ou $behavior->walk(); // ceci est autorisé en php alors que cette méthode n'est pas déclarée dans l'interface say } // on ne peut pas typer une propriété, du coup il est normal que cet getter permette ensuite d'accéder aux méthodes byebye et walk puisque de manière dynamique on a stocker un objet de type behavior public function getBehavior() { return $this->_behavior; } }
Du coup le typage des paramètres sert à controller le type au niveau de l'entré alors qu'il devrait permettre également de controller l'utilisation de l'objet au sein de la méthode.
Partager