将PHP类设置存储在变量中或从方法返回
当人们处理扩展其他类并基于类内的特定设置提供功能的类时,我看到了两种不同的实现将PHP类设置存储在变量中或从方法返回,php,oop,model,Php,Oop,Model,当人们处理扩展其他类并基于类内的特定设置提供功能的类时,我看到了两种不同的实现 变量用于存储设置 方法用于返回设置 使用变量: class Model { var $fields = array(); function getFields() { return array_keys($this->fields); } function getRules() {
- 变量用于存储设置李>
- 方法用于返回设置
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),
);
}
}
使用方法:
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()中定义的
,每次通过该方法请求时,它都必须计算数组。另一方面,我不喜欢每个对象都将所有设置存储在一个变量中。这似乎是一种资源浪费。所以我只是想知道更好的方法是什么
我的主要问题是:
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),
);
}
}
不过,从一些基准测试来看——时间非常相似——这是一个例外
return array('name','email');
比以前快多了
return array_keys($this->fields);
对每种方法运行10000次操作会产生以下平均值:
Variable:
getFields 0.06s
getRules 0.05s
Method:
getFields 0.04s
getRules 0.05s
回答第二个问题——这取决于您的用例——这些对象中存储的数据是静态的,还是来自另一个datasource/config文件
还有一个问题,为什么不使用对象属性
class Person extends Model {
protected $name
protected $email
public function getName() {
return $this->name;
}
public function getEmail() {
return $this->email;
}
}
我的意见是选择您喜欢的,使用它们都不会带来性能损失或性能提升。您最好为数据处理节省性能 对于我来说,我使用对象属性,当您查看类时,它看起来很清楚,用于存储这些默认属性,如果您想覆盖它们,那么使用以下漂亮的语法:
array()+array()
使用属性包含在“使用变量”选项中,其中$this->fields用于将字段名称数组存储为键,将规则数组存储为值。对不起,我的错误,我的意思是使用单个属性
$person->name
$person->email