0
<?
class DbConn {
    const DB_HOST = 'localhost';
    const DB_USER = 'root';
    const DB_PASS = 'pw';
    const DB_NAME = 'db';

    static private $instance = NULL;
    private $_db;

    static function getInstance()
    {
      if (self::$instance == NULL)
      {
        self::$instance = new DbConn();
        if(mysqli_connect_errno()) {
            throw new Exception("Database connection failed: ".mysqli_connect_error());
        }
      }
      return self::$instance;
    }

    private function __construct()
    {
        $this->_db = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME) or die('Couldnt connect');
    }

    private function __clone() {}

}

DbConn::getInstance()->query();

?>

シングルトンパターンを学習しているだけで、シングルトンを使用して独自のDBConnectクラスを作成しようとしましたが、実行しようとすると、DbConn :: getInstance()-> query()を呼び出すときにエラーが発生します。 ; 未定義のメソッドDbConn::query()を呼び出すと言っていますが、何が間違っていますか?

4

4 に答える 4

2

query()あなたはクラスのオブジェクトを呼び出していますDbConn-それはメソッドを持っていませんquery()

あなたの例では、シングルトンパターンの実装が適切です。mysqliただし、オブジェクトの関数をDbConn直接呼び出すことはできません。関数をラップ_dbするか、プライベートプロパティのゲッターを提供して、そのquery()オブジェクトを呼び出す必要があります。

于 2012-09-15T09:40:24.190 に答える
1

__construct関数の後に以下を追加してみてください

public function query($sql)
{
    return $this->_db->query($sql);
}

その後、試してみてください

DbConn::getInstance()->query("SELECT * FROM Table"); //Replace your sql
于 2012-09-15T09:53:07.243 に答える
0

必ず

  • mysqliクラスを拡張して、そのクラスのメソッドを使用します
  • または、クエリメソッドを自分で作成します。
  • または$dbを公開して使用するDbConn::getInstance()->$db->query();

なぜそれをシングルトンにするのですか?mysqliは接続プールを実行し、シングルトンにすることで何のメリットもなく複雑さが増します。

于 2012-09-15T09:43:03.470 に答える
0

私はこれでかなり新しいので、私が間違っているなら私を訂正してください。

mysqliクラスを拡張して、コンストラクターを少し変更することはできませんか?

class DbConn {

になります

class DbConn extends mysqli {


と:

$this->_db = new mysqli(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect');

になります

parent::__construct(
    self::DB_HOST, 
    self::DB_USER, 
    self::DB_PASS, 
    self::DB_NAME) or die('Couldnt connect');


今、DbConn::getInstance()->query();動作するはずです

于 2012-12-06T19:13:55.603 に答える