【发布时间】:2011-03-23 18:23:31
【问题描述】:
我使用 mysqli 扩展并将结果绑定到一个对象:
class Item {
public $id, $name;
}
$Item = new Item;
$stmt->bind_result($Item->id, $Item->name);
每次调用$stmt->fetch() 都会覆盖$Item 的属性,这些属性成为引用。如果我只是克隆对象——这些引用仍然存在,并且两个实例同时更改:
object(Item)#1 (2) {
["id"]=>
&int(1)
["name"]=>
&string(4) "name"
}
所以应该有一种方法可以取消引用它们,所以clone 确实会创建一个副本,而不是一组引用的数据。是否有一种简单、灵活的方法来检索所有数据,以便将其存储为对象数组?主要问题是如何删除引用:&string。
我看到的唯一解决方案是实例化另一个对象并手动复制所有属性:
$Item2 = new Item;
foreach ($Item as $prop => $val)
$Item2->$prop = $val;
但这似乎有点过头了:它会复制所有不必要的属性(包括一些实际上没有被引用的额外属性),而且 - 是对性能的惩罚。
【问题讨论】:
-
实际上,我编写了一个类,它自动将结果字段绑定到对象。它唯一缺少的是存储行的选项,而不仅仅是迭代和忘记。
标签: php arrays mysqli resultset dereference