Mysql
 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 просто прави настройките или повече чрез отражение в режима, който използвате) и след това извиква функцията на конструктора. Конструкторът трябва да е публичен (и трябва да съществува), за да работи.

Технически е възможно това да се направи достъпно и за частни и защитени членове, но това се нуждае от истинско обмисляне и също така се нуждае от синтактичен анализ на сериализираните данни. Този клас само преименува името на класа, но не и в частните свойства.

Това обаче е само един от начините да го направите. Вероятно се нуждаете само от ->isChild() или ->isAdult() функция на вашето Person клас.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Codeigniter не ми позволява да актуализирам записа, защото някои полета трябва да са уникални

  2. Как да се свържете с MySQL с помощта на Python

  3. Нуждаете се от mysql заявка

  4. .NET MySqlCommand @ е в конфликт с MySQL променлива

  5. Mysql MySQL или PHP Преобразувайте редовете в две колони динамично