您之前没有收到该错误,因为您的 error_reporting 和/或 display_error 设置过于宽松。您的第一个 sn-p 正在 尝试访问可能不存在的数组中的值。如果没有,PHP 总是会发出通知。
只有在通知发出后才能将其隐藏(通过关闭display_errors 或将error_reporting 设置为不报告通知(~E_NOTICE)。
您要求快速修复:
if (isset($_GET['something']))
只需要您添加isset()。这很快,它解决了这个问题。此外:使用isset 是您应该 做的。总是。
题外话,但也许有用:
正如我在 cmets 中所解释的:现在对您来说最好的做法是解决问题本身,而不是忽略通知。为此,一个简单的脚本可以扫描您的项目目录中的 .php 文件(使用 glob),读取它们并查找模式可能会很有用:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
if (preg_match_all('/if\s*\(\$[^[]+\[[^]]+\]\s*\)/',$code, $matches))
{//find all usages of "if ($rawVar['offset'])" in code
echo 'Expressions to check or fix in file: ', $file,':', PHP_EOL, '=>';
echo implode(PHP_EOL.'=>', $matches[0]), PHP_EOL;
}
}
运行脚本,或许将输出写入临时文件,然后开始工作。输出应该类似于:
Expressions to check or fix in file: scriptname.php:
=> if ($_GET['something'])
=> if ($var[123])
等等。这是一种可行的格式,如果有时间,您也可以编写一个脚本来自动重构代码。
在这里使用的更全面(如完整)的正则表达式可能类似于:
/if\s*\((\|\||&&|\()?\$[^[]+\[[^]]+\]\s*(\|\||&&|\))?/
但这也有一些警告,但这是一个开始。
添加分配 - 我会再帮您一个忙:添加代码来解决您在分配表达式中遇到的问题,例如 $var = $_GET['something'];。这可以自动完成,也很容易:
foreach ($phpFiles as $file)
{
$code = file_get_contents($file);//read the file
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
file_put_contents($file, $clean);
}
我已经像这样测试过这段代码:
$code = '$foo = 123;
$foo = $_GET["bar"];';
$clean = preg_replace(
'/(\$[^\s]+\s*={1}\s*)(\$[^[]+[^]]+\])\s*;/',
'$1isset($2) ? $2 : null;',
$code
);
echo $clean, PHP_EOL;
它产生了预期的输出:
$foo = 123;
$foo = isset($_GET["bar"]) ? $_GET["bar"] : null;
结合这两个正则表达式,您应该可以很好地重构您拥有的代码...