ВыраТСния

ВыраТСния β€” самыС Π²Π°ΠΆΠ½Ρ‹Π΅ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты PHP. ΠŸΠΎΡ‡Ρ‚ΠΈ всё, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ Π² PHP, β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π‘Π°ΠΌΠΎΠ΅ простоС ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ выраТСния β€” «всё, Ρ‡Ρ‚ΠΎ вычисляСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β».

Π“Π»Π°Π²Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” константы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’ записи $a = 5 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 присвоится ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 ΠΈΠ»ΠΈ, говоря ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, 5 β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 5; Π² этом случаС 5 β€” цСлочислСнная константа.

ПослС этого присваивания оТидаСтся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π²Π½ΠΎ 5, поэтому, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ $b = $a, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ это сработаСт Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ написали $b = 5. Говоря ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, пСрСмСнная $a β€” Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 5. Всё Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

НСмного Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

<?php

function foo ()
{
return
5;
}
?>

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ познакомился с ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π³Π»Π°Π²Π΅ «О функциях», ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ присваиваниС $c = foo() ΠΏΠΎ смыслу Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡŽ $c = 5, ΠΈ оказался Π±Ρ‹ ΠΏΡ€Π°Π². Ѐункция β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния foo() Ρ€Π°Π²Π½ΠΎ 5, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция foo() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 5. Часто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ статичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, значСния Π² PHP Π½Π΅ обязаны Π±Ρ‹Ρ‚ΡŒ цСлочислСнными, ΠΈ часто это Π½Π΅ Ρ‚Π°ΠΊ. Π―Π·Ρ‹ΠΊ PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ‚ΠΈΠΏΠ° скалярных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: цСлочислСнныС int, значСния с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ float, строковыС string ΠΈ логичСскиС bool. Бкалярными Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя Β«Ρ€Π°Π·Π±ΠΈΡ‚ΡŒΒ» Π½Π° мСньшиС части, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ массивов. Π•Ρ‰Ρ‘ PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° слоТных (составных, ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹Ρ… β€” нСскалярных) Ρ‚ΠΈΠΏΠ°: массивы ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Однако PHP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ выраТСния Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡˆΠΈΡ€Π΅, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки. PHP β€” язык с ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Π½Π° выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‡Ρ‚ΠΈ всё Π² ΠΊΠΎΠ΄Π΅ рассматриваСт ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ВСрнёмся ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ: $a = 5. Π›Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь содСрТится Π΄Π²Π° значСния β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ цСлочислСнной константы 5 ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a, которая Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. Но, хотя это Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, здСсь содСрТится Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ самого присваивания. Π‘Π°ΠΌΠΎ присваиваниС вычисляСтся Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ присваивСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ $a = 5 нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚, β€” это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 5. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ запись $b = ($a = 5) Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½Π° записи $a = 5; $b = 5; (Ρ‚ΠΎΡ‡ΠΊΠ° с запятой ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† инструкции). Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Ρ‚Π°ΠΊΠΆΠ΅ доступна запись $b = $a = 5, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ справа Π½Π°Π»Π΅Π²ΠΎ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ориСнтированности Π½Π° выраТСния β€” прСфиксный ΠΈ постфиксный ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ PHP ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Ρ„ΠΎΡ€ΠΌΠΎΠΉ записи variable++ ΠΈ variable--. Π­Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°. Как ΠΈ язык Π‘ΠΈ, язык PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° β€” прСфиксный ΠΈ постфиксный. Они ΠΎΠ±Π° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ эффСкт ΠΈΡ… дСйствия Π½Π° Π½Π΅Ρ‘ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ². Π Π°Π·Π½ΠΈΡ†Π° состоит Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ выраТСния ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚, записываСмый ΠΊΠ°ΠΊ ++$variable, вычисляСтся Π² ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (PHP ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚ΡΡŽΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Β«ΠΏΡ€Π΅ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Β»). ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚, записываСмый ΠΊΠ°ΠΊ $variable++, вычисляСтся Π² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $variable Π΄ΠΎ Π΅Ρ‘ приращСния (PHP Π²Π½Π°Ρ‡Π°Π»Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Ρ‘, ΠΎΡ‚ΡΡŽΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «постинкрСмСнт»).

