当我们做类似的事情时:
<?php
$arr = array();
$arr[PHP_INT_MAX] = null;
$arr[] = null;
PHP 给出错误信息:
警告:无法将元素添加到数组中,因为第4行/home/yca/script.php中的下一个元素已被占用
为什么引擎说下一个元素已经被占用了?
这是一个PHP错误吗?
这将从字面上回答您关于 php 中数组的所有问题
主要是它们不是数组。它们是看起来像数组的映射。
http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html
我从当前的 5.5.2 源中提取了以下内容:
内部 ulong nNextFreeElement 将不再增加,因此出现此错误
(nNextFreeElement 现在是 LONG_MAX 已被占用)
从 PHP 源代码:
if (zend_hash_next_index_insert(Z_ARRVAL_P(container), &new_zval, sizeof(zval *), (void **) &retval) == FAILURE) {
zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied");
retval = &EG(error_zval_ptr);
Z_DELREF_P(new_zval);
}
这是我认为在这种情况下返回失败的代码部分(因为索引 LONG_MAX 已经被占用)。在此调用中,标志 = HASH_NEXT_INSERT。
if ((p->nKeyLength == 0) && (p->h == h)) {
if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) {
return FAILURE;
}
....