2011-02-10 11 views
0

私はOOP世界で私の最初のステップを作ります。
多くの進行中のmySQL接続を同時に開いているとパフォーマンスが致命的になることがあるので、これを考慮に入れたデータベースクラスを作成することをお勧めします。PHP OOP:データベースクラスを作成する

$this->session->write(...);は、毎回新しいmySQL接続を開くことになりますか? これは、mySQLの「永続的接続」機能までですか?

ここでは、コードです:

abstract class database { 
    function __construct() { 
     //mysql_connect() 
    } 
} 

class session extends database { 
    function write() { 
     // mysql_query(--.) 
    } 
} 

答えて

1

セッションハンドラは特殊な種類のデータベースですか。 ではなくなので、継承を使用しないでください(の関係です)。あなたが組成物を使用する必要がありますので、セッションハンドラデータベースを使用しています(関係を持っている):

class Session { 
    protected $db; 

    public function __construct(DB $db) { 
     $this->db = $db; 
    } 

    public function write() { 
     $this->db->query(...); 
    } 
} 


$db = new DB(...); 
$session = new Session($db); 

また、mysql_*()機能を使用しないでください。はるかに強力なものを使用するPDO。あなたの質問に戻って


... mysql_connect()は、新しいDatabaseオブジェクトを作成するたびに実行されます。しかし、この場合、SessionはタイプDatabaseのオブジェクトなので、new Database()またはnew Session()と書くたびに、コンストラクタが呼び出されるため、mysql_connect()も呼び出されます。

PS。 mysql_connect() functionは、指定された接続がすでに存在する場合、新しい接続を作成しません。詳細は、この関数の第4引数を参照してください。

+0

こんにちはCrozin、あなたの例のようにするのは良い方法ですが、新しいセッション($ db);の '$ db'変数は自分のコードで一度しか設定されていないので、読み込む必要はありません毎回データベースクラスに依存するすべてのクラス?素晴らしい写真btw :) – Industrial

+0

また、これはhttp://stackoverflow.com/questions/1716652/database-and-oop-practices-in-php/1716953#1716953これに対する解決策ですか? (シングルトンパターン) – Industrial

+0

シングルトンはクールで高速な解決策に見えるかもしれませんが、ここで使用するのは恐ろしい考えです。ここでは、あなたは[dependecny injection](http://www.google.com/search?client=opera&rls=en&q=dependency+injection&sourceid=opera&ie=utf-8&oe=utf-8)を扱っています。依存関係を手動で過敏または判読不能にする場合は、[DIC](http://www.google.com/search?hl=en&safe=off&client=opera&hs=ylG&rls=en&q=dependency+injection+container&aq=f&aqi=g4g-m5&aql= &oq =) – Crozin

0

なぜ

class database { 
    function __construct() { 
     //mysql_connect() 
    } 
    function write() { 
     //query the DB 
    } 
} 

私は、構文のか分からないが、私はOOPのPHPをしません。とにかく、上の構造では、新しい接続が各 "セッション"インスタンスに対して開かれるので、 "セッション"のインスタンスを1つだけ作成すると仮定して、データベース接続の負荷を開放しません。

+0

こんにちは - 私の 'write()'メソッドを呼び出す必要があるたびに、あなたの例では新しい接続が開かれませんでしたか? – Industrial

1

以前のmysql接続が作成されていない場合のみ、mysql_queryは新しい接続を作成します。それ以外の場合は、指定した接続か、mysql_connectで最後に開かれた接続を使用します。 http://php.net/manual/en/function.mysql-query.php