РаспространённыС Ρ‚ΠΈΠΏΡ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” выраТСния сравнСния. Π­Ρ‚ΠΈ выраТСния Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ false (лоТь), Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ true (истина). PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния > (большС), >= (большС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ), == (Ρ€Π°Π²Π½ΠΎ), != (Π½Π΅ Ρ€Π°Π²Π½ΠΎ), < (мСньшС) ΠΈ <= (мСньшС Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ). Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ строгого равСнства: === (Ρ€Π°Π²Π½ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°) ΠΈ !== (Π½Π΅ Ρ€Π°Π²Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этими выраТСниями ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… условного выполнСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, инструкции if.

ПослСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ здСсь рассматриваСтся, это ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Π΅ выраТСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ присваивания. Π£ΠΆΠ΅ извСстно, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° трСбуСтся ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Π½Π° 1, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ $a++ ΠΈΠ»ΠΈ ++$a. Но Ρ‡Ρ‚ΠΎ, Ссли потрСбуСтся ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ большС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 3? МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ $a++ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, это Π½Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ. НаиболСС распространённая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° β€” запись Π²ΠΈΠ΄Π° $a = $a + 3. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ $a + 3 вычисляСтся Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ прибавляСтся 3 ΠΈ снова присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a, увСличивая Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Π½Π° 3. Π’ PHP, ΠΊΠ°ΠΊ ΠΈ Π² рядС Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π‘ΠΈ, это ΠΆΠ΅ присваиваниС записываСтся ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ смысла ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ понимания ΠΊΠΎΠ΄Π° ΠΏΠΎ ΠΏΡ€ΠΎΡˆΠ΅ΡΡ‚Π²ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Ρ€ΠΎΠΉΠΊΡƒ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊ: $a += 3. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ дословно Β«Π²Π·ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a, ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3 ΠΈ снова ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ слоТСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $aΒ». ΠšΡ€ΠΎΠΌΠ΅ большСй понятности ΠΈ краткости, это быстрСС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ выраТСния $a += 3, ΠΊΠ°ΠΊ ΠΈ стандартного присваивания, станСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΠ»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это НЕ 3, Π° суммированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a плюс 3 (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΠ»ΠΎΡΡŒ ΠΏΠ΅Ρ€ΠΌΠ΅Π½Π½ΠΎΠΉ $a). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, $a -= 5 (Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ 5 ΠΈΠ· значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a), $b *= 7 (ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $b Π½Π° 7) ΠΈ Ρ‚. Π΄.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выглядит Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ встрСчал Ρ‚Π°ΠΊΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, β€” Ρ‚Π΅Ρ€Π½Π°Ρ€Π½Ρ‹ΠΉ условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€:

<?php

$first
? $second : $third

?>

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ подвыраТСния β€” true (Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), Ρ‚ΠΎ выполняСтся Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ условного выраТСния. Или выполняСтся Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ.

Π—Π°Π΄Π°Ρ‡Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° β€” ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ прСфиксного ΠΈ постфиксного ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

<?php

function double($i)
{
return
$i * 2;
}

$b = $a = 5; /* ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ $a ΠΈ $b */
$c = $a++; /* ΠŸΠΎΡΡ‚Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚, ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
$a (5) β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $c */
print "a = {$a}; b = {$b}; c = {$c}" . PHP_EOL;

$e = $d = ++$b; /* ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚, ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $b (6) β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ $d ΠΈ $e */
print "b = {$b}; d = {$d}; e = {$e}" . PHP_EOL;

/* Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈ пСрСмСнная $d, ΠΈ пСрСмСнная $e Ρ€Π°Π²Π½Ρ‹ 6 */

$f = double($d++); /* ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡƒΠ΄Π²ΠΎΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΌΠ΅Π½Π½ΠΎΠΉ $d ΠΏΠ΅Ρ€Π΅Π΄
ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ (2 * 6 = 12) β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $f */
print "d = {$d}; f = {$f}" . PHP_EOL;

$g = double(++$e); /* ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΡƒΠ΄Π²ΠΎΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΌΠ΅Π½Π½ΠΎΠΉ $e послС
ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (2 * 7 = 14) β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $g */
print "e = {$e}; g = {$g}" . PHP_EOL;

$h = $g += 10; /* Π‘Π½Π°Ρ‡Π°Π»Π° пСрСмСнная $g увСличиваСтся Π½Π° 10,
приобрСтая, Π² ΠΈΡ‚ΠΎΠ³Π΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 24. Π—Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
присваивания (24) присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $h,
которая Π² ΠΈΡ‚ΠΎΠ³Π΅ Ρ‚Π°ΠΊΠΆΠ΅ становится Ρ€Π°Π²Π½ΠΎΠΉ 24. */
print "g = {$g}; h = {$h}" . PHP_EOL;
?>

Иногда PHP рассматриваСт выраТСния ΠΊΠ°ΠΊ инструкции. Π’ этом случаС Ρƒ инструкции ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄ β€” Β«expr ;Β», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Ρ‚ΠΎΡ‡ΠΊΠ° с запятой. Π’ записи $b = $a = 5;, Ρ‡Π°ΡΡ‚ΡŒ $a = 5 β€” допустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ само β€” Π½Π΅ инструкция. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ запись $b = $a = 5; β€” допустимая инструкция.

ПослСднСС, Ρ‡Ρ‚ΠΎ вспомним, β€” ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ значСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² условных ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΈ Ρ†ΠΈΠΊΠ»Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΈΠ»ΠΈ false). РСгистронСзависимыС константы true ΠΈ false β€” Π΄Π²Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… логичСских значСния. ВыраТСния автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² логичСскиС значСния, ΠΊΠΎΠ³Π΄Π° трСбуСтся. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² рассказываСт Ρ€Π°Π·Π΄Π΅Π» ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ².

