PHP 的 current() 和 key() 函数;与函数签名不一致



我注意到PHP的current()key()数组函数(像其他数组指针函数)通过引用接受数组参数:

目前

(数组和数组美元)
每个数组都有一个指向"当前"元素的内部指针,该指针初始化为插入数组的第一个元素。

经过几次快速检查后,似乎current()key() (不同于其他数组指针函数)都接受数组参数的值,因此在传递函数的返回值时不会抛出错误。

我得出的结论是,这仅仅是因为current()key()不试图移动数组指针,因此不需要通过引用传递参数(或以某种透明,安静,秘密的方式)。然而,这一点让我有点担心。

谁能确认这是否是预期的功能?我很乐意使用它来抓取返回数组的第一个元素/键,但是在几乎任何其他情况下,PHP都允许在将值传递给引用参数时发出致命错误(或严格标准警告),这似乎非常奇怪。

特性还是bug?


例如:

error_reporting(-1);
function getArray(){
    return array('a', 'b', 'c');
}
var_dump( current(getArray()) );
var_dump( key(getArray())     );
var_dump( next(getArray())    );
var_dump( prev(getArray())    );
var_dump( reset(getArray())   );
var_dump( end(getArray())     );

结果:

string(1) "a"
int(0)
Strict standards: Only variables should be passed by reference ...
string(1) "b"
Strict standards: Only variables should be passed by reference ...
bool(false)
Strict standards: Only variables should be passed by reference ...
string(1) "a"
Strict standards: Only variables should be passed by reference ...
string(1) "c"

这绝对是一个功能,我不想没有它。

现在的问题是关于&的文档是否正确。

<标题> 目前

PHP_FUNCTION(current)
{
    HashTable *array;
    zval **entry;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &array) == FAILURE) {
        return;
    }
    if (zend_hash_get_current_data(array, (void **) &entry) == FAILURE) {
        RETURN_FALSE;
    }
    RETURN_ZVAL(*entry, 1, 0);
}
PHP_FUNCTION(next)
{
    HashTable *array;
    zval **entry;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &array) == FAILURE) {
        return;
    }
    zend_hash_move_forward(array);
    if (return_value_used) {
        if (zend_hash_get_current_data(array, (void **) &entry) == FAILURE) {
            RETURN_FALSE;
        }
        RETURN_ZVAL(*entry, 1, 0);
    }
}
结论

文档是正确的-数组在两种情况下都被作为引用。

不知道为什么一个会抛出错误,而另一个不会。

在 中抛出错误
  • Zend/zend_vm_def.h
  • Zend/zend_vm_execute.h

最新更新