慕少森
注意:未定义的变量来自PHP手册的广博智慧:在将一个文件包含到使用相同变量名称的另一个文件的情况下,依赖于未初始化变量的默认值是有问题的。这也是一个重大的安全风险与register_globals的开启。如果使用未初始化的变量,则会发出E_NOTICE级别错误,但是在未初始化的数组中附加元素时则不会。isset()语言构造可用于检测变量是否已经初始化。另外,更理想的是empty()的解决方案,因为如果未初始化变量,它不会生成警告或错误消息。从PHP文档:如果变量不存在,则不会生成警告。这意味着 empty()基本上是!isset($ var)||的简洁等价物 $ var == false。这意味着您只能empty()用于确定是否设置了变量,此外它还会根据以下内容检查变量0,"",null。例:$o = [];@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];array_walk($var, function($v) {
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' . (empty($v) ? 'true' : 'false');
echo "\n";});在3v4l.org在线PHP编辑器中测试上面的代码片段尽管PHP不需要变量声明,但它确实建议使用它以避免一些安全漏洞或错误,因为人们会忘记为稍后将在脚本中使用的变量赋值。PHP在未声明变量的情况下所做的是发出一个非常低级别的错误,E_NOTICE默认情况下甚至没有报告,但是Manual 建议在开发期间允许。处理问题的方法:建议:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或者 在引用它们之前使用isset()/ !empty()来检查它们是否被声明,如://Initializing variable$value = ""; //Initialization value; Examples
//"" When you want to append stuff later
//0 When you want to add numbers later//isset()$value = isset($_POST['value']) ? $_POST['value'] : '';//empty()$value = !empty($_POST['value']) ? $_POST['value'] : '';从PHP 7.0开始,这已变得更加清晰,现在您可以使用null coalesce运算符:// Null coalesce operator - No need to explicitly initialize the variable.$value = $_POST['value'] ?? '';为E_NOTICE 设置自定义错误处理程序,并将消息重定向远离标准输出(可能是日志文件):set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)禁用报告中的E_NOTICE。一种快速排除方法E_NOTICE是:error_reporting( error_reporting() & ~E_NOTICE )使用@运算符抑制错误。注意:强烈建议仅实施第1点。注意:未定义的索引/未定义的偏移量当您(或PHP)尝试访问数组的未定义索引时,会出现此通知。处理问题的方法:在访问索引之前检查索引是否存在。为此您可以使用isset()或array_key_exists()://isset()$value = isset($array['my_index']) ? $array['my_index'] : '';//array_key_exists()$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';语言构造list()在尝试访问不存在的数组索引时可能会生成此内容:list($a, $b) = array(0 => 'a');//orlist($one, $two) = explode(',', 'test string');两个变量用于访问两个数组元素,但是只有一个数组元素index 0,因此这将生成:注意:未定义的偏移量:1$_POST/ $_GET/ $_SESSION可变使用时$_POST,上面的注意事项经常出现,$_GET或$_SESSION。对于您而言$_POST,$_GET您只需在使用之前检查索引是否存在。因为$_SESSION您必须确保以会话开始session_start()并且索引也存在。另请注意,所有3个变量都是超全局变量并且是大写的。有关:注意:未定义的变量注意:未定义的索引