Тип подсказки
PHP 5 вводит Type Hinting. Теперь функции могут заставить объекты быть объектами (путем указания имени класса в прототипе функции) или массивов (начиная с PHP 5.1). Однако, если NULL используется как значение параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.
Следующая выдержка из вышесказанного:
если NULL используется как значение параметра по умолчанию, он будет разрешен в качестве аргумента для любого последующего вызова.
Означает ли это следующее:
если параметры по умолчанию использовать с типом, он может иметь только значение NULL в качестве значения по умолчанию.
т.е. код в коде1 неверен и приводит к:
Неустранимая ошибка: значение по умолчанию для параметров с подсказкой типа класса может быть только NULL
function setName ( string $name = "happ") { ... }
Если код в коде2 прав:
function setName ( string $name = NULL) { ... }
Почему это ограничение назначено в php?
Вы не можете вводить строки, вы можете вводить только объекты и массивы типа type, поэтому это неверно:
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); }
Это вопрос времени времени компиляции и времени выполнения. При компиляции допускаются только буквенные значения (строки, числа, логические и NULL). В настоящее время PHP-процессор не может знать обо всех возможных классах, поэтому вы не можете создать экземпляр объекта в аргументах функции.
То, что я ожидаю от выдержки, состоит в том, что, в то время как обычная передача NULL в тип намеченной функции вызовет исключение / ошибку. Если вы установите значение по умолчанию как NULL, то это исключение не будет выбрано, если NULL передан. Я не проверял это, просто то, что я ожидал бы.
Вы не можете вводить строки, вы можете вводить только объекты и массивы.
В самом деле?
Итак, проверьте это: 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');
попробуй это
function setName ($name = "happ") { ... }