基于字符串动态创建PHP对象

Mat*_*lly 44 php mysql oop casting

我想基于MySQL数据库中的字符串定义的类型在PHP中创建一个对象.数据库表包含以下列的列和示例数据:

 id | type | propertyVal
----+------+-------------
  1 | foo  | lorum
  2 | bar  | ipsum
Run Code Online (Sandbox Code Playgroud)

...使用PHP数据类型

class ParentClass {...}
class Foo extends ParentClass {private $id, $propertyVal; ...}
class Bar extends ParentClass {private $id, $propertyVal; ...} 
//...(more classes)...
Run Code Online (Sandbox Code Playgroud)

只使用一个查询,我想按id选择一行,并创建一个类型的对象,定义表的类型列,其中SELECTed行中的其他列被分配给新创建的对象.

我在考虑使用:

  1. mysql_fetch_object()
  2. 读取type属性
  3. 使用type属性定义的类型创建对象

但是知道无法动态创建基于字符串的类型.怎么做到这一点?

mea*_*gar 103

但是知道无法动态创建基于字符串的类型.怎么做到这一点?

你可以很容易和自然地做到这一点:

$type = 'myclass';

$instance = new $type;
Run Code Online (Sandbox Code Playgroud)

如果查询返回关联数组,则可以使用类似语法分配属性:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以将参数传递给构造函数$ instance = new $ type(5,'hi'); (30认同)

sil*_*ire 9

您可以使用一种非常简洁的语法,这是我几个月前学到的,不依赖于临时变量.这是我使用POST变量加载特定类的示例:

$eb = new ${!${''} = $_POST['entity'] . 'Binding'}();
Run Code Online (Sandbox Code Playgroud)

但是,在您的具体情况下,您可以使用PDO解决它.它有一个获取模式,允许第一列的值成为行实例化的类.

$sth->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
Run Code Online (Sandbox Code Playgroud)


rom*_*man 7

$instance = new $classname; // i.e. $type in your case
Run Code Online (Sandbox Code Playgroud)

效果很好......