Функции current () и key () PHP; несовместим с сигнатурой функции

Я заметил, что функции массива current() и key() PHP ( например, другие функции указателя массива ) принимают аргумент массива по ссылке:

смешанный ток (массив и $ массив )
Каждый массив имеет внутренний указатель на его «текущий» элемент, который инициализируется первым элементом, вставленным в массив.

После нескольких быстрых проверок кажется, что как 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()) ); 

Результаты:

 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); } } 

Вывод

Документы верны – массив рассматривается как ссылка в обоих случаях.

Не знаю, хотя почему набрасывает ошибку, а другой нет.

Btw, ошибки

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