PHP:クラス外またはコンストラクタ内の定数を定義しますか?

私はクラスやooに新しいです。 私は基本的なMySQLクラスを探していましたが、Matthew Saragusaの "Simple MySQL Class"が見つかりました。

これらは最初の行です:

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つの方法の違いは何ですか?どちらをお勧めしますか?どうもありがとう :-)

4
追加された
ビュー: 1
それらを.iniファイルで定義する方法:P
追加された 著者 Esailija,
何が読みやすくなっていますか?
追加された 著者 Platinum Azure,

5 答え

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

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

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

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

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

3
追加された
あなたも学習しているだけなら、PHPのドキュメントのクラスの章のできるだけお読みください。これは、静的対メソッドやオブジェクト継承のインスタンス化のような中核的なことを理解するのに役立ちます。 php.net/manual/en/language.oop5.php Even私のチームでPHPからPythonに移行して以来、PHPのドキュメンテーションの質と範囲は、私が本当に見逃しているものです。
追加された 著者 DeaconDesperado,
ありがとう、ちょうど私が聞くことを望んだ。
追加された 著者 Giona,
私は、私は英語に精通していますが、残念ながら私はイタリア語です、技術的な言語はまだ私には難しいです:-) Peter MacIntyre shop.oreilly.com/product/9780596804381​​.do
追加された 著者 Giona,
  1. 他のファイル/クラスは定義された値にアクセスできます(GLOBAL)
  2. 後でデータベースを変更する場合に備えて編集しやすい

これを実装する最良の方法は、すべての定義を含む構成ファイルを作成することです。 すなわち

configuration.php

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

それらをあなたのMySQL接続クラスconnection.phpに含めます

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);
    }
}
3
追加された

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

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

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

1
追加された
あなたのコメントをありがとう!クラス外で利用できるようにする以外の理由はありませんか?それらはコードの他の部分で使用されることはないので(データベース接続を管理するクラスが必要な理由です)、それらをコンストラクタ内に配置します。再度、感謝します
追加された 著者 Giona,
うん。 DeaconDesperadoが言ったことに沿って、これはほとんどの時点での規約であり、接続クラス外のコードベースでMySQL接続情報が利用可能であることを意味しますが、これはセキュリティには役立ちません。
追加された 著者 brandwaffle,

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

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

0
追加された

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

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

招待状へのリンク: https://t.me/joinchat/B2gdSlA_dh1-BQtEKA2dfw このグループではPHPについて話します。 パートナー:kotaeta.com