【问题标题】:PHP 7.2 is_array not eval to truePHP 7.2 is_array 不评估为真
【发布时间】:2018-10-19 03:33:15
【问题描述】:

所有,我有一个类,在顶部定义了一些变量,如下所示:

var $conditionStyle = '';

以后我可以这样设计一件东西:

$this -> conditionStyle = 'someStyle';

或者像这样的多个东西:

$this->conditionStyle[$this->styleRowsCount] = 'someStyle';

接下来我会看看 conditionStyle 是不是一个数组:

if(is_array($this-> conditionStyle) {...}

在 php 7.0 和更早的版本中,这评估得很好。对于 7.2,我必须使用 settype() 否则无法正确评估。这是 7.2 的问题还是 7.2 纠正了以前版本中的缺陷?

【问题讨论】:

  • 您将$conditionStyle 初始化为字符串,然后尝试将其视为数组。这是行不通的。为什么变量不能总是数组?这在 5.6、7.0、7.1 或 7.2 中不起作用。
  • @fubar 它确实有效,只是以通常的古怪 PHP 方式。
  • @bishop,我对 5.6 - 7.0 中的测试进行了纠正。他们确实有效。但是在 7.1+ 中它不起作用并引发致命异常:3v4l.org/JRLCS
  • @fubar 是的,根据 PHP 7.1 发行说明,这确实会显式抛出异常:数组附加在字符串上 = 繁荣。但是有什么作用......这是古怪的部分......是数组通过索引分配给一个字符串。我认为OP正在做后者,否则OP会遇到异常。

标签: php arrays variable-types


【解决方案1】:

PHP 7.1 改变了这段代码的行为:

$x = '';
$x[3] = 'foo';

在 $x 是:

array (
   3 => 'foo',
)

在 >= 7.1 中,它是:

string '   f'

See it online at 3v4l.org.

这个改动不好PHP 7.1 Release Notes中提到:

字符串不再支持空索引运算符
将空索引运算符应用于字符串(例如 $str[] = $x)会引发致命错误,而不是静默转换为数组。

进行此更改的 PR 也有您注意到的副作用,并且在该页面的“注释”部分中显示为 someone else commented

你应该在一开始就将你的变量初始化为一个数组以在所有版本中工作。

【讨论】:

  • 谢谢,这正是我在使用 7.2 时所看到的。在尝试将变量用作数组之前,我只是添加了 settype()。
  • @JasonPate 当然,settype 的使用非常好。您还可以使用(array) 强制转换为数组。但是,请考虑您未来的自己或后续的维护者可能会喜欢在一开始就将类型规范化为数组。
  • 很好的解释。
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多