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)
这绝对是一个功能,没有它我就不想活下去。
现在的问题是文档中有关&.
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)
文档是正确的 - 在这两种情况下都将数组作为参考。
不知道为什么一个会抛出错误,而另一个不会。
顺便说一句,错误被抛出