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