Подтвердить что ты не робот

Тип Hinting: параметры по умолчанию

Тип подсказки

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

Следующая выдержка из вышесказанного:

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

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

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

code1:

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

Если код в коде2 прав:

code2:

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

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

4b9b3361

Ответ 1

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

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

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

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

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);
    }

Изменить: Начиная с PHP 5.4, вы также можете набирать текст:

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

Ответ 2

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

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

Ответ 3

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

Действительно?

Итак, проверьте это: https://gist.github.com/qeremy/cd5de6397dd732751fec

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

function foo(int $x, float $y) { print $x * $y; }
foo(3, 1.5);
foo(3, 1); // boom!

class User {
    public function theName(string $name) { print $name; }
}

$u = new User();
$u->theName('kerem');

Ответ 4

попробуйте это

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