devlop78
Invité n'ayant pas de compte PHPfrance
20 janv. 2012, 19:20
Tu verras avec le temps d'utilisation POO que les choses ne sont pas aussi simples. D'une part, l'auto complétition, d'autre part, comme tu dis, quel est l'interet d'encapsuler des propriétés pour les lire et écrire depuis l'extérieur sans restriction ? En réalité, sur 20 propriétés déclarées dans une classe, tu n'auras besoin d'en rendre accessible en lecture que 10 et en écriture que 5 (c'est arbitraire mais c'est un exemple tout à fait raisonnable). Et sur les 5, ce sera de TON DEVOIR - que tu peux ne pas remplir si tu veux, ça te regarde - de valider les données qui vont arriver. Un objet, c'est un peu comme un formulaire ... Il ne fait jamais confiance à ce qu'on lui passe. Et s'il enregistre des mauvaises valeurs et qu'il les utilise par la suite, c'est catastrophique ... Et si il doit vérifier à chaque fois qu'il utilise les valeurs si elles sont bonnes ou pas, c'est répétitif et ingérable. Donc, tu as des points d'entrée (qui constitue l'interface de la classe) où tu fais tes controles :
class voiture
{
protected $_dedans = array()
public function addPersonne(Animal $personne)
{
$this->_dedans[] = $personne;
}
public function getPersonnesDedans()
{
$personnes = array();
foreach($this->_dedans as $animal) {
if ($animal instanceof Humain) {
$personnes[] = $animal;
}
}
return $personnes;
}
}
Tu vois dans cet exemple, on n'accede pas depuis l'exterieur à la propriété $_dedans. C'est l'objet qui le gère. De plus, on veut ajouter un élément dans $_dedans, mais la classe vérifie qu'il s'agit bien d'un animal, par exemple pour être sûr plus tard qu'elle pourra lancer $animal->marcheVers($lieu). Par ailleurs, le getteur getPersonnesDedans n'est pas relié à une propriété getPersonnesDedans : en effet, il n'est pas utile que celui qui utilise la classe sache comment elle fonctionne. Il lui faut juste connaitre son rôle, son interface (méthodes accessibles), et c'est à peu près tout. Ainsi, elle instancie une voiture, peut y mettre 2 chiens et 3 humains, récupérer la liste des humains, sans jamais s'inquiéter ni de comment la classe fonctionne, ni de si lorsqu'elle récupère la liste des humains, ce sont bien des humains et non pas des chaines de caractères.
Je déconseille donc l'utilisation générique de __set et __get, qui sont plutot à réserver à des objets conteneurs, qui vont par exemple placer tout dans un tableau pour pouvoir itérer dessus etc ... Comme pour une vue.