Подсказка типа: параметры по умолчанию

Подсказка типов PHP 5

PHP 5 представляет подсказку типов. Теперь функции могут принудительно превращать параметры в объекты (путем указания имени класса в прототипе функции ) или arrays (начиная с PHP 5.1). Однако, если NULL используется в качестве значения параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.

Следующий отрывок из вышеизложенного:

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

Означает ли вышесказанное:

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

т.е. код в code1 неверен и приводит к:

Неустранимая ошибка: значение по умолчанию для параметров с подсказкой типа класса может быть только NULL

code1:

 function setName ( string $name = "happ") {
  ...
  }

Где, как код в code2, прав:

code2:

 function setName ( string $name = NULL) {
  ...
  }

Почему это ограничение назначается в php?


person ThinkingMonkey    schedule 15.12.2011    source источник


Ответы (3)


Вы не можете набирать строки, вы можете вводить только объекты и массивы, поэтому это неверно:

function setName ( string $name = "happ") {

(Причина, по которой вы не получаете здесь ошибки времени компиляции, заключается в том, что PHP интерпретирует «строку» как имя класса.)

Формулировка в документации означает, что если вы сделаете это:

function foo(Foo $arg) {

Тогда аргумент, переданный в foo (), должен быть экземпляром объекта Foo. Но если вы сделаете это:

function foo(Foo $arg = null) {

Тогда аргумент, переданный в foo (), может быть либо экземпляром объекта Foo, либо нулем. Также обратите внимание, что если вы сделаете это:

function foo(array $foo = array(1, 2, 3))

Тогда вы не можете вызвать foo (null). Если вам нужна эта функциональность, вы можете сделать что-то вроде этого:

function foo(array $foo = null) {
    if ($foo === null) {
        $foo = array(1, 2, 3);
    }

[Edit 1] Начиная с PHP 5.4, вы можете набирать подсказку callable:

function foo(callable $callback) {
    call_user_func($callback);
}

[Edit 2] Начиная с PHP 7.0, вы можете набирать подсказки bool, float, int и string. Это делает код в вопросе допустимым синтаксисом. Начиная с PHP 7.1, вы можете набирать подсказку iterable.

person Alex Howansky    schedule 15.12.2011
comment
Я просто хочу сказать будущим читателям, что, скорее всего, в ближайшем будущем php будет поддерживать подсказки скалярного типа в той или иной форме, поэтому этот ответ будет устаревшим. - person goat; 25.08.2012
comment
@rambocoder Мы все еще ждем подсказок скалярного типа в PHP 5.6. - person Buttle Butkus; 14.05.2014
comment
Строки хинтинга типов и другие скаляры теперь возможны в PHP 7, но я получаю эту ошибку, когда набираю хинтинг boolean $foo = true, потому что это должно быть bool $foo = true. Т.е. вы получите эту ошибку, если тип недействителен. - person Lars Nyström; 29.04.2016

Объявления типов (также известные как подсказки типа в PHP 5) типа string поддерживаются в PHP 7.

допустимые типы:

  • Имя класса / интерфейса (> = PHP 5.0.0);
  • self (> = PHP 5.0.0);
  • array (> = PHP 5.1.0);
  • callable (> = PHP 5.4.0);
  • bool, float, int, string (> = PHP 7.0.0);
  • iterable - либо массив, либо экземпляр Traversable (> = PHP 7.1.0).
person kenorb    schedule 15.01.2018

Это вопрос времени компиляции по сравнению со значениями времени выполнения. При компиляции допускаются только буквальные значения (строки, числа, логические значения и NULL). В настоящее время процессор PHP не может знать обо всех возможных классах, поэтому вы не можете создать экземпляр объекта в аргументах функции.

От выдержки я ожидаю того, что при обычной передаче NULL в функцию с подсказкой типа будет выдано исключение / ошибка. Если вы установите значение по умолчанию как NULL, тогда это исключение не будет генерироваться, если будет передано NULL. Я не тестировал это, чего и ожидал.

person Chris    schedule 15.12.2011
comment
Спасибо за: This is a matter of compilation time versus run time values. At compilation only literal values (strings, numbers, booleans and NULL) are allowed. ‹br/› Относительно второго абзаца см. Ответ выше. - person ThinkingMonkey; 15.12.2011
comment
Это очень устаревший ответ. - person Machado; 12.02.2018