单例类数据库mysqli phpversion 5.2.17

时间:2014-04-14 22:20:30

标签: php class oop mysqli singleton

我遇到了一些问题,需要为一个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对象用于多个类,也是标准对象的'securer'方法。)

我应该使用mysqli扩展我的数据库类吗?

我应该使用PDO吗?

或者再次更好!获得一个更好的服务器提供商,他们的服务是最新的。

2 个答案:

答案 0 :(得分:6)

不要让它过于复杂,只需扩展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");

一些提示:

  • Non-static属性可通过$object->property

  • 访问
  • Static属性可通过以下网址访问:self::$propertyDatabase::$propertystatic::$property

  • 使用PDO非常好,因为您可以绑定值,从而保护您的数据库免于注入。作为选项 - 扩展PDO类。

答案 1 :(得分:0)

您需要从$$DBH中的$this->$DBH=new mysqli移除return self::instance()->$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();