Laravel的旧程序代码。许多通知"undefined index".如何避免IF?



我必须将很多旧的程序代码转移到Laravel中的OOP。

在此代码中,有数百个动态生成的数组,它们来自许多嵌套的ifs、foreachs 等。

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

$arr[$month][$year][$bla][$blablbalba] += $v;

问题出在+=.

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

if (! isset($blabla)) {
// set it
}

问题是生成的数组超过 250 个,我不想写 250if秒。

我尝试使用__get()__set()的魔术方法,但是当您尝试以下方法时,__set()方法存在问题:

$this->someProperty['key1']['key2'] 

获取"间接修改重载属性"消息。

这是更特定于PHP的问题,它与Laravel没有太多关系,但是就我而言,Laravel是在旧代码中显示这种不良做法以及抛出和错误的障碍。

我怎样才能解决这个问题,而不会像疯了一样写if?只想再提一次,数组是动态生成的,并且嵌套方式不同,具体取决于条件逻辑。我无法在类方法的开头定义所有这些。

是否有一种聪明的方法可以做到这一点,或者必须完全更改代码的业务逻辑(非常糟糕的情况(?提前谢谢你。我感谢所投入的时间。

下面是生成这些数组的众多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);
}
}
}
} 

尝试这样做:

https://stackoverflow.com/a/39642147/1921979

我最好的猜测:问题不在于laravel抛出错误,或者普通的 PHP 以前可以接受这段代码。 相反,您的环境发生了变化。您的应用程序始终会生成通知,但您以前的环境配置为忽略它们。 Laravel(正确(配置为将通知视为错误。 上面的链接应该将 laravel 中的错误报告更改为也忽略通知。但是:如果可行,您不应该完全关闭通知。 相反,您应该在旧代码运行之前调用error_reporting()以禁用通知报告,然后应立即再次调用error_reporting()以重新打开通知报告。 对于背景:

拉拉维尔的行为是一件好事。 生产应用程序不应生成错误或通知。 虽然您可以忽略通知,但这并不意味着这是一个好主意。 它们通常是导致问题但不会引起错误的错误的结果(例如,变量名称中的拼写错误(。 因此,问题的根源不在于 laravel 报告通知,而是编写您的旧版应用程序的人忽略了通知并编写了容易出错的代码。 在这种情况下,通知可能是草率编码的迹象,而不是实际的错误,因此关闭通知可能是一个可行的解决方案。 但是,您要做的最后一件事是一起关闭通知,并将新应用程序转换为另一个即将成为旧版应用程序的应用程序,该应用程序无法在现代环境中运行。 因此,如果您禁用通知的错误报告,请不要在整个应用程序中执行此操作:只需对旧内容执行此操作。

要缩短 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,如果已设置,则将其添加到$data数组中以用于 SQL 等。

相关内容

最新更新