PHP 5.3中++运算符的奇怪行为

11

请看以下代码:

$a = 'Test';
echo ++$a;

这将输出:
Tesu

问题是,为什么?
我知道“u”在“t”之后,但为什么它不打印出“1”?
PHP文档:
此外,被递增或递减的变量将被转换为适当的数字数据类型 - 因此,以下代码将返回1,因为字符串Test首先被转换为整数0,然后递增。

4
在将字符串递增后打印1可能会让人感到奇怪。 - David Titarenco
4
我的猜测是 Michal 希望 ++ 将字符串隐式转换为整数,并像显式转换一样产生 0。考虑到 ++ 是一个数学运算符,这不是一个不合理的期望。 - GZipp
4
@Col. Shrapnel: $a + 1 不等同于 ++$a 或者 $a++ - BoltClock
@Col. Shrapnel - 很好的例子。我将它(无意冒犯)添加到我的答案中。字符串可以使用递增运算符进行递增,但除了连接之外,它们不能被“加入”。 - Peter Ajtai
@Peter 这并不是很好的例子。我只是指出了David的评论是毫无意义和傲慢的——在这种假设中没有什么“奇怪”的地方。这就是我说的。但通常情况下,没有人关心阅读。每个人都只想教导别人。我希望真正重要的问题中有这样的活动,而不是像这样糟糕的问题。 - Your Common Sense
显示剩余4条评论
3个回答

23

PHP在处理字符变量的算术运算时遵循Perl的约定,而不是C的约定。例如,在Perl中,'Z'+1会变成'AA',而在C中,'Z'+1会变成'['(ord('Z')==90,ord('[')==91)。请注意,字符变量可以递增但不能递减,即使递增也只支持纯ASCII字符(a-z和A-Z)。

来源:http://php.net/operators.increment


6
在PHP中,你可以对字符串进行递增操作(但是你不能使用加法运算符“增加”字符串,因为加法运算符会导致字符串被转换为int类型,你只能使用递增运算符来“增加”字符串!请看最后一个例子):
所以,"a" + 1"z"之后是"b",依此类推。
所以,在"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,而不会改变字符串本身。

1
编辑得不错,但是要说到点子上,字符串是“添加到”,也就是在你的代码中1被添加到0(“Test”的后转换值)。例如,尝试echo '7test' + 0; - GZipp
@GZipp - 那你会如何解释它们之间的区别?“字符串只能使用递增运算符进行添加,而不能使用加法运算符。”? - Peter Ajtai
我知道 PHP 中的连接运算符是什么。而且我误读了你之前的帖子。对此我深表歉意。我想说的是,在你的代码中,加法实际上是 0 + 1,我相信你已经知道了。 - GZipp
@GZipp - 谢谢你指出来。我只是试图找到一个简洁而准确的方式来解释所有这些.... - Peter Ajtai
是的,Peter,这就是我使用“在这个意义上”的原因。 - GZipp
显示剩余4条评论

2
在PHP中,增量运算符是针对字符串的序数值内部工作的。在递增之前,字符串不会被转换为整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接