Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PDO::FETCH_CLASS z wieloma klasami

Ponieważ nie znasz typu (nazwy klasy) zwracanych obiektów przed wykonaniem zapytania, nie możesz go określić.

Można jednak zawrzeć tę logikę w innym typie używanym jako typ zwracany, który może następnie zwrócić określony typ zwracany:

/**
 * 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;
    }
}

Następnie możesz użyć getConcrete() funkcji na każdym zwróconym obiekcie, aby zwrócić twój określony typ, twoją logikę decyzji powiązaną ze zwrotem bazy danych.

Edytuj: Zmieniłem go na wersję, która najpierw zainicjuje właściwości obiektów poprzez unserialize (proszę przetestować, czy to działa, opiera się na założeniu, że mówimy tylko o właściwościach publicznych i nie wiem, czy PDO tylko robi settery, czy więcej poprzez odbicie w trybie, którego używasz), a następnie wywołuje funkcję konstruktora. Konstruktor musi być publiczny (i musi istnieć), aby to działało.

Jest to technicznie możliwe, aby udostępnić to również członkom prywatnym i chronionym, jednak wymaga to rzeczywistego odzwierciedlenia, a także wymaga analizy danych serializowanych. Ta klasa zmienia tylko nazwę klasy, ale nie wewnątrz prywatnych właściwości.

Jest to jednak tylko jeden sposób na zrobienie tego. Prawdopodobnie potrzebujesz tylko ->isChild() lub ->isAdult() funkcja na Twojej Person klasa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:echo liczby duplikatów w tabeli według najczęściej używanych

  2. prosty sposób na zsumowanie wyniku z UNION w MySql

  3. Najlepsze praktyki dotyczące replikacji MySQL

  4. Jak poprawić wydajność zapytań dzięki kolejności, grupowaniu i łączeniom?

  5. Python+MySQL — wstawianie zbiorcze