Почему пустая строка выходной функции не покрывает целое число? - PullRequest
0 голосов
/ 02 июня 2019

Зачем следовать функции, возвращающей 1 (целое число):

<?php

function f() : int
{
    return '1';
}

Но вызовите эту функцию:

function f() : int
{
    return '';
}

вызовет ошибку:

Fatal error: Uncaught TypeError: Return value of f() must be of the type int, string returned in /Users/alm/test_int.php:5

Для меня логически должно возвращаться 0 (целое число). Пожалуйста, отправьте ссылку на php документацию о приведении типа вывода функции. Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Наконец я нашел документацию, объясняющую, почему '' нельзя преобразовать в 0:

† Нецифровые строки не принимаются.Числовые строки с завершающими символами принимаются, но выдают уведомление.

См. «Поведение проверок слабого типа» в здесь

0 голосов
/ 02 июня 2019

Хотя я не понимаю вашего утверждения о том, что неявное преобразование из пустой строки в int приведет к 0, вы действительно можете сделать это, используя явное преобразование типов.

Рассмотрите этот код:

function f() :  int {
    return '0';
}

function g() :  int {
    return (int)'';
}

function h() :  int {
    return '';
}

echo 'f: ' . f();
echo '<br />';
echo 'g: ' . g();
echo '<br />';
echo 'h: ' . h();

Функция g фактически возвращает int со значением 0.Функция h не работает (соответствует функции в вашем примере).Вывод:

f: 0
g: 0
FATAL ERROR Uncaught TypeError: Return value of h() must be of the type integer, string returned in ...

Так что, если вы сделали явное приведение при возврате функции (то есть return (int)'';), вы получите 0.

Если вы хотите принять строковый параметр и затем вывести его как целое число, просто используйте явное приведение еще раз:

function f($p) :  int {
    return (int)$p;
}

echo '0: ' . f(0);
echo '<br />';
echo "'0': " . f('0');
echo '<br />';
echo "'': " . f('');

Выходы:

0: 0
'0': 0
'': 0
...