猿问

将运行时常量值存储在函数区域设置静态变量中以加速多重调用是好还是坏的做法?

假设这种情况。您有一个带有方法的类,对于给定的实例,它始终返回相同的值(例如,由构造函数确定)。


final class A

{

    private const VALUES = [/*long array*/];


    private $a = 5; // initialized in constructor, immutable afterwards


    public function isSafe(): bool

    {

        return \in_array($this->a, self::VALUES, true);

    }

}

在函数局部静态变量中缓存它有什么缺点吗?例如像这样:


final class A

{

    private const VALUES = [/*long array*/];


    private $a = 5; // initialized in constructor, immutable afterwards


    public function isSafe(): bool

    {

        static $result = null;

        return $result ?? $result = \in_array($this->a, self::VALUES, true);

    }

}

这种方法的优缺点是什么?有替代品吗?这被认为是好、坏或任何做法(如果是:为什么)?或者,例如,“缓存”应该已经在构造函数中发生了吗?


长风秋雁
浏览 139回答 2
2回答

侃侃无极

如果您打算使用这种方法,我认为将该值保存在私有属性中而不是函数中的静态变量中更有意义。毕竟,它确实是对象的属性,尽管是派生属性。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()

狐的传说

你的例子很简单,它不能证明使用这种缓冲是合理的。您要做的是在遇到任何性能问题之前优化代码。使用 本身没有任何问题static,但它增加了代码的复杂性,几乎没有任何实际结果。但是,如果in_array您没有进行数据库操作、文件读取、Web 服务调用,或者如果您在循环中一遍又一遍地调用此方法,那么缓存结果可能是一个好主意。但是,您需要确保每个方法调用的缓冲值始终相同,或者有一种方法可以使缓冲区无效。“应该在构造函数中已经发生了“缓存”吗?”不。您应该始终致力于使您的代码尽可能懒惰。在isSafe()实际请求的第一次调用时评估结果,而不是在构造函数中过早地进行。
随时随地看视频慕课网APP
我要回答