如果我在PHP 7文件的顶部声明(strict_types = 1),会出现空白页面。

9

最近,我一直在研究 PHP 7 的技术,尤其是 返回类型声明类型提示。我从 Github 上编译了 PHP 7 源代码(master 分支),并在 Ubuntu 14.04 虚拟机中运行它。我尝试运行以下代码来测试新的 异常,但结果只出现了一个空白页面。

<?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接口的RFC,我得到了以下TypeError,这是预期的结果。

致命错误:在/usr/share/nginx/html/test.php的第7行中返回值类型必须为字符串(test() must be of the type string),但返回了数组(array returned)。堆栈跟踪:#0 /usr/share/nginx/html/test.php(10):test() #1 {main},并在/usr/share/nginx/html/test.php的第7行抛出异常。

进一步研究后,我在顶部添加了declare(strict_types=1);,如下所示:

<?php declare(strict_types=1);

ini_set('display_errors', 1);

function test(): string {

    return [];
}

echo test();

然后,崩溃了,错误消失了,留下了一个空白页面。我弄不明白为什么会给我一个空白页面?

2个回答

20
在谷歌和RFC上搜索后,我在RFC中找到了以下句子:
该RFC进一步提议添加一个新的可选每个文件指令,declare(strict_types=1);,它使文件中的所有函数调用和返回语句对标量类型声明进行“严格”类型检查,包括扩展和内置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();

6
感谢您回来回答问题,当我最终开始使用7时,我可能会遇到同样的情况。 - dops
非常有帮助。你为我节省了很多时间。谢谢。 - Mojtaba Rezaeian

-1

正如错误所述,您的函数期望您返回字符串,但实际上您返回了一个数组!函数抱怨是很正常的。因此,在您的返回语句中,只需放置一些字符串值即可解决问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接