假设我有一个带有属性的模型:
/**
* @var array
*/
protected $myProperty;
此属性没有数据库字段,此属性的数据是从其他地方检索的:
/**
* @return array
*/
public function getMyProperty() {
return getDataFromSomewhere();
}
我在这里看到的问题是,如果我多次使用此属性,则会多次调用该函数。如果此函数检索数据,例如从具有 mysql 连接的不同表中检索数据或进行一些广泛的计算,则这是不高性能的。
我在这里有什么可能性?稍微增强一下吸气剂?
/**
* @return array
*/
public function getMyProperty() {
if($this->myProperty === NULL) {
$this->setMyProperty(getDataFromSomewhere());
}
return $this->myProperty;
}
我知道我可以使用缓存框架并缓存函数"getDataFromSomewhere"返回的值,但我正在寻找更简单的解决方案。
你可以让getter方法做return $this->myProperty ?? ($this->myProperty = getDataFromSomewhere());
。然后,如果值为 null,它会在返回值之前填充本地属性 - 当然,请确保该属性被初始化为。
您提出的 getter 方法的第二个变体是个好主意,通常称为"延迟加载"。字段myProperty
仅在访问时填充数据。另一方面,如果从不调用 getter 方法,则根本不需要加载数据。
您可以选择另一种编码样式,例如使用三元或空合并运算符,但方案是相同的。您可以在网络上找到更多您的想法示例。