首页 > 解决方案 > PHP:foreach 的奇怪行为

问题描述

在我尝试使用 keywhile 迭代之前按预期工作的代码下方。当我这样做时,我看到一个错误:“允许的内存大小为 1073741824 字节已用尽(试图分配 9223372043239833600 字节)”。查看所需的内存大小,它看起来很可怕。

getModules返回一个关联数组,是$id一个string.

对可能的原因有任何想法吗?

             foreach (Yii::$app->getModules() as $id => $module) {
                    echo '<pre>';
                    var_dump(gettype($module));
                    if (gettype($module) =='array') {
                        var_dump($module);
                    } else if (gettype($module) =='object') {
                        var_dump(get_class($module));
                    }
                    //var_dump($id); // <-- We have problems when try to uncomment this
                    echo '</pre>';
             }

php -v

PHP 7.0.33-25+0~20200225.32+debian9~1.gbpa11893 (cli) (built: Feb 25 2020 13:16:41) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-25+0~20200225.32+debian9~1.gbpa11893, Copyright (c) 1999-2017, by Zend Technologies

更新:我刚刚通过 ssh 打开并保存了模块数组,错误消失了。我不知道那是什么。看起来像 SSD 故障。

标签: phpforeach

解决方案


每次执行 foreach 时总是重新加载所有模块的问题。

在存储模块列表之前添加一个变量,没关系。

更正后的代码:

$listOfModules = Yii::$app->getModules();
     foreach ( $listOfModules  as $id => $module) {
                    echo '<pre>';
                    var_dump(gettype($module));
                    if (gettype($module) =='array') {
                        var_dump($module);
                    } else if (gettype($module) =='object') {
                        var_dump(get_class($module));
                    }
                    //var_dump($id); // <-- We have problems when try to uncomment this
                    echo '</pre>';
             }

推荐阅读