当人们处理扩展其他类并基于类内的特定设置提供功能的类时,我看到了两种不同的实现。
- 变量用于存储设置
- 方法用于返回设置
使用变量:
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);
每种方法运行10000次操作产生以下平均值:
Variable:
getFields 0.06s
getRules 0.05s
Method:
getFields 0.04s
getRules 0.05s
为了回答您的第二个问题——这取决于您的用例——存储在这些对象中的数据是静态的,还是来自另一个数据源/config文件。
接下来的一个问题是,为什么不使用对象属性?
class Person extends Model {
protected $name
protected $email
public function getName() {
return $this->name;
}
public function getEmail() {
return $this->email;
}
}
我的观点是选择您满意的,使用它们都不会带来太大的性能损失或性能提升。您最好将节省性能的精力用于数据处理。
对我来说,我使用对象属性,当你查看类时,它看起来很清楚,用于存储这样的默认属性,如果你想覆盖它们,那么使用这个漂亮的语法:
array()+array()