9

当我们做类似的事情时:

<?php
$arr = array();
$arr[PHP_INT_MAX] = null;
$arr[] = null;

PHP 给出错误信息:

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

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

这是一个PHP错误吗?

4

1 回答 1

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);
}

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

if ((p->nKeyLength == 0) && (p->h == h)) {
    if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) {
        return FAILURE;
    }
    ....
于 2013-08-17T07:03:16.853 回答