Отличаются ли int от строк при подсказке типа в PHP - PullRequest
0 голосов
/ 23 января 2019

Я экспериментировал с подсказками типов в PHP и кое-что натолкнулось на некоторые тесты. У меня есть эта функция:

function foobar(string $foo)
{
    return gettype($foo);
}

Я экспериментировал с двумя вариантами использования:

echo foobar(4);
echo foobar('hello, world');

Оба эти вывода string. Это мгновенно звучит странно для меня, потому что я передаю целое число при первом использовании. Я тогда для пинки попробовал добавить:

print_r(foobar(['hello']));

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

Взято из здесь показывает, что int отличается от строки:

+=======+==================================+
| int   | The parameter must be an integer |
+=======+==================================+
|string | The parameter must be a string   |
+=======+==================================+

Так почему string $foo разрешает мой foobar(4) и возвращает string?

1 Ответ

0 голосов
/ 24 января 2019

Как уже упоминалось в комментариях, PHP 7.0 представил объявления скалярных типов и, чтобы начать отходить от беспорядочной свободной типизации, обеспечил "строгий" режим. По умолчанию «принудительный» режим позволяет PHP оставаться таким же свободным, как и раньше.

Когда вы указываете строковый тип для аргумента в принудительном режиме, вы говорите PHP, что вы хотите, чтобы аргумент был строкой, и что он должен попытаться сделать его строкой, если это не так.

Добавив объявление в качестве первой строки вашего кода, вы можете изменить режим, чтобы получить желаемое поведение:

<?php
declare(strict_types=1);

function foobar(string $foo)
{
    return gettype($foo);
}

try {
    echo foobar(4);
} catch (\TypeError $e) {
    echo $e->getMessage();
}
...