gpt4 book ai didi

php - 用于连接、关闭、保持打开状态的 MySQLi 类模式?

转载 作者:行者123 更新时间:2023-11-29 04:11:52 24 4
gpt4 key购买 nike

我想知道创建一个像下面这样的类是否是一个好的做法。

所以每次我需要做一些工作时,我都会使用 self::$mysqli 对象,并且连接只会在 __desctruct() 上关闭。另外,由于 $mysqli 被声明为静态的,因此扩展该类仍将仅保持一个连接。

这样我就只有一个连接认为脚本

class db {
protected static $mysqli;

function __contruct(){
$this->mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
// DB_HOST, DB_USER, DB_PASS, DB_DATABASE defined elsewhere
}

function __destruct(){
$this->mysqli->close();
}
}

我想知道您对此的见解。

最佳答案

I would like to know if creating a class like the one below would be a good practice.

我认为这不是好的做法。这尤其是出于一个原因:您描述了您认为需要它的原因:每个请求只有一个连接。

您无需编写任何代码。 mysqli 内置了一个不错的功能,即默认连接。每次创建新实例时,它都会从 ini 设置(配置)中选择数据库连接参数:

$db = new mysqli;

由于脚本完成后所有数据库连接都会关闭,所以根本不需要关心太多。您唯一需要做的就是实例化一次连接并将变量传递给所有需要该 mysqli 对象的代码。

另一个不好的做法是你在这里引入了一个 Singleton Doc,比如:

class MysqliSingleton extends mysqli
{
private static $instance;
/**
* @return MysqliSingleton
*/
public function getInstance()
{
if (NULL === self::$instance)
self::$instance = new self();
return self::$instance;
}
private function __construct()
{
}
public function __clone()
{
throw new RuntimeException('Clone is not allowed.');
}
public function __wakeup()
{
throw new RuntimeException('Unserializing is not allowed.');
}
}

它会像这样工作:

$mysqli = MysqliSingleton::getInstance();

并且总是会返回一个 mysqli 实例,这可能就是您正在寻找的。然而,单例 被认为是有害的,因为它们会引入很多问题,请参阅相关问题 Who needs singletons?

您自己创建一个包含数据库实例的变量会更容易。您还可以封装某种延迟加载,以防您的应用程序并不总是需要 mysqli 连接,例如使用一个非常简单的上下文类:

interface ContextMysqli
{
/**
* @return mysqli
*/
public function getMysqli();
}

class Context implements ContextMysqli
{
private $mysqli;
public function getMysqli()
{
$this->mysqli || $this->mysqli = new mysqli();
return $this->mysqli;
}
}

当您的脚本开始时,只需实例化您的上下文并将其传递到您需要它的代码的每个部分:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
$mysqli = $context->getMysqli();
...
}

这个建议也可能有点短视,但它比单例要好,而且不会引入太多麻烦。好处是您已经封装了创建 mysqli 对象时的逻辑,而无需单例。您的代码现在独立于全局或静态上下文。

关于php - 用于连接、关闭、保持打开状态的 MySQLi 类模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com