我使用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;
但这似乎是一种矫枉过正:它将复制所有属性(包括一些未被实际引用的额外属性),这是不必要的,而且 - 是对性能的惩罚。
答案 0 :(得分:1)
您可以实现自己的__clone()魔术功能,以便创建一个未引用的对象副本。我认为它应该有用。
http://www.php.net/manual/en/language.oop5.cloning.php
<?php
class Item {
public $id, $name;
public function __clone() {
$id = $this->id;
unset($this->id);
$this->id = $id;
$name = $this->name;
unset($this->name);
$this->name = $name;
}
}
$id = 1;
$name = 'o_0 Tync';
$i1 = new Item();
$i1->id = &$id;
$i1->name = &$name;
$i2 = clone $i1;
$id = 2;
$name = 'Mchl';
var_dump($i1,$i2);
输出
object(Item)#1 (2) {
["id"]=>
&int(2)
["name"]=>
&string(4) "Mchl"
}
object(Item)#2 (2) {
["id"]=>
int(1)
["name"]=>
string(8) "o_0 Tync"
}
丑陋,但是有效......
答案 1 :(得分:0)
如果我理解正确,您想要将数据提取到对象中吗? MysqlI有一个fetch_object方法/函数:http://www.php.net/manual/en/mysqli-result.fetch-object.php像这样使用它:
$foobar = $conn->escape_string($foobar);
$stmt = $conn->query("SELECT * FROM foo WHERE bar = '$foobar'");
while ($item = $stmt->fetch_object("Item")) {
$items[] = $item;
}
$stmt->close();