Dinamik dize dayalı PHP nesne oluşturmak

3 Cevap php

Ben bir MySQL veritabanında bir dizesi tarafından tanımlanan bir tür üzerinde PHP tabanlı bir nesne oluşturmak istiyorum. Veritabanı tablo sütunları ve örnek veri var:

 id | type | propertyVal
----+------+-------------
  1 | foo  | lorum
  2 | bar  | ipsum

... PHP veri türleri ile

class ParentClass {...}
class Foo extends ParentClass {private $id, $propertyVal; ...}
class Bar extends ParentClass {private $id, $propertyVal; ...} 
//...(more classes)...

Yalnızca bir sorgu kullanarak, id tarafından bir satır SELECT ve yeni oluşturulan nesneye atanan seçili satırda diğer sütunları ile tablonun tipi sütun tanımlamak türünde bir nesne oluşturmak istiyorum.

Ben kullanarak bu düşünüyordum:

  1. mysql_fetch_object()
  2. Type niteliği Okuma
  3. Tipi niteliği tarafından tanımlanan tipte bir nesne oluşturma

Ama dinamik bir dize dayalı bir türü oluşturmak için hiçbir şekilde biliyorum. Biri bunu nasıl yapar?

3 Cevap

Ama dinamik bir dize dayalı bir türü oluşturmak için hiçbir şekilde biliyorum. Biri bunu nasıl yapar?

Oldukça kolay yapmak ve doğal yapabilirsiniz:

$type = 'myclass';

$instance = new $type;

Sorgu bir ilişkisel dizi dönen ise, benzer bir sözdizimi kullanarak özellikleri atayabilirsiniz:

// build object
$type = $row['type'];
$instance = new $type;

// remove 'type' so we don't set $instance->type = 'foo' or 'bar'
unset($row['type']);  

// assign properties
foreach ($row as $property => $value) {
   $instance->$property = $value;
}
$instance = new $classname; // i.e. $type in your case

Çok iyi çalışıyor ...

Eğer ben bir geçici değişken dayanmaz ay önce bir çift hakkında öğrendim kullanabileceğiniz çok düzgün bir yazım var. Burada belirli bir sınıfı yüklemek için bir POST değişken kullanmak bir örnek:

$eb = new ${!${''} = $_POST['entity'] . 'Binding'}();

Belirli bir durumda olsa da, PDO kullanarak bunu çözmek mümkün olacaktır. Bu ilk sütunun değeri satır içine örnekler sınıf olmasını sağlar bir getirme modu vardır.

$sth->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);