数组中未定义的变量没有E_NOTICE?

时间:2013-09-23 13:41:29

标签: php arrays undefined e-notices

所以..在使用$array = array();创建数组然后手动设置变量时,我仍然对此感到困惑:

<?php
$array[] = 1;
$array['type'] = 2;
$array['number'] = 3;

我知道,PHP可以做到这一点,但是当我回复$array['none']之类的内容时,它不会显示未定义变量的E_NOTICE。

有人可以解释一下,为什么?

2 个答案:

答案 0 :(得分:1)

会的。如果您已启用错误报告,则应显示类似于以下警告的警告:

  

注意:未定义索引:/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 ...

}

See it live!

答案 1 :(得分:0)

所有这些都是explained on the config doc page

  

在开发过程中启用E_NOTICE有一些好处。

     

出于调试目的:NOTICE消息将警告您代码中可能存在的错误。例如,警告使用未分配的值。找到拼写错误并节省调试时间非常有用。

     

注意消息会警告您样式不好。例如,$ arr [item]最好写成$ arr ['item'],因为PHP试图将“item”视为常量。如果它不是常量,PHP假定它是数组的字符串索引。

这非常简单:当您访问不存在的密钥并为其分配新值时,PHP将创建该密钥,并将其添加到列表(或数组)中。但是,当您尝试访问不存在的密钥并尝试回显它的值时,PHP不会崩溃,但它会让您知道您的代码包含可能的错误:

$arr = array('foo' => 'bar');
echo $arr['fo'];

这会发出通知,因为我的代码可能包含拼写错误。我可能希望密钥fo存在,但显然不存在,所以我需要更多地处理我的代码。
发出此通知的另一个原因是因为对现有属性/键的查找“slow”。为了让PHP 知道以获得密钥不存在的事实,必须扫描整个阵列。这也是不理想的,虽然有时是不可避免的。如果你的代码发出大量的E_NOTICE,那么可能会有一些简单的if,例如:

if (!isset($arr['fo']))
{
    $arr['fo'] = '';
}
echo $arr['fo'];

虽然会添加更多代码,但会有效加快代码速度。至少是因为发布通知不是免费的(它不是 昂贵,但也不是免费的。)

其他好处:

当您忘记引用数组键时,通知也会通知您,例如

echo $arr[foo];
echo $arr['foo'];

最初,两者都会回显bar,但我们要为此添加一行代码:

define('foo', 'bar');
echo $arr[foo];
echo $arr['foo'];

这不会,因为foo现在是常量,因此$arr[foo]相当于$arr['bar'];,这是一个未定义的索引。关闭通知,只会回显NULL的字符串表示形式,这是一个空字符串。

基本上,通知可以帮助您。使用它们,听取它们并修复它们。如果您的网站已损坏,请进行修复。如果你进入忽视这些通知的习惯,你可能会将你的ini文件设置为更多“宽容”设置,并变得懒惰。
随着时间的推移,你的代码将变得越来越混乱/臭,直到你实际上有一个难以追踪的bug。您决定将错误报告转为E_STRICT | E_ALL,并且无法看到指出错误实际位置的实际通知/警告,因为您的屏幕会被E_NOTICE undefined index/variable弄得乱七八糟...