0

OOPの使い方を学び始め、ユーザーが存在するかどうかを確認するためのユーザー認証クラスを作成しました。現在$dbh、PDO接続であるグローバル変数を使用してデータベースに接続しています。このようにグローバル変数を使用することは良い習慣ではないと聞きましたが、どうすれば改善できるかわかりません$dbh。データベースに接続するときに変数を必要とするメソッドに変数を渡すだけで、なぜこれが考慮されないのでしょうか。いい練習?

これが私が使用しているいくつかのコードです:

呼び出し側プログラムに含まれるデータベースPDO接続:

//test the connection
    try{
        //connect to the database
        $dbh = new PDO("mysql:host=localhost;dbname=oopforum","root", "usbw");

    //if there is an error catch it here
    } catch( PDOException $e ) {
        //display the error
        echo $e->getMessage();
    }

データベース接続を必要とするクラス:

class Auth{

        private $dbh;

        function __construct(){

            global $dbh;
            $this->dbh = $dbh;
        }

        function validateLogin($username, $password){

            // create query (placing inside if statement for error handling)
            if($stmt = $this->dbh->prepare("SELECT * FROM oopforumusers WHERE username = ? AND password = ?")){

                $stmt->bind_param(1, $username);
                $stmt->bind_param(2, $password);
                $stmt->execute();


                // Check rows returned
                $numrows = $stmt->rowCount();

                //if there is a match continue
                if( $numrows > 0 ){
                    $stmt->close();
                    return TRUE;
                }else{
                    $stmt->close();
                    return FALSE;
                }

            }else{
                die('ERROR: Could not prepare statement');
            }

        }


        function checkLoginStatus(){

            if(isset($_SESSION['loggedin'])){

                return TRUE;

            }else{

                return FALSE;

            }

        }

        function logout(){

            session_destroy();
            session_start();

        }
    }
4

3 に答える 3

6

PDO接続をコンストラクターに渡す必要があります。

function __construct($dbh) {
    $this->dbh = $dbh;
}

この接続は、クラスがその機能を実行するために必要なことは明らかであるため、クラスの依存関係と呼ばれます。グッドプラクティスでは、クラスでこの依存関係が存在することを明示する必要があります。これは、必須のコンストラクターパラメーターにすることで実現されます。

代わりに、グローバル変数から依存関係を取得すると、いくつかの問題が発生します。

  • そもそも依存関係があることは、クラスのユーザーにはまったくわかりません。
  • これで、クラスがグローバル変数に結合されました。つまり、プログラムを中断せずに変数を削除したり、名前を変更したりすることはできません。
  • 「遠隔作用」の前提条件を作成しました。グローバル変数の値を変更すると、アプリケーションの別の(一見無関係に見える)部分の動作が変更されます。
于 2012-06-30T17:02:14.697 に答える
2

コンストラクターに渡すだけです。

function __construct($connection){
         $this->connection = $connection;
}

オブジェクトを作成するときは、次のことを行います。

$obj = new Class($dbh);
于 2012-06-30T17:02:12.200 に答える
2

コンストラクターを介してデータベースオブジェクトを渡します。PHPのオブジェクトモデルは、=がオブジェクトの同じインスタンスへの新しい参照を作成することを意味します。

class ThingThatDependsOnDatabase
{
    private $db = NULL;

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

    public function selectSomething ($id)
    {
        $sql = 'SELECT * FROM table WHERE id = ?;'
        $this -> db -> prepare ($sql);
        // And so on
    }
}

これは、依存性注入と呼ばれるパターンの例です。これは、クラスが依存するものがメソッド(セッター、コンストラクターなど)を介して注入されるためです。

于 2012-06-30T17:02:34.667 に答える