2011-07-22 6 views
2

Javaからのコミットプレーンな機能ではなく、オブジェクトとクラスを使用するほうが快適です。問題は次のとおりです: 私は現在、アクセスレベルの取得、プロファイルの変更、通知の消去などのメソッドを提供する「ユーザー」クラスを持っています。各メソッドは、必要な情報を取り出したり更新したりするためにdbにクエリを使用します。しかし、コンストラクタでは、基本情報(ID、電子メール、名前、姓など)を取得します(これは、すべてのメソッドで最もよく使用するフィールドです)。PHP OOPクラスデザイン

デザインあなたが使用します。 (現在の)

class User{ 
    private $id; 
    private $email; 
    ... 

    function __construct($id){ 
     //Connect to database 
     ... 
     $this->id=$id; 
     $thid->name=$row['name']; 
     ... 

    } 

    function getEmail(){ 
     return $this->email; 
    } 
    ... 
} 

または:

class User{ 
    private $id; 

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

    function getEmail(){ 
     //Connect to database using id 
     return $row['email']; 
    } 
    ... 
} 

私は、テキストだけのカップルであることが、パフォーマンスが二つによって改善されないフィールドと感じます私は知らないので、私は初心者です。事前

+0

ミドルグラウンド:遅い(秒)バージョンを使用しますが、結果をキャッシュしてください! –

答えて

3

バージョン1を実行し、dbクエリの結果をオブジェクトのフィールドにキャッシュします。オブジェクトの寿命のたびに毎回dbに行きたいとは限りません。また、Webアプリケーションでは、オブジェクトの存続期間は単一ページの要求に過ぎないため、非アトミックデータ操作の汚染の可能性はほとんどありません。

さらに、コンストラクタ内のデータベースに接続しないでください。あなたのクラスを生成するクラスファクトリを構築する時間を取る。正直なところ、すべてのデータフィールドを格納するモデルクラスとdbに移動するマッパークラスの両方を生成する非常に単純なコードジェネレータを作成して、100行未満のコードでテーブルからオブジェクトを構築することもできます。

あなたは余分な時間を持っている場合は、Zendのようなまたは単にデータのためのフレームワークを学び、使用、教義...

(FWIW、私はシンプルなZendのテーブルのものを学ぶことはあなたの時間を節約する正味だろうと思う)

class User{ 
protected $_id; 
protected $_email; 
protected $_username; 
protected $_userFirstName; 

public function __construct(){ 
} 
public function setId($id){ 
    $this->_id = $id; 
    return $this; 
} 
public function setEmail($email) 
{ 
    $this->_email = $email; 
} 
    // etc and getters too 
} 

public class UserMapper 
{ 
    protected $_connection; 
    public function __construct($connection){ 
    $this->_connection = $connection; 
    } 
    public loadUser($id){ 
    $select = $this->_connection->select(' * from Users') 
         ->where('id = ?', $id); 
    $result = $select->fetchAll(); 
    //error checking here 
    $user = new User(); 
    $user->setId($results[0]['id']) 
     ->setEmail($results[0]['email']) 
     ->setUsername($results[0]['username']); 
    return $user; 
    } 
    public saveUser(User $user){ 
    } 
} 
+0

それは私がこれまで持っているものです。しかし、私は他のデータベースから情報を得る他の機能を持っていますが、それは建設中に保存されない人にとっては問題ありませんか? (私はいつもそれらを使用しないことを知っています)。 接続に関して。私が今持っているのは、db接続を返す関数 'connect'です。私はそれをクエリに使用します。 PHPのクラスファクトリの例を見ることができるソースまたはリンクがありますか? Zendに試してみます – Riskz

+0

小さいコールを必要に応じてインスタンス化される小さなオブジェクトとしてラップすることは可能ですか?その後、それらの小さなオブジェクトは、自分の工場で作成され、怠惰に読み込まれることもあります。 (そう、はい、同じアイデアを使用して小さなモデルで他のデータをラップします) – Zak

+0

これでわかりました。この例をありがとう。しかし、コンストラクタの代わりにマッパーのdbに接続することの主な利点は何ですか? 私が見る唯一の違いは、同じマッパーを使用して多くのユーザーを読み込むことができることです。右? – Riskz

1

おかげで私はあなたが新しいクエリにあなたがデータベースから何かを取得したいすべての時間を行う必要がないように構造上のすべての行を取得すると言うでしょう。

結論としては、オプション#1を参照してください。

0

私はまず、ほとんどのページで使用すると思われるすべての必要な詳細を取得します。あなたが必要とするデータベースのたびに照会するため

セカンドバージョンは練習で一度にこれらの多数のオブジェクトを扱うことになるだろうがない限り、メモリ使用量の差は非常に小さく、悪い習慣

0

です。しかし、1つのクエリと複数のクエリの実行の違いははるかに目立つので、すべてのデータを一度に取得するために1つのクエリを使用する必要があります。