Π―Π·Ρ‹ΠΊ PHP со всСй ΠΏΠΎΠ»Π½ΠΎΡ‚ΠΎΠΉ ΠΈ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ выраТСния, Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ руководства. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΄Π°ΡŽΡ‚ прСдставлСниС ΠΎ выраТСниях, ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚, ΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ выраТСния. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части руководства допустимыС PHP-выраТСния ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ сокращСниСм expr.

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

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

up
56
Magnus Deininger, dma05 at web dot de ΒΆ
17 years ago
Note that even though PHP borrows large portions of its syntax from C, the ',' is treated quite differently. It's not possible to create combined expressions in PHP using the comma-operator that C has, except in for() loops.

Example (parse error):

<?php

$a = 2, $b = 4;

echo $a."\n";
echo $b."\n";

?>

Example (works):
<?php

for ($a = 2, $b = 4; $a < 3; $a++)
{
  echo $a."\n";
  echo $b."\n";
}

?>

This is because PHP doesn't actually have a proper comma-operator, it's only supported as syntactic sugar in for() loop headers. In C, it would have been perfectly legitimate to have this:

int f()
{
  int a, b;
  a = 2, b = 4;

  return a;
}

or even this:

int g()
{
  int a, b;
  a = (2, b = 4);

  return a;
}

In f(), a would have been set to 2, and b would have been set to 4.
In g(), (2, b = 4) would be a single expression which evaluates to 4, so both a and b would have been set to 4.
up
53
yasuo_ohgaki at hotmail dot com ΒΆ
25 years ago
Manual defines "expression is anything that has value", Therefore, parser will give error for following code.

