4

もちろん、ユーザーがいて、コメントを追加したり、件名を開いたりするオプションがあるフォーラムで作業しているとしましょう。

このために、次のようないくつかの機能が必要です。ログイン/ログアウト。コメントの追加/編集/削除; プライベートメッセージ..わかりました。

したがって、これを oop で行う場合、1 つの巨大なクラスのみを使用してこれらすべてのオプションを使用するのは非常に扱いにくく、効率が悪いと思われるため、上記のそれぞれに対してクラスを作成することをお勧めします。しかし、問題は、そうすると、各クラスでデータベースに接続する必要があり、同じデータベースへの複数の接続を同時に使用するとリソースが無駄になることです。では、この問題の最善の解決策は何ですか? :-)

4

3 に答える 3

0

OOPでは、オブジェクトを作成するだけです。彼らはすべきことをします。

そして私が書くとき、あなたはただオブジェクトを作成するだけです、私はそれを文字通り意味します。これまでのところデータベースはありません。これらのオブジェクトがどのように格納されているかはまだ気にしません。

ユニットテストを作成し、オブジェクトが実行すべき動作を実行できるようにします。

次に、それらのオブジェクトをまとめ始めます。それらはまだ保存する必要はありません。次のように、それらをまとめるだけです。

$user = $session->getUser();
$user->login(username, password);

等々。アプリケーションはデータベースを気にする必要はありません。

次に、アプリケーションをファイナライズするときに、各アクションでオブジェクトをインスタンス化する場所の横でDataMapper、データストアからオブジェクトをフェッチできるをインスタンス化します。

User <--> UserMapper <--> Datastore

ご覧のとおり、オブジェクトは、についても、Userについても何も知りません。はaが何であるかを知っていますが、上記のように、これは後で発生するため、最初に重要なオブジェクトを実行し、それらの単体テストを記述してから統合テストを記述し、それが完了したら、データベースについて考え始めます。その時です。DatastoreUserMapperUserMapperUser

于 2012-06-30T21:43:02.777 に答える
-1

このコードを使用します。Databasehandler.php という名前で保存します。それを index.php に含め、プロジェクト全体で必要なときにいつでもその関数を使用します。PDO を使用して、データベースへの安全なクエリを作成します。マイナーな変更が必要になる場合があります。

    <?php

Class DatabaseHandler
{
    private static $_mhandler;

    private function __construct() { }

    private static function GetHandler()
    {
        if(!isset($_mhandler))
        {
            try
            {
                self::$_mhandler = new PDO (PDO_DSN, DB_USERNAME, DB_PASSWORD, array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));
                self::$_mhandler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(PDOException $e)
            {
                self::Close();
                trigger_error($e -> getMessage(), E_USER_ERROR);
            }

            return self::$_mhandler; // Returning DATABASE Handler Object.
        }
    }

    public static function Close()
    {
        $_mhandler = NULL;
    }

    public static function Execute($sqlquery, $params = NULL)
    {
        try
        {
            $dbh = self::GetHandler(); //DataBaseHandler
            $sth = $dbh -> prepare($sqlquery); //StatementHandler
            $sth -> execute($params);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }

    }

    public static function GetAll($sqlquery, $params = NULL, $fetchstyle = PDO::FETCH_ASSOC)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetchAll($fetchstyle);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }


    public static function GetRow($sqlquery, $params = NULL, $fetchstyle = PDO::FETCH_ASSOC)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetch($fetchstyle);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }


    public static function GetOne($sqlquery, $params = NULL)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetch(PDO::FETCH_NUM);
            $result = $result[0];
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }
}


?>
于 2012-06-30T11:24:55.950 に答える
-1

OOP とは、コードを専用ブロックに論理的に分離することですが、必要に応じて共有、継承、相互運用性の基盤を備えています。これを念頭に置いて、接続をクラスの静的プロパティとして宣言します (インスタンスごとに再作成する必要はおそらくないため)。

これは、メイン コード ブロックがクラス拡張であるか、基本 Forum クラスのメソッドであるかに関係なく機能します (そして非常に効率的です)。

class Forum {
    public static $db = "I'm the database!";
    public function post() {
        echo self::$db;
    }
}
class Post extends Forum {
    public function getDB() {
        echo parent::$db;
    }
}

//post as its own sub-class
$post = new Post();
$post->getDB(); //I'm the database!

//post as method of class
$forum = new Forum();
$forum->post(); //I'm the database!

[編集] - PHP は静的プロパティの非自明な値を解析できないようです。つまり、それらは式や関数の呼び出しではありません。

これを一周する方法は次のとおりです。

class Forum {
    static $db;
    public function post() {
        self::$db; //do something with DB connection here
    }
}
Forum::$db = new mysqli(); //<-- the key - screw you, static property limitations
class Post extends Forum {
    public function getDB() {
        parent::$db; //do something with DB connection here
    }
}

...つまり、クラス宣言の後に静的プロパティ (DB ハンドラ) を宣言します。他の誰かがこれを行うより優雅な方法を知っているかもしれません。

于 2012-06-30T10:34:32.920 に答える