2

クラスのインスタンスをクラス内のプロパティに保存して、複数の初期化を無効にしました(意味があることを願っています)。

こんな風に見える:

class baseClass
{
    public $db;

    public function __construct()
    {
         $this->db =  new dbClass(); // this class is just a query class
    }   

}


class page  extends baseClass {

   public function __construct()
   {
           parent::__construct();
       }

       public function index()
       {
         // this works very fine and return result what i want //
         $user = $this->db->query('blah blah');


         // my problem is when i use the same property ($this->db) which 
         //contains the dbClass()

         $mesg = $this->db->query('blah blah');

         // the result of both query merge together
         // i think i figured out whats the problem here but i dont know what to do
         // i think i need to reset or the destroy the instance of $this->db 
         // and back it to null values


         // or when i put print_r($this->db) after my first query (the  $users )
         // it display the previous property i set (ofcourse)
         // what i want is.. every time i use the $this->db, i want 
         // it like the first time i use it, or fresh.
         // is there any way ? 
         // thanks for the help experts ;) 


       }
}
4

4 に答える 4

2

問題はdbClass実装にあります。2 つのクエリを互いに分離しておくことはできないようです。

のコードを読んで、dbClass2 つのクエリを別々に実行する方法を見つけてください。これが不可能な場合は、別のクエリを開始する前に、少なくとも 1 つのクエリ結果を終了できる必要があります。

于 2012-06-20T08:23:36.813 に答える
1

これは、シングルトン (アンチ) デザイン パターンの古典的な例です。

http://en.wikipedia.org/wiki/Singleton_pattern

http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html

乾杯

于 2012-06-20T08:13:26.670 に答える
0

シングルトンパターンをお探しですか?


編集

dbClassにシングルトンを実装する場合は、を呼び出さないでくださいnew dbClass()。代わりに、dbClassコンストラクターをプライベートまたは保護しdbClass::get()、インスタンスが既に存在するかどうかを確認する静的メソッド(または同様のメソッド)を用意します。

于 2012-06-20T08:14:59.260 に答える
0

一般的なコンセンサスは、シングルトン パターンは使用されるべきではなく、それは反パターンであるということです。stackoverflow を見回すと、上位投票の回答にシングルトン デザイン パターンが関係しているという多くの関連する質問があります。

これは、クラスがデータベース接続を必要とする場合、依存性注入を使用して、コンストラクターを介してクラスに接続を渡す方法です。

ページ クラスは baseClass を拡張するため、parent::__construct を呼び出す必要はありません。インタープリターは逆方向に動作し、baseClass のコンストラクトをページ クラスに含めるためです。

そう:

<?php 
//Your abstract baseClass this class will be invoked by any clas that 
//extends it
Abstract Class baseClass {
    protected $db;

    function __construct(PDO $db) {
        $this->db = $db;
        //do your inital setup
    }

    //all controllers must contain an index method
    abstract function index();
}

//Your page controller class that is invoked by your router
class page extends baseClass {

    //The parents class's __construct is inherited

    public function index(){
        $this->user = $this->db->query('SELECT username FROM testing')->fetchAll(PDO::FETCH_ASSOC);
        $this->other = $this->db->query('SELECT somthing FROM testing')->fetchAll(PDO::FETCH_ASSOC);
    }
}



try{
    $pdo = new PDO("mysql:host=localhost;dbname=test_db", 'root', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch (Exception $e){
    die('Cannot connect to mySQL server.');
}

//This below will be controlled by your router class

//Pass the PDO object to the constructor of baseClass
$page = new page($pdo);
$page->index();

print_r($page);
/*page Object
(
    [db:protected] => PDO Object
        (
        )

    [user] => Array
        (
            [0] => Array
                (
                    [username] => test
                )

            [1] => Array
                (
                    [username] => dasdadsa
                )

        )

    [other] => Array
        (
            [0] => Array
                (
                    [somthing] => test
                )

            [1] => Array
                (
                    [somthing] => eqweqwe
                )

        )

)*/

?>
于 2012-06-20T09:12:19.540 に答える