【问题标题】:Best way to use MySQLi inside a class在类中使用 MySQLi 的最佳方式
【发布时间】:2013-02-15 04:52:20
【问题描述】:

目前我正在这样做:

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 资源的内存最终翻了一番(一个在类的内存中,但在主代码中还有一个)

我的上述观点是否属实,如果是的话,有没有更好的方法从类中使用 MySQLi 资源?以上方法是我通过搜索找到的唯一方法。

【问题讨论】:

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

标签: php class mysqli


【解决方案1】:

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

private $mysqli;

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

您的班级不必担心连接是否已建立,它应该能够假定已建立。此外,类型提示有助于指示调用构造函数时预期的类。

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

【讨论】:

  • 还可以注意到这是一个依赖注入设计模式的实现。
  • 感谢您的信息。令我惊讶的是,情况确实如此——因为像function __construct($int){ $this->integer = $int; } 这样的东西会存储整数的第二个副本。你能解释一下/指出一些东西来解释一个物体有什么不同吗?谢谢
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2019-11-19
  • 2011-05-26
  • 2013-02-15
相关资源
最近更新 更多