1

私の上司は、私たちが現在持っているものよりも優れた形状のオブジェクトを構築するタスクを私に与えました. この会社はここ数年、スパゲッティ ポットを扱っており、私はそれをきれいにするために連れてこられました。

インスタンス化すると次のようになるように、ユーザーの PHP クラスを取得しようとしています。

<?php
$user = new User();
$user->firstname;
$user->lastname;
$user->haircolor;
$user->eyecolor;
$user->homephone;

などなど。これらがすべて 1 つのテーブルにある場合、このすべてのデータを取得するには、複数のテーブルにクエリを実行する必要があります。わかりました。しかし、すべてのユーザー情報を取得するクラスを定義している場合、コンストラクターでいくつかのクエリまたは大規模な結合を呼び出す必要があります。右?

これを行うより良い方法はありますか?目標は、最適な読み込み時間でコードをより適切に構成することです。上司は特に、関数ではなく変数を持ちたいと考えています。その背後にある理由が何であるかはわかりませんが、彼は私にこれをするように頼んだだけです.

したがって、私の具体的な質問は、複数のクエリを呼び出したり、巨大な JOIN を使用したりするよりも、これを行うための簡単で高速な方法はありますか?

4

2 に答える 2

0
class User  {
    public $id;
    public $firstname;
    public $lastname;
    public $email;
    public $creationdate;
    public $user_image;



    public static function find_all(){
        return self::find_by_sql("SELECT * FROM users");
    }

    public static function find_by_id($id=0){

        $result_array = self::find_by_sql("SELECT * FROM users WHERE id={$id} LIMIT 1");
        //$found=$database->fetch_array($result_set);
        return !empty($result_array)?array_shift($result_array):FALSE;
    }

    public static function find_by_sql($sql=""){
        global $database;
        $result_set=$database->query($sql);
        //return $result_set;

        $object_array=array();
        while($row=$database->fetch_array($result_set)){
            $object_array[]=self::instantiate($row);
        }
        return $object_array;

    }






    private static function instantiate($record){
        //long form
        $object=new self;


        //dynamic
        foreach ($record as $attribute=>$value){
            if($object->has_attribute($attribute)){
                $object->$attribute =$value;
            }
        }

        return $object;
    }

    private function has_attribute($attribute){
        //get_object_vars returns an associative array with all attributes
        $object_vars=get_object_vars($this);
        //we will return true or false
        return array_key_exists($attribute, $object_vars);
    }



        //dynamically add the public class variable and it will automatically assign the value
//if you are joining the queries than it will also work
//and your code will work here
//$user = new User();
//$user->firstname;
//$user->lastname;
//$user->haircolor;
//$user->eyecolor;
//$user->homephone;



}

?>
于 2012-09-15T15:17:28.743 に答える
0

私のコメントとは別に、データベース情報の一種の遅延読み込みを実装できます。たとえば、ユーザーがいて、ユーザーが他のユーザーと友達としてつながることができるとします。ただし、User オブジェクトを作成するたびにフレンドを必要としない場合 (これにより、オブジェクトに対して複数回 getFriends() を使用することもできますが、データベースからデータをフェッチするのは 1 回だけです):

class User {
    private $id;
    private $name;
    private $friends;

    public function __construct($id) {
        // If you have a caching solution, you can check the cache first
        // Load user from database, fetch and set id and name.
    }

    public function getFriends() {
        if ($this->friends != null) {
            return $this->friends;
        }

        // If you have a caching solution, you can check the cache first
        // Fetch friends from databse, set instance variable and return it
    }

    public function save() {
        // Save information to database and possibly cache
    }
}
于 2012-09-15T15:22:27.157 に答える