Ta méthode est de traviole: tu acceptes en entrée n'importe quel $object, donc ta méthode (son algorithme) doit être capable de traiter n'importe quel objet.
Si c'est un Beggar ou un Kid, elle est faite de travers car tu appelles une méthode dessus alors que le typage de $object est mixed, et le instanceof te dis juste qu'il est Beggar/Kid (pas de giveGold définit sur ces interfaces).
Ton problème ici n'est pas que tu as une méthode qui discrimine, en interne, les cas; ton problème est que tu acceptes en entrée n'importe quelle variable ($object est non typé) et que tu fais ensuite des appels de méthode dessus. C'est comme si tu m'avais présenté ce code:
D'ailleurs, fait le test sur Netbeans: si le instaceof est fait, Netbeans te propose l'auto-complétion des méthodes associées à cette interface. s'il n'est pas fait, il ne te propose rien.
Ce que j'essaie de te faire passer, c'est que le typehinting définit ce que la méthode accepte en entrée, alors que l'instanceof définit comment son algorithme interne traite cette entrée, et cette méthode de traitement ne doit pas transpirer hors de la classe.
Si c'est un Beggar ou un Kid, elle est faite de travers car tu appelles une méthode dessus alors que le typage de $object est mixed, et le instanceof te dis juste qu'il est Beggar/Kid (pas de giveGold définit sur ces interfaces).
Ton problème ici n'est pas que tu as une méthode qui discrimine, en interne, les cas; ton problème est que tu acceptes en entrée n'importe quelle variable ($object est non typé) et que tu fais ensuite des appels de méthode dessus. C'est comme si tu m'avais présenté ce code:
interface Hero
{
public function askGold($object);
}
interface Beggar
{
public function meetHero(Hero $hero);
}
class Conan implements Hero
{
public askGold(Beggar $object)
{
$object->giveGold($this->gold/2);
}
}
class FrancoisdAssise implements Beggar
{
public function meetHero(Hero $hero)
{
$hero->askGold($this);
}
}
$conan = new Conan();
$francoisdAssise = new FrancoisdAssise();
$francoisdAssise->meetHero($conan);
D'ailleurs, fait le test sur Netbeans: si le instaceof est fait, Netbeans te propose l'auto-complétion des méthodes associées à cette interface. s'il n'est pas fait, il ne te propose rien.
Ce que j'essaie de te faire passer, c'est que le typehinting définit ce que la méthode accepte en entrée, alors que l'instanceof définit comment son algorithme interne traite cette entrée, et cette méthode de traitement ne doit pas transpirer hors de la classe.