views:

693

answers:

3

I would like to create an object in PHP based on a type defined by a string in a MySQL database. The database table has columns and sample data of:

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

...with PHP data types

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

Using only one query, I would like to SELECT a row by id and create an object of the type define the table's type column with other columns in the SELECTed row being assigned to the newly created object.

I was thinking that using:

  1. mysql_fetch_object()
  2. Reading the type attribute
  3. Creating an object with type defined by type attribute

But know of no way to dynamically create a type based on a string. How does one do this?

+4  A: 

But know of no way to dynamically create a type based on a string. How does one do this?

You can do it quite easily and naturally:

$type = 'myclass';

$instance = new $type;

If your query is returning an associative array, you can assign properties using similar syntax:

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

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

// assign properties
foreach ($row as $property => $value) {
   $instance->$property = $value;
}
meagar
You can also pass arguments to the constructor$instance = new $type(5, 'hi');
chris
A: 

You can also use eval.

So let say, you read the database into $Result and loop $Result to $Row. You can then do this.

while($Row = ....){
    const $Type   = $Row['type'];
    const $Param  = $Row['propertyVal'];
    const $NewObj = eval("new $Type($Param);");
    ... Do things with $NewObj ...
}
NawaMan
+1  A: 
$instance = new $classname; // i.e. $type in your case

Works very well...

roman