Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果您尝试使用括号来获取NULL上的键的值,为什么PHP中没有错误?_Php_Null_Dereference - Fatal编程技术网

如果您尝试使用括号来获取NULL上的键的值,为什么PHP中没有错误?

如果您尝试使用括号来获取NULL上的键的值,为什么PHP中没有错误?,php,null,dereference,Php,Null,Dereference,我在facebook的phpsh和标准的蹩脚php中都尝试了以下代码——这是repl所厌恶的: $a = NULL; echo $a['foobar']; 遗憾的是(当涉及PHP时,我不会称之为惊讶或失望),我没有收到任何错误、警告、异常或任何东西 Ruby和Python等更智能的语言在尝试从None或nil中取消对密钥的引用时都会抱怨。PHP如何解释这种情况?唯一的治疗方法是到处插入Is_null检查吗?我应该责怪Smarty没有为我做这件事吗?根据PHP源代码(Zend/Zend_exec

我在facebook的phpsh和标准的蹩脚php中都尝试了以下代码——这是repl所厌恶的:

$a = NULL;
echo $a['foobar'];
遗憾的是(当涉及PHP时,我不会称之为惊讶或失望),我没有收到任何错误、警告、异常或任何东西


Ruby和Python等更智能的语言在尝试从None或nil中取消对密钥的引用时都会抱怨。PHP如何解释这种情况?唯一的治疗方法是到处插入Is_null检查吗?我应该责怪Smarty没有为我做这件事吗?

根据PHP源代码(
Zend/Zend_execute.c
),只有字符串、数组和对象才能在访问偏移量/索引时触发错误。其余部分或多或少被忽略了:

$a = true;
$b = false;
$c = null;
$d = 1;
$e = 1.234;
$f = '';
$g = array();
$h = new stdClass;

echo $a[0]; // NULL
echo $b[0]; // NULL
echo $c[0]; // NULL
echo $d[0]; // NULL
echo $e[0]; // NULL
echo $f[0]; // E_NOTICE: Uninitialized string offset
echo $g[0]; // E_NOTICE: Undefined offset
echo $h[0]; // E_FATAL:  Cannot use object as array
$a
$b
$c
$d
$e
中没有一个实际出现错误。在代码中的大多数时候,我只看到
返回
返回0
,表示NULL,而不是返回的
zval*
(指针)或
zend\u error()
调用。因此,上述结果是正确的

不管为什么这样做,这都无关紧要。在这种情况下,应始终检查变量是否存在和/或为空。最安全的方法(稍有不同的行为)是
isset
empty

isset($a['foo']);
!empty($a['foo']);    

无论哪种方式,您都不会得到错误或异常,在这种情况下,它可能是一个通知,并且由于许多原因,通知在默认情况下是隐藏的。我并不同意这种说法,例如Joomla有很多不可靠和有缺陷的代码,因为它是在这样的系统上开发和测试的。这种情况甚至不会产生
E_通知
,所以错误报告在这里没有帮助。如果你做$a=array('php'=>'太糟糕了')$php-a中的['foobar']至少会得到一个通知。这对于严肃的代码来说有点糟糕,但至少它给了你一些东西。这很有趣。起初,我认为它应该生成E_通知,然后尝试代码。。。嗯,我已经修改了我的答案,试图弥补我自己:)缺少错误似乎是懒惰的结果,还是PHP的一般哲学,即宁可做一些事情,即使它没有用处,也不要用错误、异常和所有那些讨厌的东西“烦扰”程序员?@Sam:这肯定不是懒惰。很可能是一个简单的
zend_错误
调用就完成了这个任务。这可能与以下事实有关:
isset($a['foo'])
会抛出一个错误:
$a
是一个null、一个int等。这使得你不得不像
isset($a)和&isset($a['foo'])
。那会很烦人。我想我可以试着修改代码,看看会发生什么