2014-01-11 18 views
1

关于重复投票:这个问题是关于这种方法的缺点,而不是如何做到这一点;你可以通过这种方式看到它:这个问题问如何做某事,答案说有用,但是,我问了答案的缺点。以这种方式使用Ghost Lazy Loading模式有什么不足吗?

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的延迟(完全可以忽略)。现在,我仍然在学习正确的面向对象,命名空间和一般的代码结构,所以我认为我没有足够的资格回答我自己的问题:

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

注:我打算通过增加更多的方法来扩展它。

+1

对我来说看起来像一个基本的单例模式,但是使用反射来实例化你的工厂模式 –

+0

@MarkBaker,它不完全是工厂模式,因为只有一个类正在创建。 –

+0

@MarkBaker大声笑,评论的激进变化很有趣。它也不是单身人士,因为我传递它(不是全局的),并且允许存在多个'\ Library \ PDO'实例(而不是** single ** ton)。 –

回答

2

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

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

+0

)我说惰性负载认为它通常只是通过不做任何事情来完成,而不是像我那样把*问题*给予另一个类,我实际上并没有意识到这是延迟加载直到在阅读[维基百科的文章部分](https://en.wikipedia.org/wiki/Lazy_loading#Ghost)和[This SO answer](http://stackoverflow.com/a/9911787)之后,我做了什么实际上被称为Ghost。 –

+0

以前没有听说过“幽灵”,但是,是的,这确实是你正在做的鬼魂:) –