11
votes

Objet orienté PHP Pratiques

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

}


0 commentaires

6 Réponses :


23
votes

Utilisation de getters et de configurateurs explicites pour les propriétés de l'objet (comme l'exemple que vous avez donné pour set_name ) au lieu d'y accéder directement à eux vous donne (entre autres) les avantages suivants:

  • Vous pouvez modifier la mise en œuvre "interne" sans avoir à modifier des appels externes. De cette façon, le code «extérieur» n'a pas besoin de changement si souvent (parce que vous fournissez un moyen d'accès cohérent).
  • Vous fournissez très explicitement quelles propriétés sont censées être utilisées / appelées de l'extérieur de la classe. Cela se révélera très utile si d'autres personnes commencent à utiliser votre classe.

    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 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»).


1 commentaires

Une autre chose importante de l'utilisation de getters / setters consiste à éviter de disposer de toutes les méthodes telles que public , empêchant le développeur de les modifier / les accéder sans contrôle.



2
votes

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.

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 de la variable d'instance.)

De plus, l'utilisation d'un getter / setter bouque également d'autres parties de la même classe de connaître sa propre implémentation, que j'ai trouvée très utile à l'occasion!


0 commentaires

6
votes

Je suis parfaitement d'accord avec Cristophed (voté). J'ajouterais simplement une bonne pratique lors de la création d'une nouvelle personne .

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: xxx

évidemment, vous pouvez utiliser la méthode de setter dans le constructeur (notez le code dupliqué pour le sexe Setter).


2 commentaires

"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.)



1
votes

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: xxx

Plus de lecture: http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-Toolbox.html


0 commentaires

30
votes

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');


3 commentaires

+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 :)



4
votes

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);
}
}


0 commentaires