我在为多个类使用的mysqli对象构建单例类时遇到了一些问题。我最初得到的错误Access to undeclared static property: database::$DBH
我不理解,因为属性不是静态的。我推测这可能是因为phpversion()
返回了5.2.17,并且我发现单例模式只能使用版本>5.3来完成?(可能完全错了)。我查看了一下,发现我的服务器提供商允许我选择可以使用的PHP版本。我目前选择了5.3.3,但同样的错误。要么我必须等待服务器"刷新"它的设置。或者我在5.3.3版上确实有一个合法的错误
class database{
private$DBH;
private static$singleton;
protected function __construct(){
$this->$DBH=new mysqli(HOST,USER,PASSWORD,DATABASE);
//also tried self::$DBH;
//if(mysqli_connect_errno())print_r(mysqli_connect_error());
}
public static function instance(){
if(!(self::$singleton instanceof self))self::$singleton=new self();
return self::$singleton;
}
public static function get(){
return self::instance()->$DBH;
}
private function __wake(){}
private function __clone(){}
}
class test{
public function __construct(){
$get=database::get()->prepare('SELECT column FROM table');
$get->execute();
$get->bind_result($col);
while($get->fetch()){
print($col."'n");
}
//$get->close(); not required.
}
}
$t=new test();
我想达到的目标还有别的选择吗?(要与多个类一起使用的单个mysqli对象,也是标准对象的"安全"方法。)
我应该用mysqli扩展我的数据库类吗?
我应该只使用PDO吗?
或者再好一次!获得一个更好的服务器提供商,他们的服务是最新的。
不要让它过于复杂,只需扩展MySQLi
类,并为其添加一些方法。MySQLi
本身就是一个连接器,为什么要在连接器中存储另一个连接器?
class Database extends MySQLi {
private static $instance = null ;
private function __construct($host, $user, $password, $database){
parent::__construct($host, $user, $password, $database);
}
public static function getInstance(){
if (self::$instance == null){
self::$instance = new self(HOST, USER, PASSWORD, DATABASE);
}
return self::$instance ;
}
}
$db = Database::getInstance();
$result = $db->query("SELECT 1 FROM table");
一些提示:
通过
$object->property
访问Non-static
属性Static
属性通过:self::$property
或Database::$property
或static::$property
访问PDO
的使用非常好,因为您可以绑定值,从而保护数据库不受注入的影响。作为选项-扩展PDO
类
您需要从$this->$DBH=new mysqli
和return self::instance()->$DBH;
中的$DBH
中删除$
,因为您已经使用$this->DBH
引用了它的当前对象
class database{
private $DBH;
private static $singleton;
protected function __construct(){
$this->DBH=new mysqli(HOST,USER,PASSWORD,DATABASE);
//also tried self::$DBH;
//if(mysqli_connect_errno())print_r(mysqli_connect_error());
}
public static function instance(){
if(!(self::$singleton instanceof self)) self::$singleton=new self();
return self::$singleton;
}
public static function get(){
return self::instance()->DBH;
}
private function __wake(){}
private function __clone(){}
}
class test{
public function __construct(){
$get=database::get()->prepare('SELECT column FROM table');
$get->execute();
$get->bind_result($col);
while($get->fetch()){
print($col."'n");
}
//$get->close(); not required.
}
}
$t=new test();