从PHP版本7.2.0开始,“数组解除引用”如何处理类型为boolean / integer / float / string的标量值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从PHP版本7.2.0开始,“数组解除引用”如何处理类型为boolean / integer / float / string的标量值?相关的知识,希望对你有一定的参考价值。

我使用的是php 7.2。我从arrays chapter of PHP Manual 看到以下注释

取消引用不是字符串的标量值的数组静默产生NULL,即不发出错误消息。

我理解如何取消引用数组文字,但我无法理解“数组解除引用”如何在boolean / integer / float / string类型的标量值上工作?

如果你看一下PHP手册本身的代码示例,你可以注意到矛盾,因为根据手册,整数类型的值不是静默地产生NULL。

<?php
function getArray() {
    return array(1, 2, 3);
}
$secondElement = getArray()[1];
var_dump($secondElement); // int(2)
//According to the manual I expected it to be NULL as it's not of type string

如何取消引用boolean / integer / float类型的标量值与取消引用string类型的值不同?

答案

它们指的是非复杂类型,如int或float。

在您的示例中,您使用的是数组。所以你没有看到这个问题。

<?php
function getArray() {
    return array(1, 2222, 3);
}
$secondElement = getArray()[1]; // 2222

$null = $secondElement[123456]; // 123456 can be any number or string
var_dump($null);

// similarly:
$also_null = getArray()[1][45678];
var_dump($also_null);

第一对括号是数组上的数组解除引用(1,2222,3),第二对是整数(2222)上的数组解除引用,它总是返回null。

简化:

<?php
$a = 123456;
var_dump($a[42]); // is null
$a = 123.45;
var_dump($a[42]); // is null
$a = true;
var_dump($a[42]); // is null
$a = null;
var_dump($a[42]); // is null

这个“无声地失败”,因为理论上你应该从中得到一个错误,而不仅仅是null。

除了int,float,bool之外,还会出现null:

<?php 
$a = true;
var_dump($a[42][42][42][42][42][42][42][42]); // also null, and no errors

但是使用数组和字符串正确工作。

<?php
$a = "abc";
var_dump($a[1]); // b
$a = [11, 22, 33];
var_dump($a[1]); // 22

回答你的问题,“数组解除引用”如何处理类型的标量值“:它没有,它只返回null而不是返回某种错误。

以上是关于从PHP版本7.2.0开始,“数组解除引用”如何处理类型为boolean / integer / float / string的标量值?的主要内容,如果未能解决你的问题,请参考以下文章

Zabbix 5.0.0beta1版本初体验

Zabbix upgrade 5.0.0beta1

PHP 字符串部分隐藏

httpd 不会从添加的 php 行开始

监控系统—zabbix部署

监控系统—zabbix部署