Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

PDO::FETCH_CLASS dengan banyak kelas

Karena Anda tidak mengetahui jenis (nama kelas) dari objek yang dikembalikan sebelum Anda melakukan kueri, Anda tidak dapat menentukannya.

Namun, Anda dapat merangkum logika itu di dalam tipe lain yang Anda gunakan sebagai tipe pengembalian yang kemudian dapat mengembalikan tipe pengembalian spesifik:

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

Anda kemudian dapat menggunakan getConcrete() fungsi pada setiap objek yang dikembalikan untuk mengembalikan tipe spesifik Anda, logika keputusan Anda terikat pada pengembalian basis data.

Sunting: Saya mengubahnya menjadi versi yang pertama-tama akan menginisialisasi properti objek melalui unserialize (tolong uji apakah ini berfungsi, ini didasarkan pada asumsi bahwa kita hanya berbicara tentang properti publik dan saya tidak tahu apakah PDO hanya melakukan setter atau lebih melalui refleksi dalam mode yang Anda gunakan) dan kemudian memanggil fungsi konstruktor. Konstruktor harus bersifat publik (dan harus ada) agar ini berfungsi.

Secara teknis memungkinkan untuk membuat ini tersedia untuk anggota pribadi dan dilindungi juga, namun ini membutuhkan refleksi nyata dan juga membutuhkan penguraian data serial juga. Kelas ini hanya mengganti nama kelas, tetapi tidak di dalam properti pribadi.

Namun ini hanya satu cara untuk melakukannya. Anda mungkin hanya membutuhkan ->isChild() atau ->isAdult() berfungsi pada Person . Anda kelas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Subquery mengembalikan lebih dari 1 baris - MySQL

  2. Nama yang sama untuk bidang formulir &bidang tabel database?

  3. mysql regex utf-8 karakter

  4. MySql.Data di GAC, masih SecurityException

  5. Bagaimana cara memperbarui halaman web tanpa memuat ulang halaman web menggunakan AJAX?