2013-02-15 118 views
1

目前我在做这个:最佳方式

function __construct($mysqli_connection) 
{ 
    if(! empty($mysqli_connection) && is_object($mysqli_connection) && ! $mysqli_connection->connect_error) 
    { 
     //Make the $mysqli universal to the class equal the given connection 
     $this->mysqli = $mysqli_connection; 
    } 
    else 
    { 
     die("An invalid MySQLi connection was given.\n"); 
    } 

}//function __construct 

并与启动类:

new className($mysqli); 

它工作正常,但在我看来是:

  • 即额外的代码是不必要
  • 用于占据库MySQLi RESO存储器urce最终翻了一番(一个在班级的内存中,但主代码中仍然有一个)

我的上述观点是否正确,如果有的话,是否有更好的方式来使用MySQLi资源在班级里面?上述方法是我从搜索中找到的唯一方法。

+0

创建数据库包装器(或使用现有的包装器)并传递它而不是原始mysqli连接。好处是您可以随时更改驱动程序(取决于接口),而无需更改所有代码。 – Supericy 2013-02-15 04:57:10

回答

3

首先,你的代码可以简化为:

private $mysqli; 

function __construct(mysqli $conn) 
{ 
    $this->mysqli = $conn; 
} 

您的类不应该担心是否建立了连接,它应该可以假定它是。另外,键入hints help可以指示在构造函数被调用时期望什么类。

其次,mysqli对象在另一个对象内使用时不会重复;相反,其引用计数增加。一旦计数下降到零,对象被删除。如果一个对象总是被复制,那么执行依赖注入会变得非常昂贵。

+0

也可以注意到这是依赖注入设计模式的实现。 – nickb 2013-02-15 05:02:24

+0

感谢您的信息。这让我感到惊讶,因为像'function __construct($ int){$ this-> integer = $ int; }'会存储整数的第二个副本。你能解释一下/指出我解释一个物体有什么不同吗?谢谢 – stackunderflow 2013-02-15 05:12:13

+0

确定您的编辑有意义。标记为已接受。 – stackunderflow 2013-02-15 05:25:23