Π–ΠΎΠ½Π³Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ

PHP Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ явного опрСдСлСния Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ опрСдСлится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ пСрСмСнная, Ссли Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ. Π’ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var станСт string, Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var присвоили строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (string). Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ измСнится Π½Π° int, Ссли ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $var присвоят цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (int).

Π’ рядС контСкстов PHP попытаСтся автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ значСния Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… контСкстах:

  • Числовой
  • Π‘Ρ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ
  • ЛогичСский
  • ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ строк
  • Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ
  • ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Когда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ трСбуСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ, само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ измСняСт Ρ‚ΠΈΠΏΡ‹.

Как Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ PHP ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, рассказываСт Ρ€Π°Π·Π΄Π΅Π» Β«ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²Β». ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ settype() ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Числовой контСкст

Числовой контСкст Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с арифмСтичСскими ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’ этом контСкстС ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float) ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ станСт число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float), Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² β€” число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float) (ΠΈΠ»ΠΈ Π½Π΅ интСрпрСтируСтся ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число (int)). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число (int) ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ станСт Ρ†Π΅Π»ΠΎΠ΅ число (int). Π‘ PHP 8.0.0 выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TypeError, Ссли Π½Π΅ получаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄.

Π‘Ρ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ контСкст

Π‘Ρ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ контСкст Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с языковыми конструкциями echo, print, ΠΏΡ€ΠΈ интСрполяции строк ΠΈΠ»ΠΈ строковом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ.

Π’ этом контСкстС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ string. PHP выбросит ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError, Ссли Π½Π΅ получится ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π”ΠΎ вСрсии PHP 7.4.0 Π²Ρ‹Π΄Π°Π²Π°Π»Π°ΡΡŒ ошибка уровня E_RECOVERABLE_ERROR.

ЛогичСский контСкст

ЛогичСский контСкст Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с условными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Ρ‚Π΅Ρ€Π½Π°Ρ€Π½Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ»ΠΈ логичСскими ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’ этом контСкстС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ логичСскоС β€” bool.

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ строк

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ строк Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ.

Π’ этом контСкстС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ станСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ string, Ссли ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΈΠΏΡƒ string, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ значСния int ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ становится Ρ‚ΠΈΠΏ int. Начиная с вСрсии 8.0.0 PHP выбрасываСт ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError, Ссли Π½Π΅ получаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ контСкст

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ сравнСния.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ PHP выполняСт Π² этом контСкстС, ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π° сравнСния Ρ‚ΠΈΠΏΠΎΠ² Ρ€Π°Π·Π΄Π΅Π»Π° Β«ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния».

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСдаётся Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ, свойству ΠΈΠ»ΠΈ возвращаСтся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

Π’ контСкстС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PHP провСряСт, соотвСтствуСт Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π²Π° случая. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ‚ΠΈΠΏΠΎΠΌ int прСобразовываСтся Π² число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ссли Ρ‚ΠΈΠΏ объявили ΠΊΠ°ΠΊ float. Π’Ρ‚ΠΎΡ€ΠΎΠΉ: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСобразовываСтся Π² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ скалярноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли: Π°) Ρ‚ΠΈΠΏ объявили ΠΊΠ°ΠΊ скалярный, Π±) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² скалярный Ρ‚ΠΈΠΏ ΠΈ Π²) Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ нСстрогой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ PHP Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ОписаниС Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния Π΄Π°Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„.

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

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ автоматичСски приводят Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null ΠΊ скалярным Ρ‚ΠΈΠΏΠ°ΠΌ, это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π£Π‘Π’ΠΠ Π•Π›Πž с PHP 8.1.0.

НСявная типизация Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… простых Ρ‚ΠΈΠΏΠΎΠ²

  • ОбъявлСниС Ρ‚ΠΈΠΏΠ° bool: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ логичСскоС β€” bool.
  • ОбъявлСниС Ρ‚ΠΈΠΏΠ° int: PHP ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ цСлочислСнноС β€” int, Ссли ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ строку, ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число.
  • ОбъявлСниС Ρ‚ΠΈΠΏΠ° float: PHP ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ β€” float, Ссли ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ строку, ΠΊΠ°ΠΊ число с дСсятичной Π΄Ρ€ΠΎΠ±ΡŒΡŽ.
  • ОбъявлСниС Ρ‚ΠΈΠΏΠ° string: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ интСрпрСтируСтся ΠΊΠ°ΠΊ строка β€” string.

НСявная типизация ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

ОбъявлСния скалярных Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‚ΡΡ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌΡƒ нСявному ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Ссли Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ strict_types Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. PHP Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ‚ΠΈΠΏ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ списка Π² порядкС убывания ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, Ссли Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ значСния β€” Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ объСдинСния:

  1. int
  2. float
  3. string
  4. bool
Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ, Ссли объСдинСниС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ привСсти ΠΊ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ сСмантики ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² PHP. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎ порядку Ρ‚ΠΈΠΏ.
ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: Π² объСдинСнии Ρ‚ΠΈΠΏΠΎΠ² int ΠΈ float ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ строкового значСния Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ сСмантикой числовой строки. НапримСр, для значСния "42" PHP Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Ρ‚ΠΈΠΏ int, Π° для значСния "42.0" β€” Ρ‚ΠΈΠΏ float.

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

