文字列をインクリメント

$ php -r '$str = "zzz"; printf("%s\n", ++$str);'
aaaa

Zend/zend_operators.cのincrement_stringを見て知った。

ちょっとひねくれたことをやったら怒られた。当然か。

$ php -r '$str = "zzz"; printf("%s\n", ++$str[0]);'
PHP Fatal error:  Cannot increment/decrement overloaded objects nor string offsets in Command line code on line 1
Fatal error: Cannot increment/decrement overloaded objects nor string offsets in Command line code on line 1

$ php -r '$str = "zzz"; $c =& $str[0]; printf("%s\n", ++$c);'
PHP Fatal error:  Cannot create references to/from string offsets nor overloaded objects in Command line code on line 1
Fatal error: Cannot create references to/from string offsets nor overloaded objects in Command line code on line 1

ちなみにperlでもそうなのね。

$ perl -e '$str = "zzz"; printf "%s\n", ++$str;'
aaaa

って、マニュアルをよく見たらちゃんと書いてるのね。

PHP は、算術演算子で文字変数を扱った場合に C ではなく Perl の慣習に 従います。例えば、perl では 'Z'+1 は 'AA' を返しますが C では 'Z'+1 は '[' ( ord('Z') == 90, ord('[') == 91 ) を返します。 文字変数はインクリメントされることは可能ですがデクリメントは不可能であるということ、 またプレーンな ASCII 文字 (a-z および A-Z) のみがサポートされるということに注意しましょう。

今まで文字列をインクリメントしようとしなかったから知らなかった。