我试图将包含来自sql结果集中的元素的对象推入数组.我的代码是这样的:
$data = array();
$sql = "SELECT id,type,name,username FROM users";
foreach ($conn->query($sql) as $row) {
$this->set_id($row['id']);
$this->set_type($row['type']);
$this->set_username($row['username']);
$this->set_password($row['password']);
$data[] = $this;
}
我的结果集是正确的,但是在foreach循环结束后,我的数组单元格被最后一个记录集的值覆盖.例如,当我print_r我的$data数组ouside时,如果我有这些结果{1,’type1′,’user’,’pass’},{2,’type2′,’foo’,’bar’}循环,我只得到第二个结果集重复两次.我究竟做错了什么?
解决方法:
在实例方法中,$this始终引用当前类的实例;在每次循环迭代时,您都要修改实例本身,然后将其添加到$data中;但是在分配时,不会进行复制,而是添加了对同一实例的引用.
最后,您在每个索引处都有一个具有相同对象的数组.
您将需要在每次循环迭代时为您所在类创建一个新实例:
foreach ($conn->query($sql) as $row) {
$obj = new self; // create new instance of ourselves
$obj->set_id($row['id']);
$obj->set_type($row['type']);
$obj->set_username($row['username']);
$obj->set_password($row['password']);
$data[] = $obj;
}
这是一个个人建议,但是我可以将此代码移到静态方法中,也可以将其移到单独的类中.