为什么会发生这种情况?
随着时间的推移,PHP已成为一个更加注重安全的语言。以前默认关闭的设置现在默认打开。一个完美的例子是E_STRICT
,从PHP 5.4.0开始默认打开。
此外,根据PHP文档,默认情况下,在文件php.ini中禁用E_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之外没有记录,因此我尚未在其他发行版上进行验证。
然而,回答你的问题,现在出现这个错误是因为:
1. 安装了PHP并且新的默认设置文档化程度较低,但不排除
E_NOTICE
。
2.
E_NOTICE
警告(如未定义变量和索引)实际上有助于使您的代码更清晰、更安全。我可以告诉你,几年前,启用
E_NOTICE
强制我声明我的变量。这使得学习C语言变得容易得多。在C语言中,不声明变量会更加麻烦。
我该怎么做?
通过复制“默认值”E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
并将其替换为当前在error_reporting =
等号后未被注释的内容,关闭E_NOTICE
。重新启动Apache,或者如果使用CGI或FPM,则重新启动PHP。确保您正在编辑“正确”的php.ini文件。如果您正在使用Apache运行PHP,则正确的文件将是Apache,如果正在运行PHP-FPM,则是fpm或php-fpm,如果正在运行PHP-CGI,则是cgi等。这不是推荐的方法,但如果您有遗留代码,而且很难进行编辑,则可能是最好的选择。
在文件或文件夹级别上关闭E_NOTICE
。如果您有一些遗留代码,但希望以其他方式做正确的事情,则可能更可取。要执行此操作,您应该咨询Apache 2、Nginx或您选择的任何服务器。在Apache中,您将在<Directory>
内部使用php_value
。
重写您的代码使其更加清晰。如果您需要在移动到生产环境时或不希望有人看到您的错误时执行此操作,请确保禁用任何错误显示,并仅记录您的错误(请参见php.ini和服务器设置中的display_errors
和log_errors
)。
To expand on option 3: 这是理想情况。如果可以采用这种方式,应该采用。如果一开始没有使用这种方式,请考虑通过在开发环境中测试代码来最终采用此方式。顺便摆脱
~E_STRICT
和
~E_DEPRECATED
,以查看将来可能出现的问题。你会看到很多不熟悉的错误,但当你需要升级PHP时,这将防止你遇到任何不愉快的问题。
这些错误是什么意思?
Undefined variable: my_variable_name
- 当变量在使用前未定义时会出现此错误。当执行PHP脚本时,它内部只假设一个空值。然而,在哪种情况下需要在定义变量之前检查变量呢?最终,这是对“松散代码”的论据。作为一名开发人员,我可以告诉你,当我看到一个开源项目的变量被定义在其范围的最高位置时,我感到非常高兴。这使得更容易预测未来会出现哪些变量,并且更容易阅读/学习代码。
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
未定义的索引: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
。
and-notice-undef
。这只是一些建议。它只是重复自己,并且是“注意:未定义”。 - Funk Forty Niner