-1

データベース行にマップされたユーザー クラスがあります。ユーザーIDをmemcachedキーとしてキー値ペアとしてmemcachedにキャッシュしています。ユーザー クラス フィールドへの入力を含め、すべてのユーザー機能をユーザー クラスにカプセル化したいと考えています。PDO からのフェッチ中に、PDO::FETCH_INTO を使用して値を self オブジェクトに格納します。memcached でそれを行う方法は?

4

2 に答える 2

2

あなたの質問とフォローアップコメントの言い回しはややあいまいですが、それでも私は次の方向に向けられています:

public function __construct($id) {
    global $pdo, $memcached;

    $data = $memcached->get($id);
    if($memcached->getResultCode() == Memcached::RES_SUCCESS) {
        // this is not currently allowed in PHP
        $this = $data;

        // this should be your fix
        foreach($data AS $key => $value) {
            $this->$key = $value;
        }

        // or this
        foreach($this AS $key => $value) {
            $this->$key = $data[$key];
        }

        // the difference between the fixes above is that
        // the second is strictly limited to values defined
        // by the class (current object)
    }
    else {
        $pdos = $pdo->prepare('SELECT * FROM table_name WHERE id = ?');
        if($pdos) {
            // this is not allowed in PHP
            $pdos->execute(array(intval($id)));
            $this = $pdos->fetch(PDO::FETCH_CLASS, get_class($this));

            // all of this should work fine and is allowed
            $pdos->setFetchMode(PDO::FETCH_INTO, $this);
            $pdos->execute(array(intval($id)));
            $pdos->fetch(PDO::FETCH_INTO);
        }
    }
}

しかし残念ながら、PHP は $this の値を内部的に (独自のメソッド呼び出しの中で) オーバーライドすることを許可していないため、代わりに静的メソッドを使用することができます。

public static function getByID($id) {
    global $pdo, $memcached;

    $data = $memcached->get($id);
    if($memcached->getResultCode() == Memcached::RES_SUCCESS) {
        // this will work if your objects construct has a 
        // foreach similar to the ones presented above
        $result = new self($data);

        // or if you don't want to write a foreach in
        // the construct you can have it here
        foreach($data AS $key => $value) {
            $this->$key = $value;
        }

        // or here
        foreach($this AS $key => $value) {
            $this->$key = $data[$key];
        }
    }
    else {
        $pdos = $pdo->prepare('SELECT * FROM table_name WHERE id = ?');
        if($pdos) {
            // either of these should work
            $pdos->execute(array(intval($id)));
            $result = $pdos->fetch(PDO::FETCH_CLASS, get_class($this));

            // either of these should work
            $result = new self;
            $pdos->setFetchMode(PDO::FETCH_INTO, $result);
            $pdos->execute(array(intval($id)));
            $pdos->fetch(PDO::FETCH_INTO);
        }
    }

    return($result);
}

使用構文は次のようになりますMyClass::get($some_id)

于 2012-08-14T12:25:16.997 に答える
1

答えは、「やるだけ」か「やらない」かのどちらかです。

情報をキー/値として個別に保存している場合、1 回のヒットでそれを行うことはできず、手動で取得する必要があります (memcached から計算されたキーで自分自身を満たす新しいオブジェクトを作成します)。

memcached でシリアル化されたオブジェクトがある場合は、それを取得してシリアル化を解除できます。

于 2012-08-13T09:39:03.007 に答える