ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°

PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ прСфиксныС ΠΈ постфиксныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°. Π­Ρ‚ΠΈ ΡƒΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ НазваниС ДСйствиС
++$a ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ $a Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $a.
$a++ ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $a, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ $a Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.
--$a ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ $a Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $a.
$a-- ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $a, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ $a Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°

<?php

echo 'ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);

echo
'ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);

echo
'ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);

echo
'ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:
int(5)
int(6)
ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:
int(6)
int(6)
ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:
int(5)
int(4)
ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚:
int(4)
int(4)
Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° логичСскиС значСния (bool). Начиная с PHP 8.3.0 вызываСтся ошибка уровня E_WARNING, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ нСявно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа (int).

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° Π½Π΅ влияСт Π½Π° значСния null. Начиная с PHP 8.3.0 вызываСтся ошибка уровня E_WARNING, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ нСявно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа (int).

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° Π½Π΅ влияСт Π½Π° Π½Π΅- числовыС строки. Начиная с PHP 8.3.0 вызываСтся ошибка уровня E_WARNING, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TypeError.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ слоТСния ΠΈ/ΠΈΠ»ΠΈ вычитания, ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ/ΠΈΠ»ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Один Ρ‚Π°ΠΊΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” это GMP.

Ѐункция увСличСния строки PERL

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

Начиная с PHP 8.3.0 эта функция мягко устарСла. ВмСсто этого Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ str_increment().

Π’ PHP ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅- Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ строку. Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ ASCII. Π‘ΡƒΠΊΠ²Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π±ΡƒΠΊΠ²Ρ‹, ΠΏΡ€ΠΈ достиТСнии Π±ΡƒΠΊΠ²Ρ‹ Z ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ пСрСносится Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ разряд слСва. НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ $a = 'Z'; $a++; ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«AAΒ».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ увСличСния строки PERL

<?php

echo '== Π‘ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ строки ==' . PHP_EOL;
$s = 'W';
for (
$n=0; $n<6; $n++) {
echo ++
$s . PHP_EOL;
}
// Π‘ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ строки Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΈΠ½Π°Ρ‡Π΅
echo '== Π‘ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ строки ==' . PHP_EOL;
$d = 'A8';
for (
$n=0; $n<6; $n++) {
echo ++
$d . PHP_EOL;
}
$d = 'A08';
for (
$n=0; $n<6; $n++) {
echo ++
$d . PHP_EOL;
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

== Π‘ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ строки ==
X
Y
Z
AA
AB
AC
== Π‘ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ строки ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13
A14
Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

Если Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-цифровая строка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ числовая строка, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΊ Ρ‚ΠΈΠΏΡƒ int ΠΈΠ»ΠΈ float. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° встаёт особСнно остро со строками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выглядят ΠΊΠ°ΠΊ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, записанныС Π² Π½Π°ΡƒΡ‡Π½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Ѐункция str_increment() Π½Π΅ страдаСт ΠΎΡ‚ эти нСявных ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 Π‘ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-цифровая строка, прСобразованная Π² число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ

<?php

$s
= "5d9";
var_dump(++$s);
var_dump(++$s);

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

string(3) "5e0"
float(6)

Π’Π°ΠΊ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«5e0Β» Π±Ρ‹Π»ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float) ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ 5.0 ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ увСличСния.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 1 note

up
67
hartmut at php dot net ΒΆ
13 years ago
Note that 

$a="9D9"; var_dump(++$a);   => string(3) "9E0"

but counting onwards from there 

$a="9E0"; var_dump(++$a);   => float(10)

this is due to "9E0" being interpreted as a string representation of the float constant 9E0 (or 9e0), and thus evalutes to 9 * 10^0 = 9 (in a float context)