Réponse acceptée !
Un setter permet de contrôler la manière dont une valeur est assignée à une propriété à l'extérieur de la classe : une classe utilisée par d'autres personnes ou par d'autres classes, notamment, et pour des propriétés dont la visibilité est en général protégée ou privée, ou alors dont on souhaite modifier le contenu avant l'assignation (ou le contrôler, etc).
A l'intérieur de la classe, l'utilisation de setters n'est absolument pas indispensable : tu as un accès direct aux propriétés, utiliser des setters est une perte en performances (bon, c'est dérisoire, mais dans ta classe, a priori, tu sais ce que tu fais, donc le setter n'est pas utile).
Exemple de classe (de base, sans fonctionnalité, juste pour illustrer) :
class User {
private $user_id;
public function __construct($user_id) {
$this -> user_id = $user_id;
// Ensuite, va chercher les infos de l'utilisateur dans la bdd
}
public function getUserId() {
return $this -> user_id;
}
}Dans cette classe rudimentaire, le user_id est déterminé à l'instanciation : on va chercher les informations concernant le membre d'après son user_id.
Par la suite, on ne souhaite pas pouvoir modifier le user_id, mais on souhaite quand même pouvoir le lire. La propriété $user_id est privée : inaccessible ailleurs que dans la classe elle-même. Par contre, la méthode getUserId() permet de lire le user_id.
Imaginons maintenant que l'on souhaite pouvoir modifier l'adresse email du membre, mais empêcher de définir n'importe quelle valeur : il faut que l'adresse soit valide. On va faire de même, mais avec un setter, par exemple setEmail($email)
Cette méthode vérifierait la validité de l'argument $email avant de l'assigner à la propriété de l'objet : elle pourrait retourner TRUE si l'adresse est valide et a été assignée, FALSE sinon. Dans ta classe elle-même, ce ne serait pas utile, sauf si tu souhaites bénéficier du traitement effectué par le setter. Si c'est pour simplement assigner une valeur à une propriété, ce n'est pas indispensable du tout.
Pour revenir à ta question, l'instance de la classe Connexion serait plutôt un argument du constructeur. L'avantage du singleton, c'est de pouvoir récupérer l'instance sans la passer nulle part en argument, et la stocker dans l'objet Animal. N'oublions pas qu'en PHP5 les objets sont passés par référence : ils n'existent donc qu'en un seul exemplaire dans la mémoire de PHP, ce que le développeur manipule ne sont que des références à cet exemplaire unique.
Autrement, passer une instance de Connexion en argument au constructeur de Animal n'a rien de choquant : la propriété désigne quelle connexion l'instance de Animal doit utiliser pour accéder à la base de données.
class Animal {
public $couleur;
public $espece;
protected $connexion;
public function __construct($espece, $couleur, $connexion) {
$this -> espece = $espece;
$this -> couleur = $couleur;
$this -> connexion = $connexion;
}
public function Ajoute() {
$this -> connexion -> query($requete_ajout);
}
}
Si on ne passait pas la connexion en argument, si c'était un singleton, on aurait un constructeur dans ce genre :
public function __construct($espece, $couleur) {
$this -> espece = $espece;
$this -> couleur = $couleur;
$this -> connexion = Connexion::getInstance();
}
Est-ce que c'est plus clair ?
Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...