我有一个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—Healthy';
break;
case 'CR':
return 'Critical Risk—Action Needed';
break;
default:
return 'Unknown';
}
}
}
}
?>
然后我只是访问数据:
$o = new Project($array);
echo $o->title; #etc
答案 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,并提出你的想法。