基于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的对象。
我在想,使用:
-
mysql_fetch_object()
- 读取types属性
- 创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了一个方法。