<?php
($val) ? echo('true') : echo('false');
Note: "? : " operator has this syntax  "expr ? expr : expr;"
?>

since echo does not have(return) value and ?: expects expression(value).

However, if function/language constructs that have/return value, such as include(), parser compiles code.

Note: User defined functions always have/return value without explicit return statement (returns NULL if there is no return statement). Therefore, user defined functions are always valid expressions. 
[It may be useful to have VOID as new type to prevent programmer to use function as RVALUE by mistake]

For example,

<?php
($val) ? include('true.inc') : include('false.inc');
?>

is valid, since "include" returns value.

The fact "echo" does not return value(="echo" is not a expression), is less obvious to me. 

Print() and Echo() is NOT identical since print() has/returns value and can be a valid expression.
up
28
chriswarbo at gmail dot com ΒΆ
12 years ago
Note that there is a difference between a function and a function call, and both
are expressions. PHP has two kinds of function, "named functions" and "anonymous
functions". Here's an example with both:

<?php
// A named function. Its name is "double".
function double($x) {
  return 2 * $x;
}

// An anonymous function. It has no name, in the same way that the string
// "hello" has no name. Since it is an expression, we can give it a temporary
// name by assigning it to the variable $triple.
$triple = function($x) {
  return 3 * $x;
};
?>

We can "call" (or "run") both kinds of function. A "function call" is an
expression with the value of whatever the function returns. For example:

<?php
// The easiest way to run a function is to put () after its name, containing its
// arguments (if any)
$my_numbers = array(double(5), $triple(5));
?>

$my_numbers is now an array containing 10 and 15, which are the return values of
double and $triple when applied to the number 5.

Importantly, if we *don't* call a function, ie. we don't put () after its name,
then we still get expressions. For example:

<?php
$my_functions = array('double', $triple);
?>

$my_functions is now an array containing these two functions. Notice that named
functions are more awkward than anonymous functions. PHP treats them differently
because it didn't use to have anonymous functions, and the way named functions
were implemented didn't work for anonymous functions when they were eventually
added.

This means that instead of using a named function literally, like we can with
anonymous functions, we have to use a string containing its name instead. PHP
makes sure that these strings will be treated as functions when it's
appropriate. For example:

<?php
$temp      = 'double';
$my_number = $temp(5);
?>

$my_number will be 10, since PHP has spotted that we're treating a string as if
it were a function, so it has looked up that named function for us.

Unfortunately PHP's parser is very quirky; rather than looking for generic
patterns like "x(y)" and seeing if "x" is a function, it has lots of
special-cases like "$x(y)". This makes code like "'double'(5)" invalid, so we
have to do tricks like using temporary variables. There is another way around
this restriction though, and that is to pass our functions to the
"call_user_func" or "call_user_func_array" functions when we want to call them.
For example:

<?php
$my_numbers = array(call_user_func('double', 5), call_user_func($triple, 5));
?>

$my_numbers contains 10 and 15 because "call_user_func" called our functions for
us. This is possible because the string 'double' and the anonymous function
$triple are expressions. Note that we can even use this technique to call an
anonymous function without ever giving it a name:

<?php
$my_number = call_user_func(function($x) { return 4 * $x; }, 5);
?>

$my_number is now 20, since "call_user_func" called the anonymous function,
which quadruples its argument, with the value 5.

Passing functions around as expressions like this is very useful whenever we
need to use a 'callback'. Great examples of this are array_map and array_reduce.
up
16
egonfreeman at gmail dot com ΒΆ
19 years ago
It is worthy to mention that:

$n = 3;
$n * --$n

WILL RETURN 4 instead of 6.

It can be a hard to spot "error", because in our human thought process this really isn't an error at all! But you have to remember that PHP (as it is with many other high-level languages) evaluates its statements RIGHT-TO-LEFT, and therefore "--$n" comes BEFORE multiplying, so - in the end - it's really "2 * 2", not "3 * 2".

