php function foo (array $ arg = NULL) - почему массив и NULL?

В последнее время я несколько раз видел следующее:

 function foo(array $arg = NULL) { ... }

У меня вопрос: зачем делать значение по умолчанию $ arg NULL , когда оно будет просто приведено? в массив? Почему бы не сделать:

 function foo(array $arg = array()) { ... }

Я знаю, что на самом деле это не имеет большого значения - это в основном просто чтение кода - но зачем поощрять PHP постоянно менять типы данных.

Я видел это много в Kohana.

9
задан Darryl Hein 20 August 2010 в 19:57
поделиться

5 ответов

Настоящий вопрос заключается в том, зачем создавать массив, если он вам не нужен.

Если вы используете $ arg = array (), будет специальная инструкция для создания массива, даже если это PHP, инструкция по-прежнему потребляет циклы ЦП. Если вы просто выполните $ arg = NULL, ничего не будет сделано.

7
ответ дан 4 December 2019 в 13:44
поделиться

= NULL - это способ разрешить аргументу иметь значение NULL:

function foo(array $arg = NULL) { ... }

разрешает выполнение foo ($ bar); в случае, если $ bar === NULL .

function foo(array $arg = array()) { ... }

вызовет ошибку , если $ bar === NULL , поскольку NULL не имеет хинингового типа, array.

Взгляните на страницу подсказок типа PHP .

Это полезно, если:

$bar = NULL;

// Do stuff that may involve $bar

// $bar may be an array, or it may still be NULL
foo($bar);

// For the above line to not trigger an error if $bar === NULL, you must use
function foo(array $arg = NULL) { ... }

Вы получаете эту ошибку , если только вы не сделаете это .

2
ответ дан 4 December 2019 в 13:44
поделиться

Причина, вероятно, в том, чтобы различать пустой набор объектов для обработки и немного отличающуюся функциональность, когда ничего не вставляется.

В качестве гипотетического примера предположим, что у вас есть функция, которая создает отчеты для пользователей. Входной массив содержит идентификаторы (или даже объекты) пользователей, для которых должны быть созданы отчеты. Эту же функцию можно также использовать для обработки отчетов, когда вам нужно обработать всех пользователей, а не их определенный набор. Если вы хотите обрабатывать только определенных пользователей, вы должны добавить массив. Но если вы хотите обработать их все, тогда имеет смысл, чтобы параметр был отдельным NULL, а не «без пользователей», который был бы пустым массивом.

Например, предположим, что есть страница, на которой администратор может указать, для каких пользователей следует создавать отчеты. Но администратор нажимает кнопку «Создать отчеты», не выбирая пользователей, и в этом случае в функцию будет брошен пустой массив, и функция точно не обработает пользователей, потому что в массиве нет пользователей.

Тогда, возможно, у вас может быть другая кнопка где-то еще в этой гипотетической системе, «Создать все отчеты», и в этом случае вы ничего не добавляете, и функция сможет определить разницу между «количеством пользователей. = 0 »и« пользователи не предоставлены », что в данном случае будет означать« все пользователи ».

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

1
ответ дан 4 December 2019 в 13:44
поделиться

Я предполагаю, что им нужен массив для параметра, но значение NULL для параметра приемлемо (и будет использоваться по умолчанию, если массив - или явное NULL - не приводится).

Обратите внимание, что спецификация массива в сигнатуре функции не относится к приведению типов, а является подсказкой типа . В нем говорится, что для $ arg принимаются только массивы.

4
ответ дан 4 December 2019 в 13:44
поделиться

возможно, если ваша функция foo должна что-то делать, когда функция вызывается явно с пустой массив .. я имею в виду:

если

foo(array());

не делает то же самое, что

foo();

, тогда вам придется использовать $ arg = NULL

0
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: