首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组奇数行为中的对象

数组奇数行为中的对象
EN

Stack Overflow用户
提问于 2014-05-31 22:19:41
回答 2查看 58关注 0票数 0

首先是一些代码,然后是问题

代码语言:javascript
复制
$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无关。)

为供参考,全班:

代码语言:javascript
复制
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"];
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-31 23:45:27

您绝对应该删除这些行:

global $squad;

在你的班级里。我现在不能把代码设置为测试,但这肯定会导致奇怪的事情发生.因为这是您在foreach和类的每个实例中使用的相同的var。php中的所有全局vars都是从代码的基本级别工作的,因此每个实例都将使用相同的var.另外,我不明白为什么您的类要求这个var是全局的。

在第一个循环中创建每个类实例之后,您将立即使用var_dump,因此在每个循环迭代的生存期内,它们看起来都很好。但是,由于您正在全球化类使用的内部变量,每次创建实例时,您都将修改相同的var/结构,特别是在构造函数方法中没有重新定义数组的情况下。实际上,我认为您的类甚至根本不会使用您的私有$this->squad数组(尽管它可能正在全球化,但我无法在没有测试的情况下判断)。我敢打赌,如果您总是只var_dump数组中的第一个项--在您的第一个foreach中--您将看到它随着循环的进展而改变。例如,尝试如下:

代码语言:javascript
复制
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一样的行为。

票数 1
EN

Stack Overflow用户

发布于 2014-05-31 22:30:12

我在您的代码中没有看到任何问题,但我也会尝试在循环中设置键并查看已打印的内容:

代码语言:javascript
复制
foreach ($squads as $key => $squad){
    var_dump($squads[$key]); 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23974969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档