2010-03-05 7 views
2

J'ai une classe PHP qui stocke un tableau multidimensionnel complexe, et plutôt que d'écrire des méthodes d'accès individuelles en tant qu'interface à ce tableau, j'ai décidé d'utiliser la méthode __get de PHP5. Lorsque j'ai commencé à écrire ces accesseurs magiques, je me suis rendu compte que je n'avais aucune idée des meilleures pratiques ici, alors j'ai pensé que je demanderais. Est-ce qu'une grande structure if/else à l'intérieur de __get() est commune?PHP __get() bonne pratique

J'ai inclus un petit extrait de la classe de référence:

<?php 
    class Project { 

     private $data; 

     public function __construct($d) { 
     $this->data = $d; 
     } 

     public function __get($val) { 
     if ($val === 'title') 
      return $this->data['info']['projectName']; 
     else if ($val === 'id') 
      return $this->data['info']['projectID'];  
     else if ($val == 'health') { 
      switch($this->data['info']['health']) { 
       case 'OT': 
       case 'NS': 
       case 'LR': 
        return 'Low Risk&mdash;Healthy'; 
        break; 
       case 'CR': 
        return 'Critical Risk&mdash;Action Needed'; 
        break; 
       default: 
        return 'Unknown';    
      } 
     } 
     } 
    } 
?> 

Je suis juste accéder aux données comme:

$o = new Project($array); 
echo $o->title; #etc 
+0

Cela ressemble à un cauchemar à maintenir par la suite, sans parler de l'extension du monstre. – aefxx

+0

Ne pas speek if-else déclaration dans les méthodes __get(). Je dirai que vous devriez éviter d'utiliser l'instruction else-if autant que possible partout dans le monde. – caoglish

Répondre

0

En fin de compte, il est surtout une question de alternatives. Par conséquent, j'utilise généralement la construction de commutateur. Selon la situation, regex peut aussi être très utile.

0

Non, ce n'est pas commun de cette façon.

Adivce 1: La méthode __get() doit toujours renvoyer ce que vous enregistrez dans la section __set(). Ceci est une exigence de cohérence dans le programme général.

Si vous voulez renvoyer quelque chose de base sur les propriétés, je vous suggérerais d'écrire dans une autre méthode que __get().

Adivce 2: Gardez également à l'esprit la "responsabilité unique". Si une méthode gère plus d'une fonctionnalité, elle sera difficile à réutiliser et à modifier ultérieurement.

adivce 3: A propos if ... else if ... else, je vais l'appeler déclaration else-if parce qu'il a plus de deux conditions invovled. if...else J'appellerai if statatement.

Ne pas speek else-if instruction dans les méthodes __get(). Je dirai que vous devriez éviter d'utiliser l'instruction else-if autant que possible partout dans le monde. else-if est une mauvaise pratique en général. Normalement, dans votre if statmemt, lorsque vous en conditionnez plus de deux, vous devriez commencer à penser que votre code est abstrait et mieux structuré. La raison en est que le statut else-if est difficile à étendre, à maintenir et à tester. Aussi, l'instruction else-if peut toujours être convertie en un meilleur motif de conception.

Enfin, écraser le getter magique et le setter est-il une bonne idée? C'est une dette, s'il vous plaît lire cette discussion: Best practice: PHP Magic Methods __set and __get, et faites votre choix.

Questions connexes