所以..在使用$array = array();
创建数组然后手动设置变量时,我仍然对此感到困惑:
<?php
$array[] = 1;
$array['type'] = 2;
$array['number'] = 3;
我知道,PHP可以做到这一点,但是当我回复$array['none']
之类的内容时,它不会显示未定义变量的E_NOTICE。
有人可以解释一下,为什么?
答案 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 ...
}
答案 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
弄得乱七八糟...