关于重复投票:这个问题是关于这种方法的缺点,而不是如何做到这一点;你可以通过这种方式看到它:这个问题问如何做某事,答案说有用,但是,我问了答案的缺点。以这种方式使用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行为?
注:我打算通过增加更多的方法来扩展它。
对我来说看起来像一个基本的单例模式,但是使用反射来实例化你的工厂模式 –
@MarkBaker,它不完全是工厂模式,因为只有一个类正在创建。 –
@MarkBaker大声笑,评论的激进变化很有趣。它也不是单身人士,因为我传递它(不是全局的),并且允许存在多个'\ Library \ PDO'实例(而不是** single ** ton)。 –