Php 类型3:Extbase模型中的性能

Php 类型3:Extbase模型中的性能,php,performance,typo3,extbase,Php,Performance,Typo3,Extbase,假设我有一个具有以下属性的模型: /** * @var array */ protected $myProperty; 此属性没有数据库字段,此属性的数据是从其他地方检索的: /** * @return array */ public function getMyProperty() { return getDataFromSomewhere(); } 我在这里看到的问题是,如果我不止一次使用这个属性,函数就会被调用多次。如果此函数使用mysql连接从不同的表检索数据,或者执

假设我有一个具有以下属性的模型:

/**
 * @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;
}

我知道我可以使用缓存框架缓存函数“GetDataFrom某地”返回的值,但我正在寻找一个更简单的解决方案。

您可以让getter方法执行
返回$this->myProperty??($this->myProperty=getdatafromwhere())。然后,如果值为null,则在返回值之前填充本地属性-当然,您可以确保属性初始化为。

您可以让getter方法执行
返回$this->myProperty??($this->myProperty=getdatafromwhere())。然后在返回值(如果值为null)之前填充本地属性,您当然要确保属性初始化为。

您提出的getter方法的第二个变体是一个好主意,通常称为“延迟加载”。只有在访问字段
myProperty
时,该字段才会填充数据。另一方面,如果从未调用getter方法,则根本不需要加载数据


您可以选择其他编码样式,如使用或,但方案是相同的。您可以。

您提出的getter方法的第二个变体是一个好主意,通常称为“延迟加载”。只有在访问字段
myProperty
时,该字段才会填充数据。另一方面,如果从未调用getter方法,则根本不需要加载数据


您可以选择其他编码样式,如使用或,但方案是相同的。您可以。

完全不同的方法是使用cronjob进行抓取和计算,并将渲染值写入数据库列。完全不同的方法是使用cronjob进行抓取和计算,并将渲染值写入数据库列。这只是我的getter方法的一个较短形式,正确的?我仍然更喜欢我的getter,因为我将属性与NULL(0,-1,false等可能是该属性的有效值)进行比较,并且我认为最好使用setter方法。
??
操作符称为NULL coalesce操作符,因为它仅在变量完全为NULL时触发“else”部分(不是falsey,不是空的,而是null)。它不需要编写if-then语句就可以完成您需要它做的事情。只保留getter方法一行。关于调用setter方法,我认为让getter方法调用setter方法是不正确的逻辑。您实际上并没有设置属性,而是在“解冻”因此,它是不调用方法的内部操作。这只是我的getter方法的一个较短形式,对吗?我仍然更喜欢我的getter,因为我将属性与NULL进行比较(0,-1,false等可能是该属性的有效值)我认为最好使用setter方法。
??
操作符被称为null coalesce操作符,因为它只在变量完全为null(不是false,不是空,而是null)时触发“else”部分。它不必编写if-then语句即可完成所需的操作。只保留getter方法一行。关于调用setter方法,在我看来,让getter方法调用setter方法是不正确的逻辑。您并不是在实际设置属性,而是在“解冻”因此,不调用方法的内部操作。