建议在PHP中只设置一次变量的方法

时间:2016-02-06 02:45:55

标签: php

用例如下: 我有一个变量$roles,我需要运行数据库查询来设置它的值。 我班上的一些方法需要这个$roles而有些方法不需要它,所以在构造函数中实例化它不是一个选项。

问题是,只有一次设置其值的最优雅方法是什么,因此需要此变量的方法不需要检查该值是否已设置并立即使用它。

我想到了两个完成它的选择,但是他们两个都感觉不自然。

选项1(更多程序方式):

class DoSomething {
    public function getRoles() {
        static $roles;
        if (!isset($roles)) {
            $roles = do_query_to_the_db_and_give_me_the_roles();
        }
        return $roles;
    }

    public function doX() {
        $roles = $this->getRoles();
    }
}

选项2 :(更多OOP方式)

class DoSomething {
    private $roles;

    public function setRoles() {
        $this->roles = do_query_to_the_db_and_give_me_the_roles();
    }

    public function getRoles() {
        if (!isset($this->roles)) {
            $this->setRoles();
        }
        return $this->roles;
    }

    public function doX() {
        $roles = $this->getRoles();
    }
}

我很高兴听到其他方法。 感谢。

3 个答案:

答案 0 :(得分:0)

如果你想获得边际性能增益,你的类可以扩展或装饰你正在使用的任何Cache,并使静态成为类属性,如下所示:

class Roles {

    private static $roles = [];
    private $cache;

    function __construct(Cache $cache) {
        $this->cache = $cache;
    }

    function getRoles() { 
        if (!self::$roles) { 
            if(!self::$roles = $this->cache->get('roles')) { 
                self:$roles = do_db_query(); 
                $this->cache->set('roles', self::$roles);
            }
        } 
        return self::$roles;
    }
}

$roles = (new Roles(new Cache))->getRoles();

答案 1 :(得分:0)

无论哪种方式都没问题。如果您担心性能,可以通过memcache缓存角色一段时间并经常刷新。

答案 2 :(得分:0)

创作中的角色?您可以传入缓存的角色。或角色服务。

class DoSomething
{
    private $roles;

    public function __construct($roles)
    {
         $this->roles = $roles
    }
}