2012-03-30 22 views
2

OOPを新しくしました。もともと私は変数を定義していて、クラス内とコンストラクタの外側で値を代入していましたが、今日のJavaのOOPレッスンの後では、これは悪いスタイルだと言われており、避けるべきです。ここでPHP:データベース接続クラスコンストラクタメソッド

は、私は嘲笑アップ私の元のPHPのデータベース接続クラスです:

class DatabaseConnection { 
    private $dbHost = "localhost"; 
    private $dbUser = "root"; 
    private $dbPass = ""; 
    private $dbName = "test"; 

    function __construct() {  
     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

は大丈夫と見なさ上記ですか?または、次の方が良い方法ですか?

class DatabaseConnection { 
    private $dbHost; 
    private $dbUser; 
    private $dbPass; 
    private $dbName; 

    function __construct() { 
     $this->dbHost = "localhost"; 
     $this->dbUser = "root"; 
     $this->dbPass = ""; 
     $this->dbName = "test"; 

     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

私はOOPを正しく理解していることを確認するために何を重視する必要がありますか?

+4

すぐにOOPを忘れてみましょう。ホスト、ユーザー、パスワード、およびdbnameの値を構成ファイルに保存しないでください。 – Joni

+0

@Aaron、私の更新された答えを確認してください。あなたの設定で考慮すべき項目をいくつか追加しました。 –

+3

@JoniSalonen、どこに保管されているのですか?要点は、それらをコンストラクタのパラメータとして渡す必要があることです。 –

答えて

8

まあ、まだ実行するつもりはありません。あなたは彼らがあなたの接続のparamsと一致するように、あなたの変数を変更する必要があります。

$dbHost = "localhost"; 

は、私は通常、すべてのクラスの内部で、私のログインのparamsを入れていない

$this->dbHost = 'localhost'; 

であるべき。オブジェクトが作成されると、それらをコンストラクタに渡します。外部設定ファイルを使用して、実際にこのクラスを複数のビルドで使用することができます。 :)

更新::

わかりましたので、ここでは、動的Databaseクラスの構築に役立ついくつかの小さなOOP構成の金ナゲットです。

  • それはあなたのデータモデリングの擬似のORMのスタイルを行うことができますhttp://redbeanphp.com/をチェックしてください。インストールが非常に簡単で、あなたのデータベースを稼働させるのも簡単です。

  • http://redbeanphp.com/manual/installingは定数、テンプレートのセットアップ、共通機能のようなものが含まれている設定ファイルを作成し、バージョン管理された環境で作業するときAUTOLOADERコンフィギュレーションファイルが鍵となります。 :)

  • は抽象クラスライブラリフォルダにクラスファイルのすべてを入れてhttp://php.net/manual/en/language.oop5.abstract.php

    abstract class Database 
    { 
        public function update() 
        { 
        } 
    
        public function deactivate() 
        { 
        } 
    
        public function destroy() 
        { 
        } 
    
        //etc. 
    } 
    
    class MyAppObject extends Database 
    { 
    } 
    
  • としてあなたDatabaseクラスをビルドし、そのライブラリにあなたの設定ファイルを置きます。今、あなたの生活を楽にするために、オートローダー機能を使用して、必要な時にいつでも特定のクラスを含めることなく、クラスを生き生きとさせることができます。以下を参照してください:

    //note: this is never explicitly instantiated 
    //note: name your files like this: MyAppObject.class.php 
    function my_fancypants_autoloader($my_class_name) 
    { 
        if(preg_match("%^_(Model_)%", $my_class_name)) return; 
        require_once("$my_class_name.class.php"); 
    } 
    spl_autoload_register('my_fancypants_autoloader'); 
    
    • 今あなたがしなければならないすべてはあなたのクラスにアクセスするために、あなたの.phpファイル内の1つの設定ファイルが含まれています。正しい方向にあなたを指す

願っています!がんばろう!

0

__constructメソッドにしかそれらを使用していないので、それらをクラス属性として使用する必要はありません。後でimhoを使うためには、$connectionだけを保管しなければなりません。

これらの引数にデフォルト値を指定せず、外部から設定する方がずっと良いかもしれません。

$db = new DatabaseConnection("localhost", "user", "password", "db"); 

すでにPHPツールがたくさんありますので、それを見つけて読んでそれから学んでください。まず第一に、PDOを使用し、Javaで真であることがPHPで常に正しいとは限りません。

0

おそらく後者は良いでしょうが調整が必要です。コンストラクタにいくつかの引数、つまり接続情報を渡します。

最初の例は、データベース接続が1つしかなく、接続値をハードコーディングするのが幸いである場合にのみ便利です(そうすべきではありません)。 2番目の例では、$nameというパラメータを引数として追加すると、複数のデータベースに接続することができます:

私はOOPを初めて使用しています。もともと私は変数を定義していて、クラス内とコンストラクタの外側で値を代入していましたが、今日のJavaのOOPレッスンの後では、これは悪いスタイルだと言われており、避けるべきです。

class DatabaseConnection { 
    private $dbHost; 
    private $dbUser; 
    private $dbPass; 
    private $dbName; 

    function __construct($config) { 
     // Process the config file and dump the variables into $config 
     $this->dbHost = $config['host']; 
     $this->dbName = $config['name']; 
     $this->dbUser = $config['user']; 
     $this->dbPass = $config['pass']; 

     $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass) 
      or die("Could not connect to the database:<br />" . mysql_error()); 
     mysql_select_db($this->dbName, $connection) 
      or die("Database error:<br />" . mysql_error()); 
    } 
} 

このスタイルを使用すると、より便利なクラスになります。ここで

0

は私です、それはかなりうまく機能:

class Database 
{ 
    private static $_dbUser = 'user'; 
    private static $_dbPass = 'pwd'; 
    private static $_dbDB = 'dbname'; 
    private static $_dbHost = 'localhost'; 
    private static $_connection = NULL; 

    /** 
    * Constructor 
    * prevents new Object creation 
    */ 

    private function __construct(){ 
    } 

    /** 
    * Get Database connection 
    * 
    * @return Mysqli 
    */ 

    public static function getConnection() { 
     if (!self::$_connection) { 
    self::$_connection = @new mysqli(self::$_dbHost, self::$_dbUser, self::$_dbPass, self::$_dbDB); 

     if (self::$_connection -> connect_error) { 
      die('Connect Error: ' . self::$_connection->connect_error); 
     } 
     } 
     return self::$_connection; 
    } 
} 

__constructを空にすることによって、それがどこからインスタンス化された新しいクラスを防ぐことができます。次に、関数を静的にして、接続を取得するために必要なのはDatabase::getConnection()です。これはすべて、includeファイル内で、サーバー上のパスワードで保護されたフォルダにあり、各クラスファイルにのみ含まれています。また、別の接続を試行する前に接続が既に開いているかどうかを確認します。既に確立されている場合は、メソッドへのオープン接続を渡します。

+0

そして可能な限り(ほとんどの場合**可能です)ルートユーザー!これまでにセキュリティ違反があった場合、DBはトーストになります。最小限の権限で2番目のアカウントを作成します。私のセカンダリアカウントはレコードを削除することさえできません。レコードを削除できるようにする必要がある場合は、その権限を持つユーザーで別のDatabaseクラスを作成し、必要なメソッドのみを呼び出すようにします。 –

+1

全静的クラスを使用する場合は、OOPではありません。これは、グローバル変数を持つ同じ旧式の手続き型コードです。名前空間のように動作するクラスでラップするだけです。 –

+0

そして、どうぞ! FFSは '@ '演算子の使用をやめてください。エラーを隠すことは、通常、あなたができる最悪のことです。 –

8

まずは:これは無意味です。

10歳以上の年齢のmysql_*関数のオブジェクトラッパーを作成しています。このPHP拡張モジュールはもはや維持されておらず、廃止のプロセスはalready begunです。 2012年にこの新しいAPIを使用しないでください。

代わりにPDOまたはMySQLiを使用し、prepared statementsを使用する方法を学ぶ必要があります。 ...言っ

があなたのコードを見てみましょう:

  • コンストラクタは、新しいインスタンスを作成するために必要なすべてのパラメータを受信する必要があり、パラメータは、クラス定義でハードコーディングされてはいけません。同時に2つのデータベースを扱う必要がある場合はどうなりますか?
  • 接続が作成されると、オブジェクトのスコープ変数に格納する必要があります。 $this->connection = mysql_conn...の行に沿った何か。代わりに、それをローカル変数に格納します。コンストラクタが終了した直後に「緩い」
  • すべての変数にprivateの変数を使用しないでください。元のクラスを拡張するクラスには表示されません。これが意図的でない限り、protectedを選択する必要があります。
  • or die('..')ビットが最も多くなります。接続が失敗した場合、アプリケーション全体を停止しないでください。代わりに、exceptionを投げて、コンストラクタの外で処理することができます。
+0

別のデータベースに接続したい場合彼はクエリでデータベース名を指定することができます...そのようなディックの男ではありません。 geez –

+0

@michaelhanonあなたは実際に彼のコードを見ましたか?接続の名前を付けるだけの利点はありません。また、このようなツールのように聞こえないようにするには、[OCP](https://en.wikipedia.org/wiki/Open/closed_principle)を読むべきでしょう。 –

+0

@michaelhanon私はterēskoよりもはるかに悪いと思っていました。コメントの中に無用なものを暗示しています。 – dbf

-2
<?php 

    class config 
    { 
     private $host='localhost'; 
     private $username='root'; 
     private $password=''; 
     private $dbname='khandla'; 

     function __construct() 
     { 
      if(mysql_connect($this->host,$this->username,$this->password)) 
      { 
       echo "connection successfully"; 
      } 
     } 
     function db() 
     { 
      mysql_select_db($this->$dbname); 
     } 
    } 

    $obj=new config(); 
?> 
+0

mysql_connectはお勧めしません:http://php.net/manual/en/function.mysql-connect.php – Vikram

関連する問題