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将字符串数组列表转换为Array

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将数组转换为字符串

来自分类Dev

将javascript字符串转换为php数组

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

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

来自分类Dev

将数组转换为JSON字符串php

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将字符串转换为数组

来自分类Dev

PHP将字符串转换为数组

来自分类Dev

将PHP数组转换为字符串?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

PHP将JSON字符串转换为数组

来自分类Dev

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

来自分类Dev

将HTML字符串转换为PHP数组

来自分类Dev

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

来自分类Dev

将数组转换为字符串php

来自分类Dev

将数组转换为字符串

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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