php функция foo(массив $arg = NULL) - почему массив и NULL?

Я видел несколько раз в последнее время:

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

Мой вопрос, почему сделать по умолчанию $argNULL когда он будет просто приведен в массив? Почему бы не сделать:

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

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

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

6 ответов

Решение

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

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

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

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

=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) { ... }

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

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

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){ ... }

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

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

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

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

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

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

если

foo(array());

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

foo();

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

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