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

时间:2010-09-26 19:58:51

标签: php operators

请注意以下代码:

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

这将输出:

Tesu

问题是,为什么?

我知道“你”是在“t”之后,但为什么它不打印“1”???

编辑: Becouse Zend书籍教授以下内容:

  

此外,变量递增   或递减将转换为   适当的数字数据   类型 - 因此,以下代码将   返回1,因为字符串Test是   首先转换为整数   0,然后递增。

3 个答案:

答案 0 :(得分:23)

  

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

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

答案 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;
?>

live example

以上内容利用了字符串只能在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运算符在内部处理字符串的序数值。在递增之前,字符串不会转换为整数。