2010-03-05 70 views
2

我有一个PHP类,它存储一个复杂的多维数组,而不是将单独的访问器方法作为接口写入这个数组,我决定使用PHP5的__get方法。PHP __get()最佳实践

当我开始写这些魔法访问器时,它给我穿上了我不知道什么是最佳实践,所以我想我会问。 __get()是否是一个大的if/else结构?

我已经包括了类的参考小片段:

<?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';    
      } 
     } 
     } 
    } 
?> 

然后,我只是像访问数据:

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

这看起来像一个噩梦维持后,而不是说延长怪物。 – aefxx 2010-03-05 22:05:01

+0

不要在__get()方法中声明if-else语句。我会说你应该尽量避免使用else-if语句。 – caoglish 2017-08-03 00:48:27

回答

0

到底它主要的问题备择方案。因此,我通常使用开关结构。根据具体情况,正则表达式也可能非常有用。

0

不,这种方式并不常见。 ()方法应该总是返回保存在__set()部分中的内容。这是一般程序的一致性要求。

如果你想返回基于属性处理的东西,我会建议使用另一种方法而不是__get()来写。

Adivce 2: 另外,请牢记“单一责任”。如果一个方法处理多个功能,那么稍后将难以重用和修改。

书于3: 关于if ... else if ... else,我将其称之为else-if语句,因为它具有两个以上条件invovled。 if...else我会致电if陈述。

不要在__get()方法中声明else-if语句。我会说你应该尽量避免使用else-if语句。否则 - 如果是一般的不好的练习。通常,在你的状态下,当条件超过两个时,你应该开始考虑将你的代码抽象为更好的逻辑模式/结构。原因是else-if语句很难扩展,维护和单元测试。另外 - 如果语句总是可以转换成更好的设计模式。

最后,是否覆盖了魔法吸气剂和固定器的好主意?这是一个债务,请阅读这个讨论:Best practice: PHP Magic Methods __set and __get,并让你的主意。