Php 拉威尔的旧程序代码。“许多通知”;未定义索引;。如何避免国际单项体育联合会?

Php 拉威尔的旧程序代码。“许多通知”;未定义索引;。如何避免国际单项体育联合会?,php,laravel,Php,Laravel,我必须将许多旧的过程代码转移到Laravel中的OOP中 在这段代码中,有数百个动态生成的数组,它们来自许多嵌套的ifs、foreachs等 Vanilla PHP没有抱怨,只给出了一个通知,但Laravel为此抛出了一个错误: $arr[$month][$year][$bla][$blablbalba] += $v; 问题出在+=中 当然,我可以通过以下方法轻松解决此问题: if (! isset($blabla)) { // set it } 问题是生成的数组超过250个,我不想写

我必须将许多旧的过程代码转移到Laravel中的OOP中

在这段代码中,有数百个动态生成的数组,它们来自许多嵌套的
if
s、
foreach
s等

Vanilla PHP没有抱怨,只给出了一个通知,但Laravel为此抛出了一个错误:

$arr[$month][$year][$bla][$blablbalba] += $v;
问题出在
+=

当然,我可以通过以下方法轻松解决此问题:

if (! isset($blabla)) {
   // set it
}
问题是生成的数组超过250个,我不想写250个
if
s

我尝试使用神奇的方法
\uuu get()
\uu set()
,但在尝试以下内容时,
\uu set()
方法出现问题:

$this->someProperty['key1']['key2'] 
正在获取“间接修改重载属性”消息

这是一个更具体的PHP问题,与Laravel没有太多关系,但在我的例子中,Laravel是一个障碍,它在旧代码中显示了这种不好的做法,并抛出错误

如果s像疯了一样,我怎么能不写
就解决这个问题呢?只想再一次提到,数组是动态生成的,并且根据条件逻辑进行不同的嵌套。我不能在类的方法的开头定义所有这些

有没有一种聪明的方法可以做到这一点,或者必须完全改变代码的业务逻辑(非常糟糕的情况)?先谢谢你。我感谢你花了这么多时间

下面是生成这些数组的许多
foreach
循环之一:

$heating_appliances = $haClass->calculateHA($scenario, $house_type, $year, $hd, $has, $ha_rp, $ha_dhp, $ha_chp, 'total_month', $extra_devices, $options);
foreach($heating_appliances[$year[0]] as $month => $classes) {
    foreach($classes as $class => $energy) {
        if(count(array_intersect($extra_devices, $groupsData[$class]['devices']))) {
            if($group_type == 'total_co2') {
                $profiles[$month][$class] += round((($energy * $co2[$class]) / 1000) * $energy_factor[$class], 3);
            } else {

                $profiles[$month][$class] += round($energy * $energy_factor[$class], 3);
            }
        }
    }
} 
尝试这样做:

我的最佳猜测是:问题不在于laravel抛出错误,也不在于普通PHP以前对这段代码没有问题。相反,你的环境已经改变了。应用程序始终生成通知,但以前的环境已配置为忽略这些通知。Laravel(正确)配置为将通知视为错误。上述链接应将laravel中的错误报告更改为也忽略通知然而:如果这样做有效,你就不应该完全忽略通知。相反,您应该在旧代码运行之前调用
error\u reporting()
,以禁用通知报告,然后您应该在之后再次调用
error\u reporting()
,以重新启用通知报告。背景资料:


拉威尔的行为是件好事。生产应用程序既不应生成错误,也不应生成通知。虽然你可以忽略通知,但这并不意味着这是个好主意。它们通常是引起问题但不会引起错误(例如,变量名中的键入错误)的错误的结果。因此,问题的根源不是laravel报告通知,而是编写遗留应用程序的人忽略了通知并编写了容易出错的代码。在这种情况下,与实际的bug相比,这些通知更可能是一种草率编码的迹象,因此关闭通知可能是一种可行的解决方案。但是,您最不希望做的事情就是将所有通知一起关闭,并将新应用程序转换为另一个即将成为遗留应用程序的应用程序,该应用程序无法在现代环境中运行。因此,如果您禁用通知的错误报告,请不要在整个应用程序中执行此操作:只需对遗留内容执行此操作。

要缩短isset检查,您可以执行以下操作:

$array = ['keyOne' => 'test', 'keyThree' => 'testing'];
$data  = [];

foreach ($array as $key => $value)
{
    if (isset($array[$key]) {
        $data[$key] = $value;
    }
}

var_dump($data); //this will display the orig value because there is 
                 //nothing set - but in your code I'm sure it will strip
                 //out not-set data

这样做的目的是,为每个数组测试$key,然后对照原始数组测试$key,如果设置了,它会将其添加到$data数组中,以用于SQL等。

您并没有给我们提供太多真实的信息。但我想到的一件事是,可能您没有将这些数据正确地传递给您编写的新OOP代码,也就是说,这是一个范围问题吗?我自己对blah的语言不太流利。首先,您如何处理数组上的
\u get()
\u set()
?它们是数组还是对象?
+=$v
如果您不想在这里做数学运算,而是想连接,则需要使用
=$v问题在这方面不清楚。太多的废话不合我的口味,这些废话的价值观到底是什么。你已经被问了几个问题,就像你的一样,期待得到一些答案。我还没有看到有人回复他们,除非你留下问题。投票结束谢谢你这个结构良好的答案。我想再次感谢你仔细阅读我的问题并快速进入主题。你救了我。我知道这是一个快速修复(黑客),但它非常适合我的情况。谢谢,好主意。谢谢:)@MiroXristov不用担心:)很高兴help@ThisGuyHasTwoThumbs实际上,这只是一个很长的说法:
$data=array\u merge($data,$array)
。在这两种情况下,都有一个重要的警告:它不适用于多维数组,而OP有很多这样的数组。@ConorMancone啊不知道!生产力统计+1哈哈谢谢!:)这是真的。这仅适用于单级阵列。明天早上会用multis的东西进行编辑,比如在除夕夜的电话上。@这个人有两个拇指是的,多维数组会带来很多麻烦(尽管我自己仍然经常使用它们)。我一直暗暗渴望一个多维友好的
array\u merge
函数。