为什么会这样?
随着时间的流逝,PHP已成为一种更加注重安全性的语言。以前默认情况下已关闭的设置现在默认情况下已打开。一个完美的例子是PHPE_STRICT
,从PHP 5.4.0开始默认启用。
此外,根据PHP文档,默认情况下E_NOTICE
在php.ini中是禁用的。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语言,而不是声明变量的麻烦更大。
我该怎么办?
E_NOTICE
通过复制“默认值” E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
并将其替换为等号后当前未注释的值来关闭error_reporting =
。重新启动Apache,如果使用CGI或FPM,则重新启动PHP。确保您正在编辑“正确的” php.ini。如果您将PHP与Apache一起运行,则正确的将是Apache,如果运行PHP-FPM,则将fpm或php-fpm,如果运行PHP-CGI,则将cgi,等等。这不是推荐的方法,但是如果您要使用旧代码,极难编辑,那可能是您最好的选择。
关闭E_NOTICE
文件或文件夹级别。如果您有一些旧代码,但又想以“正确”的方式进行操作,则这可能是更可取的。为此,您应该查阅Apache2,Nginx或您选择的任何服务器。在Apache中,您可以php_value
在中使用<Directory>
。
重写代码以使代码更整洁。如果您在移至生产环境时需要执行此操作,或者不想让别人看到您的错误,请确保禁用任何错误显示,并仅记录错误(请参见display_errors
和log_errors
在php.ini中以及您的服务器设置中) 。
要扩展选项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';
(其他提示)
- 当我遇到这些问题和其他问题时,我使用了NetBeans IDE(免费),它给了我很多警告和注意。其中一些提供了非常有用的提示。这不是必需的,除了大型项目之外,我不再使用IDE。
vim
这些天我更像一个人:)。