首先是一些代码,然后是问题
$squad_ids = $mysqli->query("SELECT id FROM squad WHERE owner=$owner_id");
include "squads.php";
$squads = array();
$squads_num = 0;
foreach ($squad_ids as $squad_id){
$squads[$squads_num] = new Squad($squad_id["id"]);
var_dump($squads[$squads_num]); // <-------------- DUMP 1
$squads_num++;
}
...
foreach ($squads as $squad){
var_dump($squad); // <-------------- DUMP 2
}所以我要做的是用$squads对象填充Squad数组(两个在测试中)。当转储数组字段(DUMP 1)时,就会显示这两个对象。
之后,我将遍历创建的$squads数组,并希望访问存储的对象。
但由于一些奇怪的原因,这两次都是完全相同的物体。在转储$squad (DUMP 2)时,它对测试中的两个迭代显示的结果完全相同(两次都是第二个对象)。
我无法解释。
(实际上,这两个foreach循环之间有代码,但它与$squads无关。)
为供参考,全班:
class Squad {
private $mysqli;
private $squad = array(
"id"=>null,
"name"=>null,
"owner"=>null,
"battlefield"=>null,
"posx"=>null,
"posy"=>null,
"radius"=>null,
"action"=>null,
"action_cmd"=>null
);
private $map = array();
private $scan = array();
function Squad($id){
global $squad;
global $mysqli;
include "db_connect.php";
$squad_request_raw = $mysqli->query("SELECT * FROM squad WHERE id = '$id'");
$squad_request = $squad_request_raw->fetch_object();
$squad["id"] = $squad_request->id;
$squad["name"] = $squad_request->name;
$squad["owner"] = $squad_request->owner;
$squad["battlefield"] = $squad_request->battlefield;
$squad["posx"] = $squad_request->posx;
$squad["posy"] = $squad_request->posy;
$squad["radius"] = $squad_request->radius;
$squad["action"] = $squad_request->action;
$squad["action_cmd"] = $squad_request->action_cmd;
}
function getId(){
global $squad;
return $squad["id"];
}
}发布于 2014-05-31 23:45:27
您绝对应该删除这些行:
global $squad;
在你的班级里。我现在不能把代码设置为测试,但这肯定会导致奇怪的事情发生.因为这是您在foreach和类的每个实例中使用的相同的var。php中的所有全局vars都是从代码的基本级别工作的,因此每个实例都将使用相同的var.另外,我不明白为什么您的类要求这个var是全局的。
在第一个循环中创建每个类实例之后,您将立即使用var_dump,因此在每个循环迭代的生存期内,它们看起来都很好。但是,由于您正在全球化类使用的内部变量,每次创建实例时,您都将修改相同的var/结构,特别是在构造函数方法中没有重新定义数组的情况下。实际上,我认为您的类甚至根本不会使用您的私有$this->squad数组(尽管它可能正在全球化,但我无法在没有测试的情况下判断)。我敢打赌,如果您总是只var_dump数组中的第一个项--在您的第一个foreach中--您将看到它随着循环的进展而改变。例如,尝试如下:
foreach ($squad_ids as $squad_id){
$squads[$squads_num] = new Squad($squad_id["id"]);
var_dump($squads[0]); // <-------------- DUMP 1
$squads_num++;
}在创建$squads[0]之后,您可能会看到$squads[1]和$squads[1]一样,等等.全球化的$squad变量实际上导致了它与&reference一样的行为。
发布于 2014-05-31 22:30:12
我在您的代码中没有看到任何问题,但我也会尝试在循环中设置键并查看已打印的内容:
foreach ($squads as $key => $squad){
var_dump($squads[$key]);
}https://stackoverflow.com/questions/23974969
复制相似问题