Недавно я проверял на PHP 7, в частности, декларация возвращаемого типа а также тип подсказки. Я скомпилировал PHP 7 из источника (главная ветка из Github) и запустив его в виртуальной коробке Ubuntu 14.04. Я попытался запустить следующий код, чтобы получить тест нового Исключения. Но это дало пустую страницу.
<?php
function test(): string {
return [];
}
echo test();
Затем я понимаю, что должен установить ошибку, которая будет отображаться на экране. Поэтому я добавил старомодный ini_set('display_errors', 1);
как ниже,
<?php
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
это дало мне следующий TypeError
как и ожидалось в соответствии с этим Интерфейс Throwable RFC
Фатальная ошибка: Uncaught TypeError: Возвращаемое значение test () должно быть
введите строку, массив, возвращенный в /usr/share/nginx/html/test.php на линии
7 в /usr/share/nginx/html/test.php:7 Трассировка стека: # 0
/usr/share/nginx/html/test.php(10): добавлено test () # 1 {main}
/usr/share/nginx/html/test.php в строке 7
Копая дальше я добавил declare(strict_types=1);
вверху, как показано ниже,
<?php declare(strict_types=1);
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
и взрыв, ошибка просто исчезла, оставив меня с пустой страницей. Я не могу понять, почему это дает мне пустую страницу?
После поиска в Google и RFC я пришел к следующему предложению в RFC,
В этом RFC также предлагается добавить новый необязательный файл
директива объявляет (strict_types = 1); делает все вызовы функций
и операторы return в файле имеют «строгую» проверку типов для
объявления скалярных типов, в том числе для расширения и встроенного PHP
функции.
Это означает, что с директивой все в порядке declare(strict_types=1)
но проблема была в том, как я звонил ini_set()
функция. Ожидается, что второй параметр string
тип.
string ini_set ( string $varname , string $newvalue )
Я проходил int
вместо этого, и, следовательно, настройки, необходимые для отображения ошибок, не удалось установить, и, следовательно, меня ударили
с пустой страницей строгим режимом PHP. Затем я немного изменил код и передал строку "1"
как ниже, и это сработало.
<?php declare(strict_types=1);
ini_set('display_errors', "1");
function test(): string {
return [];
}
echo test();
так как ошибка гласит, ваша функция ожидает, что вы вернете строку, но вместо этого вы вернете массив! И функция жалуется, что нормально. Так что по вашему возвращению просто поместите некоторое строковое значение. Это оно!