Я заметил, что функции массива 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, ошибки