dire que j'ai une classe qui représente une personne, une variable de cette classe serait $ nom de $.
précédemment, dans mes scripts, je créerais une instance de l'objet puis définissez le nom en utilisant simplement: p >
function set($data)
{
$this->name= $data['name'];
$this->age = $data['age'];
etc
etc
}
6 Réponses :
Utilisation de getters et de configurateurs explicites pour les propriétés de l'objet (comme l'exemple que vous avez donné pour Les raisons ci-dessus sont la raison pour laquelle cela pourrait être considéré comme une meilleure pratique, bien que ce ne soit pas vraiment nécessaire em> le faire (et pourrait être considéré comme une surkill pour certaines utilisations; par exemple lorsque votre objet fait très peu de "traitement" 'Mais il agit simplement comme un espace réservé pour «données»). P> set_name code>) au lieu d'y accéder directement à eux vous donne (entre autres) les avantages suivants: P>
Une autre chose importante de l'utilisation de getters / setters consiste à éviter de disposer de toutes les méthodes telles que public code>, empêchant le développeur de les modifier / les accéder sans contrôle.
En tant que contrepoint de la réponse de Christophed, si votre variable d'instance est strictement destinée à une utilisation privée, je ne me dérangerais pas à écrire un getter & Setter et déclarez simplement la variable d'instance privée. P>
Si d'autres objets doivent accéder à l'objet, vous pouvez toujours ajouter un getter. (Cela expose un autre problème, dans les autres classes pourraient être en mesure de modifier l'objet renvoyé par le getter. Mais votre getter pourrait toujours retourner une copie em> de la variable d'instance.) P>
De plus, l'utilisation d'un getter / setter bouque également d'autres parties de la même classe EM> de connaître sa propre implémentation, que j'ai trouvée très utile à l'occasion! P>
Je suis parfaitement d'accord avec Cristophed (voté). J'ajouterais simplement une bonne pratique lors de la création d'une nouvelle personne em>. généralement, utilisez un constructeur qui accepte les champs obligatoires et définissez les valeurs par défaut des champs facultatifs. Quelque chose comme: p> évidemment, vous pouvez utiliser la méthode de setter dans le constructeur (notez le code dupliqué pour le sexe Setter). P> P>
"Peut-être nécessaire après un voyage à Casablanca" lol
Deux choses à garder à l'esprit: 1. Constructeurs de PHP 5+ ont cette structure: __Construction () {} 2. En PHP, vous ne pouvez pas créer deux constructeurs avec des signatures différentes, comme la personne (String $ nom) et personne (), Vous ne pouvez en avoir un. (Il y a des moyens de réaliser cela, assez facilement, cependant.)
d'un point de vue plus général à la fois accès direct ($ personne-> nom) et méthodes d'accessor ($ personne-> getname) sont considérés comme nocifs. Dans OOP, les objets ne doivent pas partager aucune connaissance de leur structure interne et n'exécuter que des messages qui leur sont envoyés. Exemple: Plus de lecture: http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-Toolbox.html p> p>
Vous devez avoir des méthodes de réglage / getter. Ils sont une douleur mais vous n'avez pas nécessairement besoin de les écrire vous-même. Un IDE (par exemple Eclipse ou NetBeans) peut les générer automatiquement pour vous aussi longtemps que vous fournissez le membre de la classe. Cependant, si vous ne voulez pas faire face à cela du tout et que vous êtes sur PHP5, vous pouvez utiliser ses méthodes magiques pour résoudre le problème:
$object->setName('Bob')
->setHairColor('green')
->setAddress('someplace');
+1 Quand j'ai vu la question, je pensais immédiatement dans ces lignes. Bonne réponse!
C'est une technique intéressante.
Comme la façon dont vous avez mentionné l'inconvénient de la documentation. logique :)
Pour aller plein POOP, vous devriez faire quelque chose de similaire à:
class User {
private $_username;
private $_email;
public function getUsername() {
return $this->_username;
}
public function setUsername($p) {
$this->_username = $p;
}
...
public function __construct() {
$this->setId(-1);
$this->setUsername("guest");
$this->setEmail("");
}
public function saveOrUpdate() {
System::getInstance()->saveOrUpdate($this);
}
}