以这种方式使用Ghost Lazy Loading模式有什么缺点吗?

时间:2014-01-11 23:26:56

标签: php class pdo wrapper

关于重复投票:这个问题是关于这种方法的缺点,而不是如何使这项工作;您可以通过这种方式看到它:该问题询问如何做某事并且答案说有用的东西,但是,我会问答案的缺点。

TL; DR:稍后使用这个包装器类会遇到任何技术难题吗?为什么我以前没见过这样的东西?

我最近一直在试验学习技术进行性能分析,我发现创建PDO实例是一个可以优化的地方(~5ms)。我不需要在每个调用中使用它,但是我在我的代码结构的每次调用中创建它。所以,我刚刚开始上课:

<?php
namespace Library;

// Wrapper for \PDO. It only creates the rather expensive instance when needed.
// Use it exactly as you'd use the normal PDO object, except for the creation.
// In that case simply do "new \Library\PDO($args);" with the normal args
class PDO
  {
  // The actual instance of PDO
  private $db;

  public function __construct() {
    $this->args = func_get_args();
    }

  public function __call($method, $args)
    {
    if (empty($this->db))
      {
      $Ref = new \ReflectionClass('\PDO');
      $this->db = $Ref->newInstanceArgs($this->args);
      }

    return call_user_func_array(array($this->db, $method), $args);
    }
  }

要调用它,您只需修改此行:

$DB = new \Library\PDO(/* normal arguments */);

如果您将其用于(\Library\PDO $DB),则提示类型。

它完美无瑕。当不使用PDO对象时它也快速(~0.2ms),并且在使用它时仅引入~0.2ms的延迟(完全可以忽略不计)。现在,我还在学习正确的OOP,名称空间和通用代码结构,所以我认为我还没有足够的资格来回答我自己的问题:

稍后使用这个包装器类会遇到任何技术难题吗?为什么我以前没见过这样的东西?因此,为什么这不是更普遍甚至默认的PDO行为?

注意:我打算通过添加更多方法来进一步扩展它。

1 个答案:

答案 0 :(得分:2)

回答你的问题:这没有任何问题。这是一种常见的优化模式,称为lazy loading,正如您在评论中所提到的那样。

虽然它可以用不同于你在这里完成的方式实现,但你的方法看起来对我很好。