Citation :Avec getAge() je ne peux pas faire ce genre de choses. Je ne suis pas soupleJe te le redis: oui, tu le peux (à condition de passer l'appelant en paramètre du getAge; sinon, ça repose sur la stacktrace, et c'est plutôt lent), et c'est la responsabilité de la classe appelée (et non de l'appelante) qui est engagée (via instanceof ou n'importe quel autre mécanique interne).
Exemple:
Code PHP :
<?php
class Client implements IClient {
private $combienDeFoisLINSEEMaDemande = 0;
public function getAge($caller) {
// discriminer via instanceof
// ou via n'importe quel autre critère
// comme le nombre de sollicitations de l'INSEE
}
}
class Barman {
//...
$client->getAge($this);
}
D'ailleurs, en East, tu exposes le fait que le Client peut répondre différemment suivant si un Barman, un Policier, ou l'INSEE demande l'age. Tu en sais finalement plus que tu ne le crois sur cet appelé. En approche classique, t'en sais rien. Si cela se trouve, l'appelé ignorera complètement le typage de l'appelant, ou alors il se basera sur des critères externes à l'appelant, etc.
Rien n'oblige l'appelé à faire le "même type d'action quelque soit l'appeleur". Si l'appeleur n'est pas passé en paramètre, l'appelé n'a pas connaissance de qui il est, donc c'est normal qu'il ne puisse pas réagir différemment (l'appelé ne connait pas le contexte appelant). Si l'appeleur est passé en paramètre, l'appelé peut réagir comme il le souhaite.
Pour moi, y'a clairement une différence entre East (return $this ou return null; obligatoire) et le fait de passer ou non des paramètres additionnels aux getters (qui demande la donnée par exemple).
Attends, là, le problème du askAge peut retourner ce qu'il veut, c'est inhérent au langage PHP, et c'est même ce que tu en attends quand tu dis East permet de "retourner" ce que je veux: null, un faux age, ou pas un age.
Il sera en plus possible de le typehinter en version 7; donc si l'argument est East c'est bien car je peux 'typer' mes retours, il sera invalide en PHP7 (et East comblerait alors une lacune du langage: c'est un paradigme pour faire un langage, pas pour l'utiliser).
De plus, en un sens, on s'en "fiche" de ce qui est retourné, puisque ce que l'on veut, c'est le comparer à $this->minAge. Si tu veux blinder tes codes, tu peux toujours faire
Code PHP :
<?php
$clientRawAge = $client->askAge();
$clientAge = (int)$clientRawAge; // On peut aussi tester instanceof TimeInterval qui serait un valueobject
return $clientAge > $this->minAge &&...