最近,我正在查看PHP 7,特别是return type declaration和type hinting。我从源代码编译了PHP 7(来自Github的主分支)并在Ubuntu 14.04虚拟框中运行它。我尝试运行以下代码来测试新的Exceptions。但它给了一个空白页。
<?php
function test(): string {
return [];
}
echo test();
然后我意识到我必须设置错误才能在屏幕上显示。所以我在下面添加了老式的ini_set('display_errors', 1);
,
<?php
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
根据此Throwable interface RFC
,我按照预期TypeError
进行了操作
致命错误:未捕获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}抛出 第7行的/usr/share/nginx/html/test.php
进一步挖掘我在顶部添加了declare(strict_types=1);
,如下所示
<?php declare(strict_types=1);
ini_set('display_errors', 1);
function test(): string {
return [];
}
echo test();
然后爆炸,错误就消失了,留下了我的空白页面。我无法弄清楚为什么它会给我一个空白页?
答案 0 :(得分:17)
在搜索谷歌和RFC之后,我来到了RFC中的句子,
此RFC进一步建议添加新的可选每个文件 指令,声明(strict_types = 1);,它进行所有函数调用 文件中的return语句具有“strict”类型检查功能 标量类型声明,包括扩展和内置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();
答案 1 :(得分:0)
因为错误声明你的函数希望你返回字符串但是你返回一个数组!功能抱怨这是正常的。所以在你的回报中只需输入一些字符串值。那就是它!