Laravel的旧程序代码。许多通知"未定义的索引"。如何避免IFs?

时间:2017-07-17 13:07:29

标签: php laravel

我必须在Laravel中将大量旧的程序代码转移到OOP。

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

Vanilla PHP不会抱怨,只会发出通知,但是Laravel会因此而抛出错误:

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

问题出在+=

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

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

问题是生成的阵列超过250个,我不想写250 if个。

我尝试使用魔术方法__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);
            }
        }
    }
} 

2 个答案:

答案 0 :(得分:2)

尝试这样做:

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

我最好的猜测:问题不在于 laravel 正在抛出错误,或者之前使用此代码的普通PHP是可以的。而是你的环境发生了变化。您的应用程序始终生成通知,但您之前的环境已配置为忽略它们。 Laravel(正确)配置为将通知视为错误。上面的链接应该更改laravel中的错误报告以忽略通知。 然而:如果可行的话,你不应该完全放弃通知。相反,您应该在遗留代码运行之前调用error_reporting()以禁用通知报告,然后您应该立即再次致电error_reporting()以重新开启通知报告。背景资料:

Laravel的行为是件好事。生产应用程序既不会生成错误也不会生成通知。虽然可以忽略通知,但这并不意味着它是个好主意。它们通常是导致问题但不会引发错误的错误的结果(例如,变量名中的拼写错误)。因此,问题的根源不在于laravel报告通知,而是编写遗留应用程序的人忽略了通知并编写了容易出错的代码。在这种情况下,通知可能是编码比实际错误更多的标志,因此关闭通知可能是一个可行的解决方案。但是,您要做的最后一件事就是一起关闭所有通知,并将您的新应用程序转换为另一个即将成为遗留应用程序的应用程序 - 该程序无法在现代化中运行 - 环境 - 由于到通知。因此,如果您禁用通知的错误报告,请不要在整个应用中执行此操作:只需为遗留内容执行此操作。

答案 1 :(得分:1)

要缩短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

这是什么,是foreach一个数组,测试$ key对原始数组,如果设置,它将它添加到$ data数组,用于SQL等。