Аргументы основной функции PHP; Руководство говорит, что ссылка, однако она принимает значения

Я заметил некоторые несоответствия в руководстве по PHP; задокументировано множество сигнатур основных функций для приема аргументов по ссылке, однако они принимают аргументы по значению.

Ранее я опубликовал более конкретный вопрос, и @cweiske предоставил отличный ответ (со ссылкой на соответствующий источник PHP), однако эти несоответствия кажутся более распространенными.

Это влияет на ряд функций (я обновлю этот список как ордера; также обратите внимание, что эти тесты были выполнены в error_reporting(-1) окружающая среда)

Теперь я обеспокоен не тем, что занимаюсь анализом документации, а тем, что боюсь, что разработчики PHP находятся на грани детали реализации этих функций (или чего-то такого же ненадежного)

я использую array_replace_recursive() например, чтобы взять аргумент массива и применить его к другому массиву, содержащему значения по умолчанию. Некоторые из моих кодовых баз воспользовались этим несоответствием, чтобы просто сделать:

$values = array_replace_recursive(array(
    'setting_1' => array(
        'sub-setting_1' => '',
        'sub-setting_2' => '',
        'sub-setting_3' => '',
     ),
    'setting_2' => array(
        'sub-setting_1' => 0,
        'sub-setting_2' => 0,
     ),
     'setting_3' => true,
), $values);

Таким образом производя правильно отформатированный массив (чтобы обойтись безвозмездно isset() звонки)

Должен ли я быть обеспокоен этим? Я подумываю о том, чтобы отправить запрос об ошибке, связанной с документацией, но сначала мне интересно, если кто-нибудь в SO (смотрит в вашу сторону @cweiske) поймет, почему это было сделано.

1 ответ

Возможно, я не понимаю вашу дилемму, но эти функции напрямую не изменяют данные в своих параметрах, поэтому, принимают ли они с помощью ссылки или значения, это своего рода спорный вопрос, не так ли? В любом случае вам нужно будет присвоить возвращаемое значение, если вы хотите, чтобы вызов функции действительно что- то делал для вас.

С точки зрения понимания того, почему вы можете увидеть несоответствие. В PHP 5 было внесено много изменений в работу ссылок. На самом деле, я считаю, что это PHP 5.3+, который больше не позволяет использовать & для назначения по ссылке. То, что вы можете увидеть, это переход некоторых основных функций PHP на соответствие новым правилам назначения ссылок. Если мне не изменяет память, ветка PHP 5.3 изначально предназначалась для PHP 6, но была решительно объединена в ствол как ветвь, а не ожидала завершения нескольких сложных функций. Это объясняет, почему вы никогда раньше не видели такой путаницы в PHP.

Другие вопросы по тегам