首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免延迟加载中的条件语句

避免延迟加载中的条件语句
EN

Stack Overflow用户
提问于 2012-01-06 06:10:20
回答 6查看 231关注 0票数 7

为了澄清,我的意思是这样的:

代码语言:javascript
复制
class foon {
   private $barn = null;

   public function getBarn() {
      if (is_null($this->barn)) {
         $this->barn = getBarnImpl();
      }
      return $this->barn;
   }
}

当你并不总是需要getBarn,并且getBarn特别昂贵(例如,有一个DB调用)时,这就特别好了。有没有什么方法可以避免条件呢?这会占用很多空间,看起来很难看,而且看到条件句消失总是很好的。有没有其他的范例来处理这种我看不见的延迟加载?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-06 06:41:03

通过使用php的__call()魔术方法,我们可以很容易地编写一个装饰器对象来拦截所有的方法调用,并缓存返回值。

有一次我做了这样的事情:

代码语言:javascript
复制
class MethodReturnValueCache {
   protected $vals = array();
   protected $obj;
   function __construct($obj) {
       $this->obj = $obj;
   }
   function __call($meth, $args) {
       if (!array_key_exists($meth, $this->vals)) {
           $this->vals[$meth] = call_user_func_array(array($this->obj, $meth), $args);
       }
       return $this->vals[$meth];
   }
}

然后

代码语言:javascript
复制
$cachedFoon = new MethodReturnValueCache(new foon);
$cachedFoon->getBarn();
票数 2
EN

Stack Overflow用户

发布于 2012-01-06 06:14:28

我时不时地想知道这一点,但我肯定想不出一个。除非你想创建一个单独的函数来处理数组和反射属性查找。

票数 1
EN

Stack Overflow用户

发布于 2012-01-06 06:16:52

return ( $this->barn = $this->barn ? $this->barn : getBarn() );

或者php 5.3 (?)其一:

return ( $this->barn = $this->barn ?: getBarn() );

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8750575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档