所以..我仍然对此感到困惑,当创建一个数组$array = array();
然后手动设置变量时:
<?php
$array[] = 1;
$array['type'] = 2;
$array['number'] = 3;
我知道,这对 PHP 来说是可以的,但是当我回显类似的东西时,$array['none']
它不会为未定义的变量显示 E_NOTICE。
谁能解释一下,为什么?
它会。如果您打开了错误报告,它应该会显示类似于以下的警告:
注意:未定义的索引:/path/to/script.php 第 X 行中没有。
要检查,请尝试以下操作:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$array = array();
echo $array['none'];
而且,如果您想在尝试在代码中使用它们之前真正确保它们存在,请使用isset()
:
if(isset($array['none'])) {
// do stuff ...
}
所有这些都在配置文档页面上进行了解释:
在开发过程中启用 E_NOTICE 有一些好处。
出于调试目的: NOTICE 消息将警告您代码中可能存在的错误。例如,警告使用未分配的值。查找错别字并节省调试时间非常有用。
NOTICE 消息会警告您不良风格。例如,$arr[item] 最好写成 $arr['item'] 因为 PHP 试图将“item”视为常量。如果它不是常量,PHP 假定它是数组的字符串索引。
这很简单:当您访问一个不存在的键并为其分配一个新值时,PHP 将创建该键并将其添加到列表(或数组)中。但是当您尝试访问一个不存在的键并尝试回显它的值时,PHP 不会崩溃,但它会让您知道您的代码包含一个可能的错误:
$arr = array('foo' => 'bar');
echo $arr['fo'];
这会发出通知,因为我的代码可能包含拼写错误。我可能希望密钥fo
存在,但显然它不存在,所以我需要更多地处理我的代码。
发出此通知的另一个原因是查找不存在的属性/键是“慢”的。为了让 PHP知道密钥不存在的事实,必须扫描整个数组。这也不理想,尽管有时是不可避免的。如果您有发出大量E_NOTICE
' 的代码,则很可能是一些简单if
的 ',例如:
if (!isset($arr['fo']))
{
$arr['fo'] = '';
}
echo $arr['fo'];
虽然会添加更多代码,但会有效地加速您的代码。至少不是因为发布通知不是免费的(它不是那么贵,但也不是免费的)。
其他福利:
当你忘记引用数组键时,通知也会让你知道,例如
echo $arr[foo];
echo $arr['foo'];
最初,两者都会 echo bar
,但让我们在其中添加 1 行代码:
define('foo', 'bar');
echo $arr[foo];
echo $arr['foo'];
这不会,因为foo
现在是一个常数,所以$arr[foo]
等于$arr['bar'];
,这是一个未定义的索引。关闭通知,只会回显 NULL 的字符串表示,它是一个空字符串。
基本上,通知可以帮助您。使用它们,倾听它们并修复它们。如果您的网站已损坏,请修复它。如果您养成忽略这些通知的习惯,您可能会将您的 ini 文件设置为更“宽容”的设置,并且变得懒惰。
随着时间的推移,您的代码将变得越来越混乱/难闻,直到此时您实际上有一个难以追踪的错误。您将决定将错误报告设置为E_STRICT | E_ALL
,并且将无法看到指出错误实际位置的实际通知/警告,因为您的屏幕将杂乱无章E_NOTICE undefined index/variable
...