对于所有共享相同数据库的不同对象,我有几个类。我希望这些对象共享相同的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数据库的实际连接是否已经建立,如果还没有构建它呢?
发布于 2015-12-01 23:05:07
最后,我从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(...)https://stackoverflow.com/questions/34025878
复制相似问题