【问题标题】:PHP Incorrect variable declarationPHP 不正确的变量声明
【发布时间】:2019-04-19 20:30:23
【问题描述】:

调试遗留代码,我遇到了一个奇怪的问题。遗留代码正在移至 PHP 7.2。我不知道它最初是为哪个版本的 PHP 编写的,但它确实适用于 PHP 5.6。

下面是我的问题示例...

$variable = '';
$variable['key'] = 'Hello World!';

echo $variable['key'] // H

当我回显$variable['key'] 时,它只会从值中获取第一个字符。我现在知道这是因为 $variable 最初被声明为字符串。

但是为什么这在 PHP 5.6 中有效呢?我可以做些什么来在 7.2 中完成这项工作而无需翻阅数千行代码?

有没有像strict_types 这样的指令我可以使用?

【问题讨论】:

  • 对于任何对不同 PHP 版本的输出感到好奇的人:3v4l.org/Q8iiY
  • 这是因为字符串'key'被视为整数时变为0 - 因为$variable是一个字符串你正在做的是'Hello World'[0] ...这是H
  • ^^^ 所以删除 $variable = ''; 或做 $variable = [];
  • 在我有限的搜索中找不到任何关于此行为的参考,但您可能只想修复所有错误代码——希望您的项目不会太大。无论哪种方式,这都是不正确的语法,不太确定为什么 PHP 5 会这样,除了:PHP。也找不到任何相关的 php.ini 设置。
  • 不幸的是,phpstan 不考虑这个坏代码。所以我也看不到自动解决这些问题的好方法。

标签: php php-5.6 legacy-code php-7.2


【解决方案1】:

来自 php.net

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

http://php.net/manual/en/language.types.string.php#language.types.string.substr

所以“key”被转换为0,并设置了第一个字符。 因为这是一个 char 类型,所以从给定的字符串中只设置了“H”。

$variable = '';
$variable['key'] = 'Hello World!';

echo $variable;       
echo $variable['key'];

如果您将代码更改为上述代码,您可以更好地了解发生了什么。

所以文本“你好世界!”在 PHP >= 7.1 中丢失并消失了,因为您设置了第一个字符,类型保持为 string

在 php 5.6 中你会得到 Notice: Array to string conversion in /in/N2poP on line 6

所以在以前的版本中,你覆盖了完整的变量,初始的空字符串就会消失,PHP 只是创建一个新数组。这种行为只发生在空字符串中!

这在文档中也有说明: http://php.net/manual/en/language.types.string.php#language.types.string.substr

注意:从 PHP 7.1.0 开始,将空索引运算符应用于空 字符串引发致命错误。以前,空字符串是无声的 转换为数组。

最简单的解决方案是删除 $variable = ''; 部分,无论如何它都是无效的,并且从未在您的旧代码中使用。或将其替换为$variable = [];

因为这种行为只发生在 php

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2016-03-31
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多