2 回答
TA贡献2051条经验 获得超10个赞
如果您打算使用这种方法,我认为将该值保存在私有属性中而不是函数中的静态变量中更有意义。毕竟,它确实是对象的属性,尽管是派生属性。
final class A
{
private const VALUES = [/*long array*/];
private $a; // initialized in constructor, immutable afterwards
private $safe;
public function isSafe(): bool
{
return $this->safe ?? $this->safe = \in_array($this->a, self::VALUES, true);
}
}
这也将避免在您的问题的评论中提到的@Turtlefight问题。(在这里引用它,因为评论是无常的。)
ìsSafe()当您有多个 A 类实例时,该函数将无法正常工作。(只有第一次调用ìsSafe()才会返回正确的结果)。之后 A 类的所有实例都将返回相同的值isSafe()
TA贡献1804条经验 获得超3个赞
你的例子很简单,它不能证明使用这种缓冲是合理的。您要做的是在遇到任何性能问题之前优化代码。
使用 本身没有任何问题static
,但它增加了代码的复杂性,几乎没有任何实际结果。但是,如果in_array
您没有进行数据库操作、文件读取、Web 服务调用,或者如果您在循环中一遍又一遍地调用此方法,那么缓存结果可能是一个好主意。但是,您需要确保每个方法调用的缓冲值始终相同,或者有一种方法可以使缓冲区无效。
“应该在构造函数中已经发生了“缓存”吗?”
不。您应该始终致力于使您的代码尽可能懒惰。在isSafe()
实际请求的第一次调用时评估结果,而不是在构造函数中过早地进行。
- 2 回答
- 0 关注
- 138 浏览
添加回答
举报