Π’ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ входят Π² список ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ, Π½Π΅ станут цСлями для нСявного привСдСния. Говоря ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π΅Π΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ нСявного привСдСния ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ null, false ΠΈ true Π½Π΅ выполняСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нСявного привСдСния Ρ‚ΠΈΠΏΠΎΠ² ΠΊ Ρ‚ΠΈΠΏΡƒ Π² составС объСдинСния

<?php

// int|string
42 --> 42 // Π’ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС Ρ‚ΠΈΠΏΡƒ β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° int
"42" --> "42" // Π’ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС Ρ‚ΠΈΠΏΡƒ β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° string
new ObjectWithToString --> "Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __toString()"
// ΠžΠ±ΡŠΠ΅ΠΊΡ‚ нСсовмСстим с Ρ‚ΠΈΠΏΠΎΠΌ int β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ string
42.0 --> 42 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ float совмСстимо с Ρ‚ΠΈΠΏΠΎΠΌ int β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° int
42.1 --> 42 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ float совмСстимо с Ρ‚ΠΈΠΏΠΎΠΌ int β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° int
1e100 --> "1.0E+100" // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ float ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ‚ΠΈΠΏΠ° int β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ string
INF --> "INF" // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ float ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ‚ΠΈΠΏΠ° int β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ string
true --> 1 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bool совмСстимо с Ρ‚ΠΈΠΏΠΎΠΌ int β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° int
[] --> TypeError // Массив нСсовмСстим с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ int ΠΈΠ»ΠΈ string β€” гСнСрация ошибки

// int|float|bool
"45" --> 45 // ЦСлочислСнная числовая строка β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° int
"45.0" --> 45.0 // Π‘Ρ‚Ρ€ΠΎΠΊΠ° с числом с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ β€” Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° float

"45X" --> true // НСчисловая строка β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ bool
"" --> false // НСчисловая строка β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ bool
"X" --> true // НСчисловая строка β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ‚ΠΈΠΏΡƒ bool
[] --> TypeError // Массив нСсовмСстим с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ int, float ΠΈΠ»ΠΈ bool β€” гСнСрация ошибки

?>

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ значСния Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Для прСобразования Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅Π΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ привСдСния Ρ‚ΠΈΠΏΠ° β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°

<?php

$foo
= 10; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $foo содСрТит Ρ†Π΅Π»ΠΎΠ΅ число
$bar = (bool) $foo; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $bar содСрТит логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

var_dump($bar);

?>

PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ привСдСния Ρ‚ΠΈΠΏΠΎΠ²:

  • (int) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ Ρ†Π΅Π»ΠΎΠΌΡƒ числу (int)
  • (bool) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ логичСскому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (bool)
  • (float) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ числу с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (float)
  • (string) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ строкС (string)
  • (array) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ массиву (array)
  • (object) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ (object)
  • (unset) β€” ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΊ NULL

Π‘ вСрсии PHP 8.5.0 Ρ‚Π°ΠΊΠΆΠ΅ доступно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (void), Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ выполняСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ значСния. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ инструкция, Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния.

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

(integer) β€” псСвдоним привСдСния Ρ‚ΠΈΠΏΠ° (int). (boolean) β€” псСвдоним привСдСния Ρ‚ΠΈΠΏΠ° (bool). (binary) β€” псСвдоним привСдСния Ρ‚ΠΈΠΏΠ° (string). (double) ΠΈ (real) β€” псСвдонимы привСдСния Ρ‚ΠΈΠΏΠ° (float). Π­Ρ‚ΠΈ привСдСния Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ каноничСскоС имя Ρ‚ΠΈΠΏΠ° ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ начиная с PHP 8.5.0.

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

ПсСвдоним привСдСния Ρ‚ΠΈΠΏΠ° (real) устарСл с PHP 7.4.0, Π° с PHP 8.0.0 псСвдоним ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ.

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

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° (unset) устарСло с вСрсии PHP 7.2.0. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (unset) Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρƒ значСния NULL. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (unset) ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ Π² PHP 8.0.0.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° (binary) ΠΈ прСфикс b ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ для прямой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π’ΠΈΠΏΡ‹ (binary) ΠΈ (string) ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π° это ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ.

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

PHP ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° привСдСния Ρ‚ΠΈΠΏΠΎΠ² эквивалСнтны:

<?php

$foo
= (int) $bar;
$foo = ( int ) $bar;

?>

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ строк (string) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ строкам (string):

<?php

$binary
= (binary) $string;
$binary = b"binary string";

?>

