2017-02-14 70 views
0

我有一个PHP单例模式的问题,特别是关于实现一个mysqli包装。PHP单例模式为mysqli包装

class DbHandler 
{ 

    private $mysqli; 
    private $query; 
    private $results = array(); 
    private $numRows = 0; 

    public static $instance; 

    public static function getInstance() { 
     if (!isset(self::$instance)) { 
      self::$instance = new DbHandler; 
     } 
     return self::$instance; 
    } 

    public function __construct() { 
     $this->mysqli = new mysqli("127.0.0.1", "root", "", "improved_portal"); 
     if ($this->mysqli->connect_error) { 
      die($this->mysqli->connect_error); 
     } 
    } 

    public function query($statement) { 
     if ($this->query = $this->mysqli->query($statement)) { 
      foreach ($this->query as $value) { 
       $this->results[] = $value; 
      } 
      $this->numRows = $this->query->num_rows; 
      return $this; 
     } 
    } 

    public function getResults() { 
     return $this->results; 
    } 

    public function getNumRows() { 
     return $this->numRows; 
    } 

} 

当我去利用其他对象中的类时,我似乎对结果有问题。而不是每次创建一个新的对象具有唯一的$结果,似乎我正在创建初始对象的副本。例如...

$object1 = DbHandler::getInstance(); 
$object1->query("SELECT * FROM table_a")->getResults(); 

$object2 = DbHandler::getInstance(); 
$object2->query("SELECT * FROM table_b")->getResults(); 

$ object2包含两个查询的结果,这显然不是我所期望的。查询函数清楚地循环遍历第二个查询的结果,并将它们附加到第一个对象的$ results属性中。我应该如何调用DbHandler类的新实例,以便每个对象都包含唯一属性?

+0

你应该让你的'__construct()'方法和'$ instance'财产私有的,只能使用你的类的静态'的getInstance()'方法来创建一个对象。 –

+0

'$ this-> results'每次都必须__cleared__ –

回答

0

首先 - 这不是单身模式。当你的__construct是公开的,我可以做到这一点:

$conn1 = new DbHandler(); 
$conn2 = new DbHandler(); 
$conn3 = new DbHandler(); 

为了防止这一点 - __construct必须受到保护/私有。

第二 - 每次您从同一个对象调用query()时,此函数会将结果添加到results属性中。而这results属性用于所有查询而不清除。当然,它会保持以前的所有值。功能应该被改写,如:

public function query($statement) { 
    // clear result from previous function call 
    $this->results = array(); 

    if ($this->query = $this->mysqli->query($statement)) { 
     foreach ($this->query as $value) { 
      $this->results[] = $value; 
     } 
     $this->numRows = $this->query->num_rows; 
     return $this; 
    } 
}