It is also worthy to mention that the same behavior will change:

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

So, if you ever find yourself on a 'wild goose chase' for a bug in that "impossible-to-break, so-very-simple" piece of code that uses pre-/post-'s, remember this post. :)

(just thought I'd check it out - turns out I was right :P)
up
17
winks716 ΒΆ
18 years ago
reply to egonfreeman at gmail dot com
04-Apr-2007 07:45 

the second example u mentioned as follow:
=====================================

$n = 3;
$n * $n++

from 3 * 3 into 3 * 4. Post- operations operate on a variable after it has been 'checked', but it doesn't necessarily state that it should happen AFTER an evaluation is over (on the contrary, as a matter of fact).

===========================================

everything works correctly but one sentence should be modified:

"from 3 * 3 into 3 * 4"  should be "from 3 * 3 into 4 * 3"

best regards~ :)
up
19
Mattias at mail dot ee ΒΆ
24 years ago
A note about the short-circuit behaviour of the boolean operators.

1. if (func1() || func2())
Now, if func1() returns true, func2() isn't run, since the expression
will be true anyway.

2. if (func1() && func2())
Now, if func1() returns false, func2() isn't run, since the expression
will be false anyway.

The reason for this behaviour comes probably from the programming
language C, on which PHP seems to be based on. There the
short-circuiting can be a very useful tool. For example:

int * myarray = a_func_to_set_myarray(); // init the array
if (myarray != NULL && myarray[0] != 4321) // check
    myarray[0] = 1234;

Now, the pointer myarray is checked for being not null, then the
contents of the array is validated. This is important, because if
you try to access an array whose address is invalid, the program
will crash and die a horrible death. But thanks to the short
circuiting, if myarray == NULL then myarray[0] won't be accessed,
and the program will work fine.
up
10
denzoo at gmail dot com ΒΆ
18 years ago
To jvm at jvmyers dot com:
Your first two if statements just check if there's anything in the string, if you wish to actually execute the code in your string you need eval().
up
9
petruzanauticoyahoo?com!ar ΒΆ
18 years ago
Regarding the ternary operator, I would rather say that the best option is to enclose all the expression in parantheses, to avoid errors and improve clarity:

<?php
   print ( $a > 1 ? "many" : "just one" );
?>

PS: for php, C++, and any other language that has it.
up
8
oliver at hankeln-online dot de ΒΆ
23 years ago
The short-circuiting IS a feature. It is also available in C, so I suppose the developers won?t remove it in future PHP versions.

It is rather nice to write:

$file=fopen("foo","r") or die("Error!");

Greets,
Oliver
up
5
Bichis Paul ΒΆ
9 years ago
Regarding 12345alex at gmx dot net's example:

I think you miss the identical equal documentation line from: http://php.net/manual/en/language.operators.comparison.php 

$a == $b     Equal     TRUE if $a is equal to $b after type juggling.
$a === $b     Identical     TRUE if $a is equal to $b, and they are of the same type. 

Try: 
print array() === NULL ? "True" : "False";

Check this:
var_dump(is_null(array()));
up
6
antickon at gmail dot com ΒΆ
14 years ago
evaluation order of subexpressions is not strictly defined for all operators

<?php
function a() {echo 'a';}
function b() {echo 'b';}
a() == b(); // outputs "ab", ie evaluates left-to-right

$a = 3;
var_dump( $a == $a = 4 ); // outputs bool(true), ie evaluates right-to-left
?>

this is not a bug: "we [php developers] make no guarantee about the order of evaluation".
See https://bugs.php.net/bug.php?id=61188
up
4
shawnster ΒΆ
19 years ago
An easy fix (although intuitively tough to do...) is to reverse the comparison.

if (5 == $a) {}

If you forget the second '=', you'll get a parse error for trying to assign a value to a non-variable.