我注意到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