TYPO3:Extbase 模型中的性能
TYPO3: Performance in Extbase Model
假设我有一个 属性:
的模型
/**
* @var array
*/
protected $myProperty;
此 属性 没有数据库字段,此 属性 的数据是从其他地方检索的:
/**
* @return array
*/
public function getMyProperty() {
return getDataFromSomewhere();
}
我在这里看到的问题是,如果我多次使用此 属性,该函数将被调用多次。如果此函数检索数据,例如来自不同的 table 和 mysql 加入或做一些广泛的计算,这是低效的。
我在这里有什么可能性?增强getter一点点?
/**
* @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 方法的第二种变体是个好主意,通常称为 "lazy loading"。字段 myProperty
仅在访问时填充数据。另一方面,如果从未调用 getter 方法,则根本不需要加载数据。
您可以选择其他编码风格,例如使用 the ternary- or null coalescing operators, but the scheme is the same. You can find more examples of your idea on the web。
假设我有一个 属性:
的模型/**
* @var array
*/
protected $myProperty;
此 属性 没有数据库字段,此 属性 的数据是从其他地方检索的:
/**
* @return array
*/
public function getMyProperty() {
return getDataFromSomewhere();
}
我在这里看到的问题是,如果我多次使用此 属性,该函数将被调用多次。如果此函数检索数据,例如来自不同的 table 和 mysql 加入或做一些广泛的计算,这是低效的。
我在这里有什么可能性?增强getter一点点?
/**
* @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 方法的第二种变体是个好主意,通常称为 "lazy loading"。字段 myProperty
仅在访问时填充数据。另一方面,如果从未调用 getter 方法,则根本不需要加载数据。
您可以选择其他编码风格,例如使用 the ternary- or null coalescing operators, but the scheme is the same. You can find more examples of your idea on the web。