基于stringdynamic创buildPHP对象

我想在PHP中创build一个基于由MySQL数据库中的string定义的types的对象。 数据库表具有以下列和样本数据:

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

…与PHP数据types

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

只使用一个查询,我想通过idselect一个行,并创build一个types的对象定义表的types列与SELECTed行中的其他列被分配到新创build的对象。

我在想,使用:

  1. mysql_fetch_object()
  2. 读取types属性
  3. 创build一个types由type属性定义的对象

但是知道没有办法根据stringdynamic创build一个types。 如何做到这一点?

但是知道没有办法根据stringdynamic创build一个types。 如何做到这一点?

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

 $type = 'myclass'; $instance = new $type; 

如果您的查询返回关联数组,则可以使用类似的语法来指定属性:

 // 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; // ie $type in your case 

工作得很好…

有一个非常整洁的语法,你可以使用,我几个月前了解到,不依赖于一个临时variables。 以下是一个使用POSTvariables加载特定类的示例:

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

在你的具体情况下,你可以通过使用PDO来解决它。 它有一个获取模式,允许第一列的值是行实例化到的类。

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

正如silkfire所说,这可以通过使用PDO特定模式来实现,所以这里是一个例子。 使用相同的数据库值和定义的对象:

  id | 键入|  propertyVal
 ---- + ------ + -------------
   1 |  foo |  lorum
   2 | 酒吧| 存有

 class ParentClass {...}
 Foo类扩展了ParentClass {private $ id,$ propertyVal;  ...}
 class Bar扩展了ParentClass {private $ id,$ propertyVal;  ...} 
 // ...(更多课程)...

使用单个查询(您必须首先命名包含类名称的字段):

 $stmt = $db->prepare('SELECT type,id,propertyVal FROM table WHERE id=1'); $stmt->execute(); $foo = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE); var_dump($foo); // $foo is a newly created object of class foo, with properties named like and containing the value of subsequent fields 

这很酷,但有一阵子变凉了

 $stmt = $db->prepare('SELECT type,id,propertyVal FROM table'); $stmt->execute(); while ($object = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE)) {var_dump($object);} // here all desired objects, dynamically constructed accordingly to the first column returned by the query 

你可以定义一个构造函数(在将来自数据库的值分配给属性之后调用)来处理这些dynamic分配的属性,比如用一个string的大写值

 class foo {function __construct () {$this->uper = strtoupper($this->propertyVal);}} 

以下是当我来到这个线程时,我正在寻找。 使用{“objectName”} (方括号)以string的forms声明或引用对象名称。

  $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; 

这种提到物体的方式似乎是可以互换的。 我无法find答案,所以我不得不与它混在一起,直到我find了一个方法。