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

Dan*_*ugg 5 php arrays reference pass-by-reference

我注意到PHP current()key()数组函数(像其他数组指针函数一样)通过引用获取数组参数:

mixed current(array &$ array)
每个数组都有一个指向其"current"元素的内部指针,该元素被初始化为插入到数组中的第一个元素.

的几个简单的检查后,似乎都current()key()(不像其它阵列指针功能)由值时传递的函数的返回值接受数组参数,从而不引发错误.

我的结论是,它只是因为current()并且key()不试图移动数组指针,因此不要求通过引用传递参数(或者以一些透明,安静,隐秘的方式执行).但是,这对我来说有点担心.

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

功能还是错误?


例如:

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())     );
Run Code Online (Sandbox Code Playgroud)

结果:

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"
Run Code Online (Sandbox Code Playgroud)

cwe*_*ske 2

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

现在的问题是文档中有关&.

代码

当前的

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);
}
Run Code Online (Sandbox Code Playgroud)

下一个

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结论

文档是正确的 - 在这两种情况下都将数组作为参考。

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

顺便说一句,错误被抛出

  • Zend/zend_vm_def.h
  • Zend/zend_vm_execute.h