2011-11-11 7 views
4

私はクラスとooに新しいです。 私は基本的なMySQLクラスを探していましたが、Matthew Saragusaの "Simple MySQL Class"が見つかりました。PHP:クラス外またはコンストラクタ内の定数を定義しますか?

define('SIMPLE_DB_SERVER', 'mysqlserver.net'); 
define('SIMPLE_DB_NAME', 'mydbname'); 
define('SIMPLE_DB_USERNAME', 'myusername'); 
define('SIMPLE_DB_PASSWORD', 'mypassword'); 
class ASimpleMySQLDB { 
    public function __construct($server, $database, $username, $password){ 

     $this->conn = mysql_connect($server, $username, $password); 
     $this->db = mysql_select_db($database,$this->conn); 
    } 
[...] 

なくコンストラクタを使用するより定数がクラス外で定義されている具体的な理由があるかどうかのだろうか - 例えば:

これらは最初の行である

public function __construct(){ 
    $this->conn = mysql_connect('localhost', 'username', 'password'); 
    $this->db = mysql_select_db('database',$this->conn); 
} 

または:

public function __construct($which_db){ 
     if($which_db=='firstdb'){ 
      $server='localhost'; 
      $username='user1'; 
      $password='pass1'; 
      $database='db1'; 
     }elseif($which_db=='otherdb'){ 
      $server='localhost'; 
      $username='user2'; 
      $password='pass2'; 
      $database='db2'; 
     } 

    $this->conn = mysql_connect($server, $username, $password); 
    $this->db = mysql_select_db($database,$this->conn); 

} 

またはスイッチなどを使用します。

2つの方法の違いは何ですか?どちらをお勧めしますか?ありがとうございます:-)

+0

もっと読むことができますか? –

+0

.iniファイルでそれらを定義する方法:P – Esailija

答えて

2

ほとんどのOO PHP開発者は現在、多くのライブラリではまだdefine()を使用してライブラリを実装するエンドパーティーによって変更する必要がある設定定数を設定しています。これらは通常、この設定情報を必要とするクラスによって必要/含まれる設定ファイルに格納されています。また、必要に応じてスタックをさらにバックアップすることもできます(Wordpressが必要です)。

PHP 5 includesこの同じ機能を実現するためにクラスの定数を使用していますが、クラス自体のスコープ内でのみ使用できます。

http://php.net/manual/en/language.oop5.constants.php

このアプローチは、あなたのライブラリが必要としているクラス固有の、不変の値を作成するための良い方法です。 PHPでOOPを使用することの主な目標の1つはコードの再利用性であるため、これはリリースのためにうまく構成をパッケージ化します。データベースクラスの場合、db_host、db_user、db_passなどのすべてのアクセス資格情報を定義するコンストラクトメソッドの前に、const宣言を含めることができます。静的メソッドのように、これらの定数にはClassName::ConstNameがアクセスする必要があります。

PHPのOOPは長い道のりを歩んでいますが、現在普及していますが、古いものやそれ以上の "ロックイン"されたフレームワークやライブラリは引き続き定義規約を使用しているため、OO環境。これを実装する

+0

ありがとう、ちょうど私が聞くことを望んだ。 – Giona

+0

あなたも学んでいるなら、PHPのドキュメントのクラスの章のできるだけお読みください。これは、静的対メソッドやオブジェクト継承のインスタンス化のような中核的なことを理解するのに役立ちます。 http://www.php.net/manual/en/language.oop5.php 私のチームでPHPからPythonに移行して以来、PHPのドキュメンテーションの質と範囲は、ミス! – DeaconDesperado

+0

私は教えてPHPを学んだ、今私はPeter MacIntyreの本を読んでいる shop.oreilly.com/product/9780596804381​​.do 残念ながら私は英語に精通していますが、残念ながら私は技術的な言語はまだ私には難しいです: - ) – Giona

1

特定のMySQL接続クラスの特定のコンテキストについてはわかりませんが、接続情報をクラスプロパティではなく定数として定義することの違いは、スコープの1つです。

定数は、特定のコード行が実行された後でコードベース内のどこでも使用できるため、ASimpleMySQLDBクラスの外部でアクセスできます。一方、コンストラクタ内で定義された変数は、クラス外では機能しません。

は、多くの場合、私は人々は、エンドユーザーが(通常は一度だけ)変更する必要があります値を設定するために、コードの先頭に定数を使用することを見つける(WordPressは自分のwp-config.phpファイルhttp://codex.wordpress.org/Editing_wp-config.phpをでこれを使用しています) 。このようにして、DB接続値を設定する場所を見つけるために、クラス自体を掘り起こす必要はありません。私はこの可読性要因が、この特定の著者が定数を使用することに決めた理由だと推測しています。

+0

ありがとうございました!クラス外で利用できるようにする以外の理由はありませんか?それらはコードの他の部分で使用されることはないので(データベース接続を管理するクラスが必要な理由です)、それらをコンストラクタ内に配置します。 もう一度 – Giona

+0

ありがとうございます。 DeaconDesperadoが言ったことに沿って、これはほとんどの時点での規約であり、接続クラス外のコードベースでMySQL接続情報が利用可能であることを意味しますが、これはセキュリティには役立ちません。 – brandwaffle

0

定数は1つの場所で定義されています。そして、あなたの例では、他の開発者はデータベースパラメータがどこにあるかを調べなければなりません。

2
  1. だから、他のファイル/クラスが定義された値(GLOBAL)にアクセスすることができます
  2. あなたは将来

であなたのデシベルを変更しようとしている場合には、編集することが容易に最良の方法はにありますすべての定義を含む構成ファイルを作成します。 ASimpleMySQLDbクラスは、データベースのラッパーであるため

include "configuration.php"; 

class DBConnection 
{ 
    public function __construct(){ 
     $this->conn = mysql_connect(SIMPLE_DB_SERVER, SIMPLE_DB_USERNAME, SIMPLE_DB_PASSWORD); 
     $this->db = mysql_select_db(SIMPLE_DB_NAME,$this->conn); 
    } 
} 
0

この分離は、最も可能性が高いですconnection.php すなわち

configuration.php

define('SIMPLE_DB_SERVER', 'mysqlserver.net'); 
define('SIMPLE_DB_NAME', 'mydbname'); 
define('SIMPLE_DB_USERNAME', 'myusername'); 
define('SIMPLE_DB_PASSWORD', 'mypassword'); 

とは、MySQLの接続クラスにそれらを含めます。これは一般的なクラスなので、コンストラクタ内の接続の詳細をハードコーディングして特定すると、再利用できないようになります。 1つのアプリケーション内でも柔軟性を維持したい場合、いくつかのデータベースが終了する可能性があります。

個人的には、シングルトンパターンに続くApplicationクラスを作成し、そのクラス内でデータベース接続の詳細をstatic変数として宣言する傾向があります。これにより、データベースの接続情報を簡単に変更したり、必要に応じてデータベースを追加したりすることができます。

関連する問題