Смотреть следующий код:
$a = 'Test'; echo ++$a;
Это приведет к выводу:
Tesu
Вопрос в том, почему?
Я знаю, что «u» после «t», но почему он не печатает «1» ???
EDIT: Becouse Книги Zend учат:
Кроме того, переменная, увеличивающаяся или уменьшенная, будет преобразована в соответствующий тип числовых данных, поэтому следующий код вернет 1, потому что строка Test сначала преобразуется в целое число 0, а затем увеличивается.
В PHP вы можете увеличивать строки (но вы не можете «увеличивать» строки с помощью оператора сложения, так как оператор добавления приведет к тому, что строка будет передана в int
, вы можете использовать оператор increment для «увеличения» строк! … см. последний пример):
Итак, "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 (az и AZ).
Предыдущее означает, что echo --$a;
на самом деле напечатает Test
без изменения строки.
PHP следует за соглашением Perl при работе с арифметическими операциями над символьными переменными, а не с C. Например, в Perl 'Z' + 1 превращается в 'AA', а в C 'Z' + 1 превращается в '[' (ord ('Z') == 90, ord ('[') == 91) , Обратите внимание, что символьные переменные могут увеличиваться, но не уменьшаться, и поэтому поддерживаются только простые символы ASCII (az и AZ).
Источник: http://php.net/operators.increment
Оператор приращения в PHP работает с порядковыми значениями строк внутри. Строки не добавляются к целым числам до приращения.