【发布时间】:2016-05-26 20:48:57
【问题描述】:
在 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,如果这很重要的话。
【问题讨论】:
-
不,你通过
$bar[0] = "test";创建了一个数组 -
@RiggsFolly 不,我没有,当我说
$bar = ""时,我创建了一个字符串。当我尝试访问字符串 (0) 中不存在的索引时,PHP 将该字符串转换为数组。试试脚本脚本$bar = " "(单字符串) -
@E_p 我预计会引发错误,或者 PHP 推断我想将字符串从零长度扩展到一,并将一个字符分配给数组的第一个索引,类似于 @ 987654332@ 工作。回复:最后一个,我希望我的编程语言能够始终如一地处理这种奇怪的演员阵容。它没有,我知道会发生这种情况,但我很好奇为什么。
-
@RomualdVilletet 或者在世界上最受欢迎的编程问答网站上提问 :)
-
没有强制转换,显然在第一个示例中,您正在“访问”已定义字符串的位置。在第二个示例中,您正在“创建”一个索引为 0 的数组元素。
$s='hello'; $s=array(0=>'test');是否应该触发错误?同样的事情。
标签: php types casting php-internals