ВмСсто привСдСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊ Ρ‚ΠΈΠΏΡƒ string ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π±Π΅Ρ€ΡƒΡ‚ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ привСдСния ΠΊ строкС

<?php

$foo
= 10; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $foo содСрТит Ρ†Π΅Π»ΠΎΠ΅ число
$str = "$foo"; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $str содСрТит строку
$fst = (string) $foo; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $fst Ρ‚ΠΎΠΆΠ΅ содСрТит строку

// Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: "ΠΎΠ½ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅"
if ($fst === $str) {
echo
"ΠΎΠ½ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅", PHP_EOL;
}

?>

НС всСгда ясно, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π΄Π°ΡŽΡ‚ Ρ€Π°Π·Π΄Π΅Π»Ρ‹:

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ справСдлив для всСх вСрсий PHP, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ PHP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ символам строк (string) Ρ‡Π΅Ρ€Π΅Π· смСщСния ΠΏΠΎ индСксу синтаксисом, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΏΠΎ индСксу ΠΊ значСниям массива (array):

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 Π Π°Π±ΠΎΡ‚Π° с символами строки ΠΏΠΎ индСксу

<?php

$a
= 'car'; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $a содСрТит строку
$a[0] = 'b'; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ $a ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ содСрТит строку
echo $a; // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚: bar

?>
Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π΄Π°Ρ‘Ρ‚ Ρ€Π°Π·Π΄Π΅Π» Β« Доступ ΠΊ символу Π² строкС ΠΈ Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Β».
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

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

up
75
Raja ΒΆ
21 years ago
Uneven division of an integer variable by another integer variable will result in a float by automatic conversion -- you do not have to cast the variables to floats in order to avoid integer truncation (as you would in C, for example):

$dividend = 2;
$divisor = 3;
$quotient = $dividend/$divisor;
print $quotient; // 0.66666666666667
up
18
Anonymous ΒΆ
5 years ago
Cast operators have a very high precedence, for example (int)$a/$b is evaluated as ((int)$a)/$b, not as (int)($a/$b) [which would be like intdiv($a,$b) if both $a and $b are integers].
The only exceptions (as of PHP 8.0) are the exponentiation operator ** [i.e. (int)$a**$b is evaluated as (int)($a**$b) rather than ((int)$a)**$b] and the special access/invocation operators ->, ::, [] and () [i.e. in each of (int)$a->$b, (int)$a::$b, (int)$a[$b] and (int)$a($b), the cast is performed last on the result of the variable expression].
up
2
Anonymous ΒΆ
1 year ago
Type casting in expressions is executed first.
The casting is assigned to the value, not to the expression result.
Examples:

<?php

$string = "777";

var_dump( $string === 777 );            // FALSE
var_dump( (int)  $string === 777 );     // TRUE
var_dump( ( (int) $string ) === 777 );  // TRUE
var_dump( (int) ( $string === 777 ) );  // 0
?>
up
26
fardelian ΒΆ
13 years ago
Casting objects to arrays is a pain. Example:

<?php

class MyClass {

    private $priv = 'priv_value';
    protected $prot = 'prot_value';
    public $pub = 'pub_value';
    public $MyClasspriv = 'second_pub_value';

}

$test = new MyClass();
echo '<pre>';
print_r((array) $test);

/*
Array
(
    [MyClasspriv] => priv_value
    [*prot] => prot_value
    [pub] => pub_value
    [MyClasspriv] => second_pub_value
)
 */

?>

Yes, that looks like an array with two keys with the same name and it looks like the protected field was prepended with an asterisk. But that's not true:

<?php

foreach ((array) $test as $key => $value) {
    $len = strlen($key);
    echo "{$key} ({$len}) => {$value}<br />";
    for ($i = 0; $i < $len; ++$i) {
        echo ord($key[$i]) . ' ';
    }
    echo '<hr />';
}

/*
MyClasspriv (13) => priv_value
0 77 121 67 108 97 115 115 0 112 114 105 118
*prot (7) => prot_value
0 42 0 112 114 111 116
pub (3) => pub_value
112 117 98
MyClasspriv (11) => second_pub_value
77 121 67 108 97 115 115 112 114 105 118
 */

?>

The char codes show that the protected keys are prepended with '\0*\0' and private keys are prepended with '\0'.__CLASS__.'\0' so be careful when playing around with this.
up
13
miracle at 1oo-percent dot de ΒΆ
20 years ago
If you want to convert a string automatically to float or integer (e.g. "0.234" to float and "123" to int), simply add 0 to the string - PHP will do the rest.

e.g.

$val = 0 + "1.234";
(type of $val is float now)

$val = 0 + "123";
(type of $val is integer now)
up
19
Anonymous ΒΆ
23 years ago
Printing or echoing a FALSE boolean value or a NULL value results in an empty string:
(string)TRUE //returns "1"
(string)FALSE //returns ""
echo TRUE; //prints "1"
echo FALSE; //prints nothing!