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

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

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

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

1 ответ

Решение

Это определенно особенность, и я бы не хотел жить без нее.

Теперь вопрос заключается в том, если документация о &,

Код

ток

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
Другие вопросы по тегам