2015-07-19 6 views
8

Недавно я просматривал PHP 7, в частности return type declaration и type hinting. Я скомпилировал PHP 7 из источника (главная ветка от Github) и запускал его в виртуальной коробке Ubuntu 14.04. Я попытался запустить следующий код, чтобы получить тест нового Exceptions. Но он дал чистую страницу.Пустая страница, если я объявляю (strict_types = 1); в PHP 7 в верхней части файла

<?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: Return value of test() must be of the type string, array returned in /usr/share/nginx/html/test.php on line 7 in /usr/share/nginx/html/test.php:7 Stack trace: #0 /usr/share/nginx/html/test.php(10): test() #1 {main} thrown in /usr/share/nginx/html/test.php on line 7

Копания далее я добавил declare(strict_types=1); в верхней части, как показано ниже,

<?php declare(strict_types=1); 

ini_set('display_errors', 1); 

function test(): string { 

    return []; 
} 

echo test(); 

и ошибка, ошибка только что исчезла, оставив меня с пустой страницей. Я не могу понять, почему он дает мне пустую страницу?

ответ

15

После поиска вокруг Google и RFC, я пришел к follwing предложений в RFC,

This RFC further proposes the addition of a new optional per-file directive, declare(strict_types=1);, which makes all function calls and return statements within a file have “strict” type-checking for scalar type declarations, including for extension and built-in PHP functions.

Это означает, что не было ничего плохого с директивой 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(); 
+4

Спасибо, что вернулись, чтобы ответить на него, я, вероятно, столкнулся бы с одним и тем же, когда я, наконец, начну играть с 7 – dops

0

как ошибка заявляет, что ваша функция ожидает, что вы вернете строку, но вместо этого вы вернете массив! И функция жалуется, что нормально. Поэтому при возврате просто введите строковое значение. Это оно!