请注意以下代码:
$a = 'Test';
echo ++$a;
这将输出:
Tesu
问题是,为什么?
我知道“你”是在“t”之后,但为什么它不打印“1”???
编辑: Becouse Zend书籍教授以下内容:
此外,变量递增 或递减将转换为 适当的数字数据 类型 - 因此,以下代码将 返回1,因为字符串Test是 首先转换为整数 0,然后递增。
答案 0 :(得分:23)
PHP在处理字符变量而不是C的算术运算时遵循Perl的约定。例如,在Perl'Z'+ 1变成'AA',而在C'Z'+ 1变成'['(ord('Z')== 90,ord('[')== 91) 。请注意,字符变量可以递增但不递减,即使只支持纯ASCII字符(a-z和A-Z)。
答案 1 :(得分:6)
在PHP中你可以增加字符串(但你不能使用加法运算符“增加”字符串,因为加法运算符会导致字符串被强制转换为int
,你只能使用递增运算符来“增加“字符串!......见最后一个例子”:
"a" + 1
来"b"
之后"z"
为"aa"
,依此类推。
在"Test"
"Tesu"
在使用PHP的自动类型强制时,您必须注意上述内容。
<?php
$a="+10.5";
echo ++$a;
// Output: 11.5
// Automatic type coercion worked "intuitively"
?>
<?php
$a="$10.5";
echo ++$a;
// Output: $10.6
// $a was dealt with as a string!
?>
如果你想处理字母的ASCII序号,你必须做一些额外的工作。
如果您想将字母转换为ASCII序号,请使用 ord() ,但这一次只能在一个字母上使用。
<?php
$a="Test";
foreach(str_split($a) as $value)
{
$a += ord($value); // string + number = number
// strings can only handle the increment operator
// not the addition operator (the addition operator
// will cast the string to an int).
}
echo ++$a;
?>
以上内容利用了字符串只能在PHP中递增的事实。使用加法运算符无法增加它们。在字符串上使用加法运算符会导致它转换为int
,所以:
<?php
$a = 'Test';
$a = $a + 1;
echo $a;
// Output: 1
// Strings cannot be "added to", they can only be incremented using ++
// The above performs $a = ( (int) $a ) + 1;
?>
在添加Test
之前,上述内容会尝试将“(int)
”投射到1
。将“Test
”投射到(int)
会产生0
。
注意:无法递减字符串:
请注意,字符变量可以递增但不会递减,即使只支持纯ASCII字符(a-z和A-Z)。
之前的意思是echo --$a;
实际上会打印Test
而根本不更改字符串。
答案 2 :(得分:2)
PHP中的increment运算符在内部处理字符串的序数值。在递增之前,字符串不会转换为整数。