Тип 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?
Ответы
Ответ 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") {
...
}