最近我检查了PHP 7,特别是返回类型声明和类型提示.我从源代码编译了PHP 7(来自Github的 master分支)并在Ubuntu 14.04虚拟框中运行它.我尝试运行以下代码来测试新的异常.但它给了一个空白页面.
<?php
function test(): string {
return [];
}
echo test();
Run Code Online (Sandbox Code Playgroud)
然后我意识到我必须设置错误才能在屏幕上显示.所以我添加了ini_set('display_errors', 1);下面的老式,
<?php
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
Run Code Online (Sandbox Code Playgroud)
TypeError根据这个Throwable接口 RFC ,这让我按照预期进行了操作
致命错误:未捕获TypeError:test()的返回值必须是/usr/share/nginx/html/test.php第7行/usr/share/nginx/html/test.php中返回的字符串类型数组:7堆栈跟踪:#0 /usr/share/nginx/html/test.php(10):在第7行的/usr/share/nginx/html/test.php中抛出test()#1 {main}
进一步挖掘我declare(strict_types=1);在顶部添加如下,
<?php declare(strict_types=1);
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
Run Code Online (Sandbox Code Playgroud)
和爆炸,错误刚刚消失,留下我的空白页面.我无法弄清楚为什么它给我一个空白页?
pin*_*sia 20
围绕谷歌的搜索和RFC的后,我来到follwing句子RFC,
此RFC进一步建议添加一个新的可选的per-file指令,declare(strict_types = 1);,这使得文件中的所有函数调用和返回语句都对标量类型声明进行"严格"类型检查,包括扩展和内置PHP函数.
这意味着指令没有错,declare(strict_types=1)但问题是我调用ini_set()函数的方式.它期望第二个参数是string类型.
string ini_set ( string $varname , string $newvalue )
Run Code Online (Sandbox Code Playgroud)
我正在传递int,因此显示错误所需的设置本身无法设置,因此我被PHP严格模式的空白页面击中.然后我稍微更改了代码并传递了"1"下面的字符串,它工作正常.
<?php declare(strict_types=1);
ini_set('display_errors', "1");
function test(): string {
return [];
}
echo test();
Run Code Online (Sandbox Code Playgroud)