Тип Подсказка: Параметры по умолчанию - PullRequest
42 голосов
/ 15 декабря 2011

Подсказка типа 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?

Ответы [ 3 ]

75 голосов
/ 15 декабря 2011

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

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

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

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

function foo(Foo $arg) {

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

function foo(Foo $arg = null) {

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

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.

4 голосов
/ 15 января 2018

Объявления типов (также известные как подсказки типов в 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);
  • повторяемый - либо массив, либо экземпляр Traversable (> = PHP 7.1.0).
1 голос
/ 15 декабря 2011

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

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

...