为什么会这样?
随着时间的推移,PHP 已成为一种更加注重安全的语言。以前默认关闭的设置现在默认打开。一个完美的例子是,从PHP 5.4.0E_STRICT
开始默认开启。
此外,根据 PHP 文档,默认情况下,在文件php.iniE_NOTICE
中禁用。PHP 文档建议将其打开以进行调试。然而,当我从 Ubuntu 存储库和 BitNami 的 Windows 堆栈下载 PHP 时,我看到了别的东西。
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
请注意,error_reporting
默认情况下实际上设置为生产值,而不是默认设置为“默认”值。这有点令人困惑,并且在php.ini之外没有记录,所以我没有在其他发行版上验证这一点。
但是,要回答您的问题,此错误现在会在以前没有弹出时弹出,因为:
您安装了 PHP 并且新的默认设置文档有些差,但不排除E_NOTICE
.
E_NOTICE
诸如未定义变量和未定义索引之类的警告实际上有助于使您的代码更清洁、更安全。我可以告诉你,几年前,保持E_NOTICE
启用迫使我声明我的变量。它让学习 C 语言变得容易多了。在 C 语言中,不声明变量更麻烦。
我能做些什么呢?
E_NOTICE
通过复制“默认值”E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
并将其替换为等号登录后当前未注释的内容来关闭error_reporting =
。如果使用 CGI 或 FPM,请重新启动 Apache 或 PHP。确保您正在编辑“正确”的php.ini文件。如果您使用 Apache 运行 PHP,则正确的方法是 Apache,如果运行 PHP-FPM,则为 fpm 或 php-fpm,如果运行 PHP-CGI,则为 cgi,等等。这不是推荐的方法,但如果您有遗留代码非常难以编辑,那么它可能是您最好的选择。
在文件或文件夹级别关闭E_NOTICE
。如果您有一些遗留代码但想要以“正确”的方式做事,这可能会更可取。为此,您应该咨询 Apache 2、Nginx 或任何您选择的服务器。在 Apache 中,您将使用php_value
inside of <Directory>
.
重写您的代码以使其更清晰。如果您需要在迁移到生产环境时执行此操作,或者不希望有人看到您的错误,请确保您禁用任何错误显示,并且只记录您的错误(请参阅php.ini 和您的服务器设置中的和display_errors
)log_errors
.
扩展选项3:这是理想的。如果你能走这条路,你应该。如果您最初不走这条路线,请考虑最终通过在开发环境中测试您的代码来移动这条路线。当你在做的时候,摆脱~E_STRICT
并~E_DEPRECATED
看看将来可能会出现什么问题。你会看到很多不熟悉的错误,但是当你将来需要升级 PHP 时,它会阻止你遇到任何不愉快的问题。
这些错误是什么意思?
Undefined variable: my_variable_name
- 当使用前未定义变量时会发生这种情况。当 PHP 脚本被执行时,它在内部只是假设一个空值。但是,在哪种情况下您需要在定义变量之前对其进行检查?归根结底,这是“草率代码”的论据。作为一名开发人员,我可以告诉你,当我看到一个开源项目中的变量在其范围内被定义得尽可能高时,我可以告诉你我喜欢它。它可以更容易地判断将来会弹出哪些变量,并且更容易阅读/学习代码。
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- 当您尝试访问数组中的值但它不存在时会发生这种情况。为防止出现此错误,请执行条件检查。
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
另一种选择是在函数顶部声明一个空数组。这并不总是可能的。
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(附加提示)
- 当我遇到这些和其他问题时,我使用了NetBeanss IDE(免费),它给了我很多警告和通知。其中一些提供了非常有用的提示。这不是必需的,除了大型项目外,我不再使用 IDE。这些天我更像一个
vim
人:)。