如果我声明空白页(strict_types = 1);在PHP 7的顶部

时间:2015-07-19 12:30:05

标签: php strict php-7

最近,我正在查看PHP 7,特别是return type declarationtype 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();
然后爆炸,错误就消失了,留下了我的空白页面。我无法弄清楚为什么它会给我一个空白页?

2 个答案:

答案 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)

因为错误声明你的函数希望你返回字符串但是你返回一个数组!功能抱怨这是正常的。所以在你的回报中只需输入一些字符串值。那就是它!