PHP __get()最佳实践

时间:2010-03-05 21:59:01

标签: php oop get

我有一个PHP类,它存储一个复杂的多维数组,而不是将各个访问器方法作为这个数组的接口编写,我决定使用PHP5的__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

2 个答案:

答案 0 :(得分:0)

最后,它主要是一个替代品问题。因此,我通常使用switch结构。根据具体情况,正则表达式也非常有用。

答案 1 :(得分:0)

不,这种方式并不常见。

Adivce 1: __get()方法应始终返回您在__set()节中保存的内容。这是一般程序中的一致性要求。

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

Adivce 2: 此外,还要记住“单一责任”。如果一个方法处理多个功能,则以后很难重用和修改。

Adivce 3: 关于if ... else if ... else,我将其称为else-if语句,因为它有两个以上的条件调用。 if...else我会致电if声明。

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

最后,是否覆盖了神奇的getter和setter好主意?这是一个债务,请阅读此讨论:Best practice: PHP Magic Methods __set and __get,并提出你的想法。