Недавно я просматривал 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 interface RFC
Fatal error: 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 предлагает дополнительно добавить новую необязательную директиву для каждого файла, declare (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();
поскольку ошибка заявляет, что ваша функция ожидает, что вы вернете строку, но вместо этого вы вернете массив! И функция жалуется, что нормально. Поэтому при возврате просто введите строковое значение. Это оно!