当我们做类似的事情时:
<?php
$arr = array();
$arr[PHP_INT_MAX] = null;
$arr[] = null;
PHP提供错误消息:
警告:无法在数据中添加元素,因为 /home/yca/script.php 已经在 4 中占用了下一个元素>
为什么引擎会说下一个元素已被占用?
这是一个PHP错误吗?
答案 0 :(得分: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;
}
....