【问题标题】:What's the meaning of "assigning an empty string" in this context?在这种情况下“分配一个空字符串”是什么意思?
【发布时间】:2017-12-30 02:11:06
【问题描述】:

我正在使用 PHP 7.1.0

我在 [PHP 手册的字符串章节][1][1] 中遇到以下令人困惑的文字

警告 写入超出范围的偏移会用空格填充字符串。 非整数类型转换为整数。非法偏移类型发出 E_NOTICE。仅使用分配字符串的第一个字符。作为 在 PHP 7.1.0 中,分配空字符串会引发致命错误。 以前,它分配了一个 NULL 字节。

我努力从上面的文字中理解子句的意思

“只使用分配字符串的第一个字符。”

"从 PHP 7.1.0 开始,分配空字符串会引发致命错误。 以前,它分配了一个 NULL 字节。”

上面两个语句的第一个语句我完全看不懂。

对于第二个语句,我尝试通过实际代码来理解它。因此,为此我编写了以下代码,但我不确定此代码是否演示了手册中的语句想要说的内容。以下是我的代码 sn-p。从中,告诉我我是否正确理解了该语句并且是否正确编写了代码以演示 PHP 手册中语句的含义。如果我做错了,请相应地更正我的代码以符合 PHP 手册中的声明。

代码片段:

<?php 
$rootbeer = 'A & W';
$rootbeer[] = 'N';
?>

PHP 7.1.0 中的输出:

Fatal error: Uncaught Error: [] operator not supported for strings in hello.php:3 Stack trace: #0 {main} thrown in hello.php on line 3

PHP 5.6.30 中的输出:

Fatal error: [] operator not supported for strings in hello.php on line 3

从上面的两个输出中,我在 PHP 5.6.30 的任何地方都看不到 NULL byte 被分配给某些东西。与这两个版本一样,我得到几乎相同的输出,同样的错误。

请演示 PHP 7.1.0 和 PHP 5.6.30 中的输出之间的区别。这样我就可以更好地理解这些差异。

【问题讨论】:

    标签: php string offset fatal-error php-7.1


    【解决方案1】:

    您没有分配空字符串,也没有使用超出范围的偏移量。我相信您想尝试的代码如下所示:

    <?php
    $rootbeer = 'A & W';
    $rootbeer[7] = '';
    echo $rootbeer;
    

    这将在 PHP 5.6 中正常工作并输出文档中提到的填充字符串。

    在 PHP 7.1+ 中,您会收到警告

    PHP 警告:无法将空字符串分配给 yourfile.php 第 3 行中的字符串偏移量

    并且字符串不会被改变。

    【讨论】:

    • 我知道这件事。在手册中明确提到 >“从 PHP 7.1.0 开始,分配空字符串会引发致命错误。但在您的代码中,它只是给出警告。您的代码没有证明正在生成致命错误。
    • 这确实是个谜。我查看了PHP interpreter 的来源,这个警告确实是在 7.1 版中引入的。那么,也许文档只是不同意实施?让我感到奇怪的巧合是,行为改变发生在正确的版本上,而不是描述的方式。
    • 感谢您的密切关注。请您演示一下语句“从 PHP 7.1.0 开始,对字符串应用空索引运算符会引发致命错误。以前,字符串被静默转换为数组。”有一些合适的鳕鱼例子?再次感谢。我在等你的回复。
    • 我的意思是那个致命错误似乎不存在。虽然文件github.com/php/php-src/blob/PHP-7.0.27/Zend/zend_execute.c 没有警告,但您会在github.com/php/php-src/blob/PHP-7.1.0/Zend/zend_execute.c 中找到上面引用的警告。在同一个函数中没有致命错误,我希望它出现在那个地方。
    • 感谢jsfan。请帮我解决这个问题stackoverflow.com/questions/48030816/…
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 2012-04-21
    • 2014-10-27
    • 2019-10-15
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多