php функция foo (массив $ arg = NULL) - почему массив и NULL? - PullRequest
9 голосов
/ 20 августа 2010

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

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

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

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

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

Я видел это много в Кохане.

Ответы [ 6 ]

7 голосов
/ 21 августа 2010

Реальный вопрос в том, зачем создавать массив, когда он вам не нужен.

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

4 голосов
/ 21 августа 2010

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

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

принимаются только массивы.
2 голосов
/ 21 августа 2010

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

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

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

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

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

Посмотрите на Страница подсказок типа 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) { ... }

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

1 голос
/ 08 марта 2013

Я знаю пару лет, но я не могу не сказать, что был выбран неправильный ответ, и никто не ответил на полный вопрос. Так что для других, которые смотрят на это и хотят знать, что на самом деле здесь происходит:

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

Когда вы вызываете foo (), первым делом PHP проверяет $ arg, чтобы определить, является ли он массивом. Правильно, массив $ arg - это тест. Если $ arg не является массивом, вы увидите эту ошибку:

Если $ arg является строкой:

Catchable fatal error: Argument 1 passed to foo() must be an array, string given

Хорошо, тогда NULL просто означает, что в случае, если $ arg не будет передано, мы установим его в NULL. Это просто способ сделать $ arg необязательным или установить его значение.

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

Если вы используете патч RFC, вы можете сделать:

function foo((array)$arg){ ... }
0 голосов
/ 21 августа 2010

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

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

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

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

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

0 голосов
/ 21 августа 2010

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

, если

foo(array());

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

foo();

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

...