2010-01-14 8 views
2

Je suis novice en matière de POO et j'ai de la difficulté à comprendre la nécessité d'une méthode getter.PHP OOP: Pourquoi un getter?

Dans l'exemple:

class foo { 
    $this->bar = "test"; 
} 

$foo = new foo(); 
echo $foo->bar; 

Quels sont les pièges potentiels dans cette situation, en supposant que je utilise une méthode setter pour valider correctement une valeur actualisée?

Répondre

6

La valeur d'une méthode getter est qu'elle vous permet de modifier votre implémentation ultérieurement, tout en gardant l'interface identique.

0

Un énorme avantage des getters/setters est que vous pouvez mettre du code de débogage dans les fonctions pour suivre quand les valeurs sont changées et accessibles lors des tests. Aussi, si un formatage ou un traitement de la variable doit être fait, vous pouvez le mettre dans le getter (ou avoir des getters différents).

+0

Ceci est un cas particulier de « changer votre mise en œuvre plus tard, mais garder l'interface même. » – gtrak

3

Voici la réponse classique:

que vous écrivez une classe avec une propriété représentant une température (en degrés F) et l'envelopper dans une méthode getTemp, jusqu'à présent, pas terrible. Vous devez maintenant y accéder également en degrés C, de sorte que vous écrivez une méthode getTempInCelcius qui convertit la température et renvoie la nouvelle version pour que l'ancienne et la nouvelle fonctionnent. Vous arrivez alors à réaliser à partir de vos logs que getTempInCelcius reçoit beaucoup plus d'appels que getTemp, donc vous réécrivez votre classe pour utiliser les degrés C en interne. Si vous n'aviez pas encapsulé votre température dans getTemp alors cela ne serait pas possible sans changements à tout ce qui utilise votre classe. À l'aide d'un getter, vous pouvez simplement insérer la logique et tout le monde remarquera l'augmentation des performances.

0

Le getter permet une plus grande flexibilité, de sorte que vous pouvez modifier le fonctionnement de votre code en arrière-plan tout en conservant la même interface.
Par exemple, vous pouvez changer le getter afin qu'au lieu de simplement donner à l'utilisateur les données, la fonction le modifie réellement (le décrypte ou quelque chose). Pour l'utilisateur, ils appellent toujours le getter, mais vous avez changé comment cela fonctionne.

0

Cela vous donne plus de flexibilité. Code peut souvent finir par avoir besoin de faire quelque chose de beaucoup plus que prévu. Par exemple, si vous décidez que vous voulez que $ bar soit une valeur calculée mais que vous voulez que $ foo-> getBar() retourne une chaîne.

function getBar() 
{ 
    if(date('w')==0) 
     return 'test'; 
    else 
     return 'live'; 
} 

Si vous avez décidé que voulu retourner « test » un dimanche (parce que le code même mérite un jour de congé).

1

La valeur des méthodes d'accès est qu'elles vous permettent d'avoir accès à des zones spécifiques d'une classe tout en en conservant la plus grande partie privée, c'est-à-dire l'encapsulation. Cela permet également à la signature de classe de rester stable.

1

L'utilisation de méthodes getter présente plusieurs avantages. Déjà mentionné sont le formatage, en gardant l'interface externe de la classe même lorsque les internes changent, et le débogage. Je les utilise aussi parfois pour la mise en cache si vous avez une propriété calculée.

par exemple

class TestClass 
{ 
    private $_cachedTestProperty; 

    public function __get($varname) 
    { 
     switch ($varname) 
     { 
      case "testProperty": 

       if (!isset($this->_cachedTestProperty)) 
       { 
        $this->_cachedTestProperty = /*calculate property*/ 
       } 

       return $this->_cachedTestProperty; 

       break; 
     } 
    } 
} 

Si vous faites cela, vous aurez besoin de se rappeler de désinitialiser la valeur en cache si un autre changement à la classe le rend obselete

Ils peuvent également fournir un accès en lecture seule à protéger/variables privées

Comme toujours avec ces choses, si vous voulez utiliser une propriété publique ou un getter dépend de ce que vous essayez de faire. Ils ne sont pas toujours meilleurs, c'est un cas d'utiliser le bon outil pour le travail

0

Une règle de pouce est que vous ne devriez jamais exposer membres dans votre structure. Les membres sont des variables dans la portée de votre classe. Maintenant, avec cela dit vous devriez toujours marquer vos variables de classe comme privées et créer des accesseurs pour elles, ce qui vous donnera une meilleure façon d'exposer uniquement ce qui doit être exposé au monde extérieur.

De même, lorsque vous utilisez des getters et des setters, vous contrôlez les données, si vous le souhaitez, vous pouvez formater à la fois l'entrée et la sortie.

En savoir plus sur les concepts de object oriented programmng on php.net