【问题标题】:Why is variable not changing in a PHP array of objects?为什么 PHP 对象数组中的变量没有变化?
【发布时间】:2020-02-24 15:53:22
【问题描述】:

我正在尝试从 PHP 中的各种来源组装array 的对象(我是该语言的新手)。问题是我无法将数据存储在我正在尝试编写的foreach 循环中的$bandwidthData array 中。

private function _getData($startDay, $totalDays)
{
    $devices = ubntDevices::getDevices();
    $data = [];
    $bandwidthData = [];
    $count = 0;

    foreach ($devices as $device) {
        $bandwidthData[$count]['device'] = $device;
        $bandwidthData[$count]['bandwidth'] = new ubntModel($device->file);
        $bandwidthData[$count]['bandwidth']->getMonthData();
        $bandwidthData[$count]['tree'] = new graphTree($device->hostid);
        $bandwidthData[$count]['graphid'] = ubntGraph::getGraphByHostId($device->hostid);
        $bandwidthData[$count]['hostname'] = $device->host_name;
        $count++;
    }
    return $bandwidthData;
}

如果我从foreach 循环中返回,我会得到正确的输出(但显然只针对第一个设备)。我已经测试了所有其他 function 来源,它们似乎返回了正确的数据。知道我做错了什么吗?提前谢谢你。

【问题讨论】:

  • 您是否启用了 PHP 错误? new 关键字可能返回一个 false 对象,从而导致“在布尔值上执行对象某事或其他”,并导致一个空数组。
  • 这是我使用 PHP 最大的挫折,我似乎无法轻松调试它。有没有办法使用 VS Code 更轻松地查看错误?
  • 不确定是否使用 VS Code,但 xdebug 可用于逐步调试 :) 一个真实的发送 tbh
  • 打开终端并输入tail -f /apth/to/php/error_log,您的错误将实时滚动过去
  • 尝试在foreach块中从上到下逐渐插入if($count ==1) break;。并检查你的回报。

标签: php arrays object


【解决方案1】:

您的 PHP 错误日志应该指出出了什么问题。强烈推荐 XDebug。
然而,现在更常见的是使用这样的关联数组:

private function _getData($startDay, $totalDays)
{
    $devices = ubntDevices::getDevices();
    $bandwidthData = [];

    foreach ($devices as $device) {
        $ubntModel = new ubntModel($device->file);
        $deviceData = array('device' => $device,
                            'ubntModel' => $ubntModel,
                            'bandwidth' => $ubntModel->getMonthData(),
                            'tree' => new graphTree($device->hostid),
                            'graphid' => ubntGraph::getGraphByHostId($device->hostid),
                            'hostname' => $device->host_name);
        $bandwidthData[] = $deviceData;
    }
    return $bandwidthData;
}

【讨论】:

  • 我更喜欢这种设置。我可能会以这种方式对其进行重构以使其更清洁。谢谢你的提示。仍在尝试安装 xdebug。听起来每个人都在使用 PHP。
  • 是的,并且 XDebug 设置已经简化了很多。他们的网站可以建议正确的版本、创建安装程序等。还有其他 PHP 调试器和分析器用于性能优化等,例如XHProf. php.libhunt.com/xdebug-alternatives
【解决方案2】:

我看到的一些东西:

这个变量在使用吗?

$data = [];

此外,此分配运行但不鼓励使用,因为此时 $bandwidthData[$count] 不存在:1

$bandwidthData[$count]['device'] = $device;

可以转换为:

$bandwidthData[$count] = [ 'device' => $device ];

此外,这只是一个无处返回的吸气剂。不是吗?

$bandwidthData[$count]['bandwidth']->getMonthData();

为了进一步学习 PHP,我可以为代码 sn-p 建议这种更简洁的方法,只是为了提高可读性:

private function _getData( $startDay, $totalDays ) {
    $bandwidthData = [];

    foreach ( ubntDevices::getDevices() as $device ) {
        $bandwidthData[] = [
            'device'    => $device,
            'bandwidth' => new ubntModel( $device->file ),
            'tree'      => new graphTree( $device->hostid ),
            'graphid'   => ubntGraph::getGraphByHostId( $device->hostid ),
            'hostname'  => $device->host_name,
        ];
    }

    return $bandwidthData;
}

无论如何,您必须学习如何调试仅查看服务器日志的简单小代码块,或者在您怀疑的行中使用懒惰的var_dump( $bandwidthData[ $count ] )(不要为这种调试方法争吵:它非常愚蠢,但非常戏剧化简单有效,对新手友好 - 如果您无法设置调试器,因为服务器可能不是您的等)或设置调试器。


1来自https://www.php.net/manual/en/language.types.array

如果 $arr 还不存在,它将被创建,所以这也是创建数组的另一种方式。然而,这种做法是不鼓励的,因为如果 $arr 已经包含一些值(例如来自请求变量的字符串),那么这个值将保留在该位置并且 [] 实际上可能代表字符串访问运算符。通过直接赋值来初始化变量总是更好

【讨论】:

  • Also, this assignment is not correct because at this point $bandwidthData[$count] does not exist: - 不正确,它仍然会分配它(除非 $count 不知何故出错):3v4l.org/1TNuX $bandwidthData[$count]['bandwidth']->getMonthData(); - 你的理论/意义是什么?帮助调试的工具总是值得拥有的,特别是对于循环工作(或者至少我喜欢它,因为我可以看到在我逐步执行时正在处理的数据)
  • (哈哈,你用 FUK 生成了一个短 URL)也许我以错误的方式解释自己。它运行,它没有给出任何警告,但它被官方劝阻。我已经用参考更新了评论。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2019-12-29
相关资源
最近更新 更多