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

Blank page if I declare(strict_types=1); in PHP 7 at top of the file

最近我正在查看 PHP 7,特别是 return type declaration and type hinting. I have compiled PHP 7 from source(master branch from Github) and running it in Ubuntu 14.04 virtual box. I tried to run following code to get a test of new 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

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();

砰的一声,错误消失了,留下了空白页。我不明白为什么它给我一个空白页?

在搜索 google 和 RFC 后,我在 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();

正如错误所述,您的函数希望您使用 return 字符串,但您却 return 一个数组!和功能抱怨这是正常的。所以在你的 return 上简单地放一些字符串值。就是这样!