Dynamically create PHP object based on string
Solution 1
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 don't set $instance->type = 'foo' or 'bar'
unset($row['type']);
// assign properties
foreach ($row as $property => $value) {
$instance->$property = $value;
}
Solution 2
There's a very neat syntax you can use that I learned about a couple of months ago that does not rely on a temporary variable. Here's an example where I use a POST variable to load a specific class:
$eb = new ${!${''} = $_POST['entity'] . 'Binding'}();
In your specific case though, you would be able to solve it by using PDO. It has a fetch mode that allows the first column's value to be the class the row instantiates into.
$sth->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
Solution 3
$instance = new $classname; // i.e. $type in your case
Works very well...
Solution 4
Below is what I was looking for when I came to this thread. use {"objectName"}
(brackets) to declare or reference the object name in the form of a string.
$gameData = new stdClass();
$gameData->location = new stdClass();
$basementstring = "basement";
class tLocation {
public $description;
}
$gameData->location->{'darkHouse'} = new tLocation;
$gameData->location->{"darkHouse"}->description = "You walkinto a dusty old house";
$gameData->location->{$basementstring} = new tLocation;
$gameData->location->{"basement"}->description = "its really damp down here.";
//var_dump($gameData);
echo $gameData->location->basement->description;
This way of referring to the object seems to be interchangeable. I couldn't find the answer so i had to fool around with it Until I found a way.
Related videos on Youtube
Mat Kelly
Updated on September 11, 2020Comments
-
Mat Kelly over 3 years
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:
mysql_fetch_object()
- Reading the type attribute
- 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?
-
goat about 14 yearsYou can also pass arguments to the constructor $instance = new $type(5, 'hi');
-
FrancescoMM almost 11 yearsI don't get it, apparently you would get
$eb= new ${FALSE}();
or am I missing something?? -
silkfire almost 11 yearsThe reason this hack works is because
${false}
evaluates to${''}
(same thing as writing(string)false
) and the variable with the name[empty string]
is the one we just created in the inner bracket clause. Very nifty. -
Em.MF over 3 yearsnote that className must be a full-path, valid address of class, for example: ` $type = "app\models\MyClass"; `
-
algo over 2 yearsBut then how do you add the arguments of the constructor? Is it valid to do: $instance = new $classname($parameterA, $parameterB);
-
algo over 2 yearsWhat is the name of this syntax? Where can I read more about it? Because I am not understanding it.