2

以下のコードを考えてみてください。Lynda.comはこのようなデータベースクラスを作成すると考えていました。私の質問は、インスタンスを静的プロパティに格納する代わりに、データベースの静的メソッドを完全に作成しないのはなぜですか?

<?php
class Database {

  private $conn;
  private static $init;

  public function __construct() {
     $this->conn = new mysqli('localhost','root','root','mydb');
  }

  public static function getInstance() {
     self::$init = new self();
     return self::$init;
  }

}

$db = Database::getInstance();

?>
4

3 に答える 3

2

シングルトンを使用する場合は、__construct()を保護する必要があります

class DB
{
  private static $instance;

  private function __construct($args)
  {
    // do some
  }

  public static function getInstance()
  {
    // get instance
  }
}

$query = 'SELECT etc...';
$stmt = DB::getInstance()->prepare($query);

私はこのパターンをDBクラスで使用しています。ただし、複数の接続がある場合は、すべきではありません。シングルトンを使用します。

于 2012-11-27T15:25:23.430 に答える
1

私の推測では、あなたが投稿したコードは、シングルトンであることが意図されているように見えるため、次のように意図されていたと思います。getInstance()メソッドを変更しただけです。

class Database {

  private $conn;
  private static $init;

  public function __construct() {
     $this->conn = new mysqli('localhost','root','root','mydb');
  }

  public static function getInstance() {
     if (is_null(self::$init)) {
         self::$init = new self();
     }
     return self::$init;
  }

}

$db = Database::getInstance();

これにより、静的インスタンス変数が使用される理由の混乱が解消されるはずです。

これがシングルトンであることが意図されていなかった場合、「なぜ静的メソッドを使用しなかったのか」という質問には、「必要がある」という答えが必要です。

于 2012-11-25T18:44:48.010 に答える
0

明確にするために、$db静的メソッドを呼び出すことによってインスタンス化されるデータベースオブジェクトgetInstance()です。

データベースの静的メソッドを完全に作成してみませんか?

静的メソッドはクラス内で定義されますが、クラスをインスタンス化せずに呼び出すことができます。つまり、オブジェクトをインスタンス化せずにinを呼び出すことができるため、静的メソッドはクラスに属します。

Databaseクラスにメソッドを追加して、必要に応じてデータベースと対話できます。

于 2012-11-25T07:07:34.210 に答える