sql >> データベース >  >> RDS >> Mysql

複数のクラスを持つPDO::FETCH_CLASS

    クエリを実行する前に、返されたオブジェクトのタイプ(クラス名)がわからないため、指定できません。

    ただし、そのロジックをリターンタイプとして使用する別のタイプ内にカプセル化して、特定のリターンタイプを返すことができます。

    /**
     * Should not have any private, public or protected members in it's definition.
     * 
     * Does only work for public properties.
     */
    class ReturnObject {
        public function getConcrete()
        {
            /* decide here which class */
           $classname = 'Child'; // or 'Adult'
    
           return $this->selfAs($classname);
        }
    
        private function selfAs($classname)
        {
            $l = strlen(__CLASS__);
            $s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
            $instance = unserialize($s);
            $instance->__construct();
            return $instance;
        }
    }
    

    その後、getConcrete()を使用できます 返された各オブジェクトの関数を使用して、特定のタイプを返します。データベースにバインドされた決定ロジックが返されます。

    編集: 最初にunserializeを介してオブジェクトのプロパティを初期化するバージョンに変更しました(これが機能するかどうかをテストしてください。これは、パブリックプロパティについてのみ話しているという前提に基づいており、PDOがセッター以上を実行するかどうかはわかりません。使用しているモードでのリフレクションを介して)、コンストラクター関数を呼び出します。これが機能するためには、コンストラクターがパブリックである必要があります(そして存在している必要があります)。

    これをプライベートメンバーと保護されたメンバーでも利用できるようにすることは技術的に可能ですが、これには実際の反映が必要であり、シリアル化されたデータの解析も必要です。このクラスはクラス名の名前を変更するだけで、プライベートプロパティ内では名前を変更しません。

    ただし、これはそうするための1つの方法にすぎません。おそらく->isChild()だけが必要です または->isAdult() Personで機能する クラス。



    1. SQLのインデックスとは何ですか?

    2. mysqlエラーがCodeIgniterの画面に表示されないようにする方法

    3. MM / DD/YYYY形式の日付をMySQL日付に変換します

    4. Oracle-完全更新中もマテリアライズド・ビューにアクセスできます。これはどのように作動しますか?