PHP:为什么零长度字符串上的数组语法将字符串转换为数组?

艾伦·斯托姆(Alan Storm)

在PHP中,可以使用数组语法访问字符串索引。以下程序

<?php
$foo = "Hello";
echo $foo[0],"\n";
?>

呼应

H

但是,如果您访问长度为零的字符串的第一个字符

<?php
$bar = "";
$bar[0] = "test";
var_dump($bar);
?>

PHP将您的字符串转换为数组。上面的代码产生

array(1) {
    [0] =>
    string(4) "test"
}

即我零长度的字符串被强制转换为数组。类似的“访问字符串的未定义索引”示例不会产生这种转换行为。

$bar = " ";
$bar[1] = "test";
var_dump($bar);

产生字符串t$bar仍然是一个字符串,并且不会转换为数组。

当语言需要为您推断和/或自动转换变量时,我会不可避免地遇到这种不直观的情况,但是有人知道这里的幕后情况吗?

即在PHP中的C / C ++级别发生了什么,以实现这一目标。为什么我的变量变成数组。

PHP 5.6,如果那很重要的话。

罗穆德·维莱特(Romuald Villetet)

在C级别,当使用using []运算符完成赋值后,变量将转换为数组。当然,当它是一个字符串时,其长度为0且不是未设置的调用类型(例如,unset($ test [0]))。

case IS_STRING: {
                zval tmp;

                if (type != BP_VAR_UNSET && Z_STRLEN_P(container)==0) {
                    goto convert_to_array;
                }

https://github.com/php/php-src/blob/PHP-5.6.0/Zend/zend_execute.c#L1156

布尔假值也会发生相同的转换。

case IS_BOOL:
            if (type != BP_VAR_UNSET && Z_LVAL_P(container)==0) {
                goto convert_to_array;
            }

通过测试确认:

<?php
$bar = false;
$bar[0] = "test";
var_dump($bar);

输出:

array(1) { [0]=> string(4) "test" }

使用true时:

<?php
$bar = true;
$bar[0] = "test";
var_dump($bar);

输出:

WARNING Cannot use a scalar value as an array on line number 3
bool(true)

https://github.com/php/php-src/blob/PHP-5.6.0/Zend/zend_execute.c#L1249

当该值是bool类型且值为true时,将执行以下代码:

case IS_BOOL:
            if (type != BP_VAR_UNSET && Z_LVAL_P(container)==0) {
                goto convert_to_array;
            }
            /* break missing intentionally */

        default:
            if (type == BP_VAR_UNSET) {
                zend_error(E_WARNING, "Cannot unset offset in a non-array variable");
                result->var.ptr_ptr = &EG(uninitialized_zval_ptr);
                PZVAL_LOCK(EG(uninitialized_zval_ptr));
            } else { // Gets here when boolean value equals true.
                zend_error(E_WARNING, "Cannot use a scalar value as an array");
                result->var.ptr_ptr = &EG(error_zval_ptr);
                PZVAL_LOCK(EG(error_zval_ptr));
            }
            break;

PHP 5.6版使用ZEND 2.6.0版

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP:为什么零长度字符串上的数组语法将字符串转换为数组?

来自分类Dev

为什么我的 PHP Curl POST 请求将数据数组转换为字符串?

来自分类Dev

将jQuery数组字符串转换为PHP数组

来自分类Dev

将jQuery数组字符串转换为PHP数组

来自分类Dev

将php字符串转换为数组数组

来自分类Dev

为什么将此字符串值转换为数组?

来自分类Dev

将数组转换为字符串

来自分类Dev

将字符串转换为数组

来自分类Dev

将数组转换为字符串

来自分类Dev

PHP将数组转换为所需的字符串格式

来自分类Dev

PHP将字符串转换为多维数组

来自分类Dev

PHP将字符串数组列表转换为Array

来自分类Dev

PHP:将字符串转换为嵌套数组

来自分类Dev

使用php将字符串转换为数组

来自分类Dev

将数组转换为JSON字符串php

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

将javascript字符串转换为php数组

来自分类Dev

将字符串数组转换为整数php

来自分类Dev

将字符串转换为单个数组,PHP

来自分类Dev

PHP将目录的多维数组转换为字符串

来自分类Dev

PHP将字符串转换为数组

来自分类Dev

将JSON字符串转换为php中的数组?

来自分类Dev

将PHP数组转换为字符串?

来自分类Dev

PHP将数组转换为所需的字符串格式

来自分类Dev

PHP:将多维数组转换为字符串

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

PHP将字符串转换为JSON或数组

来自分类Dev

将HTML字符串转换为PHP数组

来自分类Dev

将数组转换为字符串php