我有几个不同对象的类,它们共享同一个数据库。我希望这些对象共享相同的MySQLi连接,因此我不必为每个对象建立连接,但并非所有命令都需要有效的MySQLi连接,所以我想在需要时设置它。 。每次调用API时连接到MySQL服务器都是我案例中资源的巨大浪费。
所以我的主要API会有这样的东西(理想):
$db = new mysqli();
$a = new objA( $db );
class objA{
private $db;
function __construct( $db ){
$this->db = $db;
}
function doSomething(){
if( !$this->db->isConnected() )
$this->db->connect( MYSQL_HOST, MYSQL_USER, MYSQL_PASS );
return $this->db->query( MY_QUERY );
}
}
因此,只有在我从API调用$a->doSomething()
时才会构建数据库连接。此设置还使我能够在完全不同的对象中使用相同的MySQL连接。
如何获得像$mysql->isConnected()
这样的函数来检查是否构建了与MySQL数据库的实际连接,如果没有则构建它?
答案 0 :(得分:0)
我最终从mysqli派生了一个名为lazyMysqli的类:
class lazyMysqli extends mysqli{
private $init;
private $mysql_host;
private $mysql_username;
private $mysql_passwd;
private $mysql_dbname;
private $mysql_port;
private $mysql_socket;
function __construct( $host = null, $username = null, $passwd = null,
$dbname = null, $port = null, $socket = null ){
$this->mysql_host = $host;
$this->mysql_username = $username;
$this->mysql_passwd = $passwd;
$this->mysql_dbname = $dbname;
$this->mysql_port = $port;
$this->mysql_socket = $socket;
$this->init = false;
}
function init(){
if( !$this->init ){
parent::__construct( $this->mysql_host, $this->mysql_username,
$this->mysql_passwd, $this->mysql_dbname,
$this->mysql_port, $this->mysql_socket );
$this->init = true;
}
return $this;
}
}
现在,我没有定义新的mysqli
,而是使用lazyMysqli
:
$db = new lazyMysqli( MYSQLHOST, MYSQLUSER, MYSQLPASS );
这将初始化所有内容,并且该对象可以传递给其他类。在对数据库执行每个实际操作之前,我调用lazyMysqli::init()
来实际设置与服务器的连接。这样我就不必浪费资源而不必在需要之前与服务器建立连接,而且我仍然能够与其他类共享mysqli对象。
init()
函数返回对象本身,因此可以冒泡:
$db->init()->query(...)