用例如下:
我有一个变量$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();
}
}
我很高兴听到其他方法。 感谢。
答案 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
}
}