Luc a écrit :
Bonjour,
J'aimerais savoir si c'est courant de vérifier la nature d'un objet en
php.
Supposons que j'ai une classe Voiture ayant un membre privé _moteur.
Lors de la création d'une voiture, on doit lui passer un objet Moteur
en paramètre.
Étant donné que php n'est pas typé, on peut passer n'importe quoi au
constructeur: un entier, un tableau ou un autre type d'objet...
Dans la classe voiture si je fais $this->_moteur->arreter() et que
_moteur est un entier, on devine la catastrophe.
Heu... Une erreur d'exécution, certes, mais de là à parler de "catastrophe", c'est peut-être exagéré. A moins bien sûr que ton code ne gère une fusée, une centrale nucléaire ou autre, mais là j'ai comme un doute... Les erreurs de typage peuvent être "catastrophiques" dans un langage sans vérification de type à l'exécution, surtout quand ce langage permet d'accéder directement à la mémoire. Ce n'est pas le cas ici.
Donc, dans le constructeur, je me dis que je devrais vérifier si je
reçois bien un moteur avec instanceOf.
Ce qui implique qu'un objet implémentant l'interface "Moteur" mais n'étant pas instance d'une classe dérivée de Moteur ne sera pas accepté. Par ailleurs, le fait qu'une classe hérite d'une autre (correction structurelle) n'implique pas qu'elle implémente *correctement* l'interface de la classe parent (correction sémantique). Par exemple, une sous-classe de Moteur pourrait implémenter "arreter" de façon à vider la base de données et envoyer un mail d'insulte à tes clients.
Cependant, je trouve que ça alourdit le code et me dis que c'est au
"propriétaire" de la voiture de lui fournir un moteur valide.
C'est généralement la logique qu'on utilise dans un langage à typage dynamique. Après, il ne faut pas confondre règle générale et circonstances particulières, donc c'est à toi de décider de l'option préférable en fonction du contexte. Ici, la question est surtout de savoir qui instancie ta classe Voiture, et quelles sont les chances qu'un paramètre incorrect soit passé. Si c'est dans ton code à toi que personne d'autre n'y met le nez, il est peu probable que tu t'emmêles à ce point les pinceaux. Si c'est une API destinée à être étendue par des centaines de développeurs inconnus (genre Facebook par exemple), il eput être bon d'être un peu plus restrictif.
Mes deux centimes...