当人们处理扩展其他类的类并根据类中的某些设置提供功能时,我会看到两种不同的实现.
>变量用于存储设置.
>方法用于返回设置.
使用变量:
class Model {
var $fields = array();
function getFields() {
return array_keys($this->fields);
}
function getRules() {
return $this->fields;
}
}
class Person extends Model {
var $fields = array(
'name' => array('maxLength'=>10),
'email' => array('maxLength'=>50, 'validEmail'=>true),
);
}
使用方法:
class Model {
function getFields() {}
}
class Person extends Model {
function getFields() {
return array('name','email');
}
function getRules() {
return array(
'name' => array('maxLength'=>10),
'email' => array('maxLength'=>50, 'validEmail'=>true),
);
}
}
两个示例都实现了相同的结果,我可以执行诸如$person-> getFields()和$person-> getRules()之类的操作,但在方法示例中我不喜欢“重复”字段列表,因为字段实际上是在$person-> getFields()和$person-> getRules()中定义的,它必须在每次通过该方法询问时计算数组.另一方面,我不喜欢每个对象都存储变量中的所有设置.这似乎是一种资源浪费.所以我只是想知道什么是更好的方式.
我的主要问题是:
>是否有表现理由选择另一种方式? 2)
>是否存在OOP逻辑/易编程/其他原因来选择一个
另一种方式?
最佳答案 从一些基准测试 – 时间非常相似 – 尽管如此
return array('name','email');
比…快得多
return array_keys($this->fields);
为每种方法运行10,000次操作产生了这些平均值:
Variable:
getFields 0.06s
getRules 0.05s
Method:
getFields 0.04s
getRules 0.05s
要回答第二个问题 – 这取决于您的用例 – 如果存储在这些对象中的数据是静态的,或者它是否来自另一个数据源/配置文件.
一个跟进问题,为什么不使用对象属性?
class Person extends Model {
protected $name
protected $email
public function getName() {
return $this->name;
}
public function getEmail() {
return $this->email;
}
}