关于重复投票:这个问题是关于这种方法的缺点,而不是如何使这项工作;您可以通过这种方式看到它:该问题询问如何做某事并且答案说有用的东西,但是,我会问答案的缺点。
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行为?
注意:我打算通过添加更多方法来进一步扩展它。
答案 0 :(得分:2)
回答你的问题:这没有任何问题。这是一种常见的优化模式,称为lazy loading,正如您在评论中所提到的那样。
虽然它可以用不同于你在这里完成的方式实现,但你的方法看起来对我很好。