1

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

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

我知道,这对 PHP 来说是可以的,但是当我回显类似的东西时,$array['none']它不会为未定义的变量显示 E_NOTICE。

谁能解释一下,为什么?

4

2 回答 2

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 ...

}

现场观看!

于 2013-09-23T13:43:47.363 回答
0

所有这些都在配置文档页面上进行了解释

在开发过程中启用 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...

于 2013-09-23T13:46:49.813 回答