LΓ«shimi i Psalm 3.12, njΓ« analizues statik pΓ«r gjuhΓ«n PHP. LΓ«shimi alfa i PHP 8.0

Компания Vimeo publikoi Π½ΠΎΠ²Ρ‹ΠΉ выпуск статичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Psalm 3.12, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡƒΠ»ΠΎΠ²ΠΈΠΌΡ‹Π΅ ошибки Π² ΠΊΠΎΠ΄Π΅ Π½Π° языкС PHP, Π° Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ошибок. БистСма ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для выявлСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΊΠ°ΠΊ Π² ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΌ ΠΊΠΎΠ΄Π΅, Ρ‚Π°ΠΊ ΠΈ Π² ΠΊΠΎΠ΄Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌ соврСмСнныС возмоТности, появившиСся Π² Π½ΠΎΠ²Ρ‹Ρ… Π²Π΅Ρ‚ΠΊΠ°Ρ… PHP. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° написан Π½Π° языкС PHP ΠΈ shpΓ«rndahet nΓ«n licencΓ«n MIT.

Psalm опрСдСляСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ использованиСм Ρ‚ΠΈΠΏΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки. НапримСр, поддСрТиваСтся Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎ смСшивании Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… логичСских ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ… (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Β«if ($a && $a) {}Β», Β«if ($a && !$a) {}Β» ΠΈ Β«if ($a) {} elseif ($a) {}Β»), Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Анализатор выполняСтся Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹, измСнившиСся с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ срСдства бСзопасного программирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ tΓ« pΓ«rdorΓ« Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Docblock (Β«/** @var Type */Β») для прСдоставлСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… значСниях, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, свойствах ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ поддСрТиваСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблонов использования Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ assert. НапримСр:

/** @var string|null */
$a = foo();

/** @var string $a */
echo strpos($a, β€˜hello’);

/** @psalm-assert-if-true B $a */
function isValidB(A $a) : bool {
return $a instanceof B && $a->isValid();
}

Для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ устранСния Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ прСдоставляСтся ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Psalter, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈ mundΓ«son ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΊΠΎΠ΄Π΅, Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ манипуляции, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ классов ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ классами, ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π½ΠΈΠ΅ классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

Π’ Π½ΠΎΠ²ΠΎΠΌ выпускС Psalm Γ«shtΓ« implementuar опция «—taint-analysis», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, $_GET[‘name’]) ΠΈ ΠΈΡ… использованиСм Π² мСстах, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… экранирования символов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, echo «<h1>$name</h1>»), Π² Ρ‚ΠΎΠΌ числС Ρ‡Π΅Ρ€Π΅Π· отслСТиваниС Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… присвоСний ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ качСствС источников ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасных Π΄Π°Π½Π½Ρ‹Ρ… рассматриваСтся использованиС ассоциативных массивов $_GET, $_POST ΠΈ $_COOKIE, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ собствСнных источников. Из дСйствий, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… отслСТивания экранирования, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, приводящиС ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ HTML, добавлСнию HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ SQL-запросов.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° примСняСтся ΠΏΡ€ΠΈ использовании Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠ°ΠΊ echo, exec, include ΠΈ header. ΠŸΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ нСобходимости экранирования ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ тСкст, строки с SQL, HTML ΠΈ Shell-ΠΊΠΎΠ΄ΠΎΠΌ, строки с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ позволяСт Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ уязвимости Π² ΠΊΠΎΠ΄Π΅, приводящиС ΠΊ мСТсайтовому скриптингу (XSS) ΠΈΠ»ΠΈ подстановкС SQL-ΠΊΠΎΠ΄Π°.

Gjithashtu mund tΓ« theksohet fillimi Π°Π»ΡŒΡ„Π°-тСстирования Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ PHP 8.0. Π Π΅Π»ΠΈΠ· Π½Π°ΠΌΠ΅Ρ‡Π΅Π½ Π½Π° 26 ноября. Π’ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ innovations, ΠΊΠ°ΠΊ:

  • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ JIT-компилятора, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° union-Ρ‚ΠΈΠΏΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«public function foo(Foo|Bar $input): int|float;Β»).
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, свСдСния ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…) ΠΊ классам Π±Π΅Π· использования синтаксиса Docblock.
  • Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ синтаксис опрСдСлСния классов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора ΠΈ свойств.
  • Новый Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” static.
  • Новый Ρ‚ΠΈΠΏ β€” mixed, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для опрСдСлСния ΠΏΡ€ΠΈΡ‘ΠΌΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.
  • Shprehja throw для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.
  • WeakMap для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сборкС мусора (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для хранСния Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… кэшСй).
  • MundΓ«sia использования выраТСния Β«::classΒ» для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π°Π½Π°Π»ΠΎΠ³ Π²Ρ‹Π·ΠΎΠ²Π° get_class()).
  • MundΓ«sia опрСдСлСния Π² Π±Π»ΠΎΠΊΠ΅ catch ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π΅ привязанных ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.
  • MundΓ«sia оставлСния символа запятой послС послСднСго элСмСнта Π² спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • NdΓ«rfaqja e re Stringable для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π»ΡŽΠ±Ρ‹Ρ… строковых Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² строку (для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… доступСн ΠΌΠ΅Ρ‚ΠΎΠ΄__toString()).
  • Новая функция str_contains(), ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ strpos для опрСдСлСния вхоТдСния подстроки, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_starts_with() ΠΈ str_ends_with() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ совпадСний Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ строки.
  • Shtuar funksionin fdiv(), Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ дСлСния Π±Π΅Π· Π²Ρ‹Π²ΠΎΠ΄Π° ошибки Π² случаС дСлСния Π½Π° ноль.
  • ИзмСнСна Π»ΠΎΠ³ΠΈΠΊΠ° соСдинСния строк. НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ β€˜echo Β«sum: Β» . $a + $b’ Ρ€Π°Π½Π΅Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ β€˜echo (Β«sum: Β» . $a) + $b’, Π° Π² PHP 8 Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΊΠ°ΠΊ β€˜echo Β«sum: Β» . ($a + $b)’.
  • УТСсточСна ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° арифмСтичСских ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, выраТСния Β«[] % [42]Β» ΠΈ Β«$object + 4Β» Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ошибкС.
  • Γ«shtΓ« realizuar ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… запусках сохраняСтся порядок слСдования ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Burimi: opennet.ru

ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры πŸ”₯ ΠšΡƒΠΏΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ хостинг для сайтов с Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ DDoS, VPS VDS сСрвСры | ProHoster