Единственным допустимым аргументом по умолчанию для вызываемого объекта является NULL
. Это частично документировано, но не ясно и не полностью документировано (насколько я могу найти). Синтезируя из руководства, вы можете сделать вывод, что анонимные функции запрещены. Другие допустимые типы, которые можно вызывать, также не допускаются в качестве значений по умолчанию для параметров с подсказкой, которую можно вызвать, но этого нет в руководстве (насколько я могу судить).
Страница справки аргументов указывает, что только скаляры, массивы и NULL
могут быть аргументами по умолчанию. Вызываемыми объектами могут быть объекты (Closure
или объекты с методом __invoke
), массивы из 2 элементов (класс или объект и имя метода) или строки. Объекты не являются скалярами (как указано на справочной странице is_scalar
) и, следовательно, не могут использоваться в качестве аргументов по умолчанию (что исключает анонимные функции), даже для нетипизированных параметров. Если исходить из руководства, это может показаться, что для параметров, которые можно вызвать, по умолчанию используются строки и массивы, но если вы попытаетесь использовать строку или массив, PHP выдаст ошибку:
Значение по умолчанию для параметров с вызываемым типом может быть только NULL
Хотя массивы и строки (как правило) разрешены в качестве значений по умолчанию, они не всегда могут быть проверены на тип во время компиляции для вызываемых; они могут ссылаться на вызываемый объект, который еще не определен, в результате чего проверка типа приводит к ложному отрицанию. Я подозреваю, что из-за этого они исключены из значений по умолчанию для вызываемых абонентов.
Если вы хотите иметь необязательный вызываемый аргумент, вы должны использовать NULL
в качестве значения по умолчанию, а затем проверить переменную в функции. Требования к обоим имеют необязательный аргумент и не проверяют аргумент несовместимы.