"下一个元素已被占用"错误

Pac*_*ier 9 php arrays

当我们做类似的事情:

<?php
$arr = array();
$arr[PHP_INT_MAX] = null;
$arr[] = null;
Run Code Online (Sandbox Code Playgroud)

PHP给出错误消息:

警告:无法在数组中添加元素,因为第4行的/home/yca/script.php中已经占用了下一个元素

为什么引擎说下一个元素已被占用?

这是一个PHP错误吗?

Dan*_*ams 6

这将在字面上回答你关于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);
}
Run Code Online (Sandbox Code Playgroud)

以下是我认为在这种情况下返回失败的代码部分(因为索引LONG_MAX已被占用).在此调用中,flag = HASH_NEXT_INSERT.

if ((p->nKeyLength == 0) && (p->h == h)) {
    if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) {
        return FAILURE;
    }
    ....
Run Code Online (Sandbox Code Playgroud)