ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ Vimeo Π½ΠΎΠ²ΠΈΡΡ Π±ΡΠΎΠΉ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ , ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΠΊΡΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΡΡΡΠ΄Π½ΠΎΡΠ»ΠΎΠ²ΠΈΠΌΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π° Π½Π° PHP, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ Π³ΡΠ΅ΡΠΊΠΈ. Π‘ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ° Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΊΠ°ΠΊΡΠΎ Π² ΠΎΡΡΠ°ΡΡΠ» ΠΊΠΎΠ΄, ΡΠ°ΠΊΠ° ΠΈ Π² ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΏΠΎΡΠ²ΠΈΠ»ΠΈ ΡΠ΅ Π² Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° PHP. ΠΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° PHP ΠΈ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π· MIT.
Psalm ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅, Π° ΡΡΡΠΎ ΠΈ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΈ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π·Π° ΡΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π² ΠΈΠ·ΡΠ°Π·ΠΈ, Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (ΠΊΠ°ΡΠΎ βif ($a && $a) {}β, βif ($a && !$a) {}β ΠΈ βif ($a) {} elseif ($a) {}β), Π½Π΅ΠΏΡΠ»Π½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΠ°ΠΌΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°.
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π°Π½ΠΎΡΠ°ΡΠΈΠΈ Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ (β/** @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, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π° ΡΠΈΠΏΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π² ΠΊΠΎΠ΄Π°, Π΄ΠΎΠ±Π°Π²Ρ Π°Π½ΠΎΡΠ°ΡΠΈΠΈ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ, ΠΊΠ°ΡΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΎΡ Π΅Π΄Π½ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π½Π° ΠΈΠΌΠ΅Π½Π° Π² Π΄ΡΡΠ³ΠΎ, ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅, ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
Π Π½ΠΎΠ²ΠΈΡ Π±ΡΠΎΠΉ Π½Π° Psalm ΠΎΠΏΡΠΈΡΡΠ° «—taint-analysis», ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, $_GET[‘name’]), ΠΈ ΡΡΡ Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ΠΊΡΠ°Π½Π²Π°Π½Π΅ Π½Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, echo «<h1>$name</h1>»), Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ΅Π· ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΠΈΠ³ΠΈ ΠΎΡ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΎΠΏΠ°ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π°ΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΈ ΠΌΠ°ΡΠΈΠ²ΠΈ $_GET, $_POST ΠΈ $_COOKIE, Π½ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ. ΠΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ°, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π΅ΠΊΡΠ°Π½ΠΈΡΠ°Π½Π΅ΡΠΎ, ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅, Π²ΠΎΠ΄Π΅ΡΠΈ Π΄ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π² HTML ΡΠΎΡΠΌΠ°Ρ, Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° HTTP Π·Π°Π³Π»Π°Π²ΠΊΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° SQL Π·Π°ΡΠ²ΠΊΠΈ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΡΠΎ echo, exec, include ΠΈ header. ΠΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π΅ΠΊΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ ΡΠ΅ΠΊΡΡ, SQL Π½ΠΈΠ·ΠΎΠ²Π΅, HTML ΠΈ Shell ΠΊΠΎΠ΄, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π½ΠΈΠ·ΠΎΠ²Π΅ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΈΡΠΎ Π²ΠΎΠ΄ΡΡ Π΄ΠΎ ΠΊΡΠΎΡ-ΡΠ°ΠΉΡΠΎΠ²ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ (XSS) ΠΈΠ»ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° SQL ΠΊΠΎΠ΄.
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΠ±Π΅Π»ΡΠ·Π°Π½ΠΎ Π°Π»ΡΠ° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ PHP 8.0. ΠΡΡΠΊΠ°Π½Π΅ΡΠΎ Π΅ Π½Π°ΡΡΠΎΡΠ΅Π½ΠΎ Π·Π° 26 Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ. Π Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°Ρ , ΠΊΠ°ΡΠΎ:
- , ΡΠΈΡΡΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π° ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° , ΠΊΠΎΠΈΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠΈ ΠΎΡ Π΄Π²Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠΈΠΏΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Β«public function foo(Foo|Bar $input): int|float;Β»).
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° (Π°Π½ΠΎΡΠ°ΡΠΈΠΈ), ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅) Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Π±Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π½Π° Docblock.
- Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ Π½Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ°.
- ΠΠΎΠ² ΡΠΈΠΏ Π²ΡΡΠ½Π°ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ β .
- ΠΠΎΠ² ΡΠΈΠΏ β , ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΈΠ΅ΠΌΠ°ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅.
- ΠΠ·ΡΠ°Π· Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
- Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΆΠ΅ΡΡΠ²Π° ΠΏΡΠΈ ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠ΅ΡΠΎΠ²Π΅).
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠ°Π·Π° Β«::classΒ» Π·Π° ΠΎΠ±Π΅ΠΊΡΠΈ (Π°Π½Π°Π»ΠΎΠ³ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° get_class()).
- ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π² Π±Π»ΠΎΠΊΠ° catch Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
- ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π·Π°ΠΏΠ΅ΡΠ°Ρ ΡΠ»Π΅Π΄ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ.
- ΠΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΈΠ»ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈ Π² Π½ΠΈΠ· (Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½ ΠΌΠ΅ΡΠΎΠ΄ΡΡ __toString()).
- ΠΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ , ΠΎΠΏΡΠΎΡΡΠ΅Π½ Π°Π½Π°Π»ΠΎΠ³ Π½Π° strpos Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π½ΠΈΠ·, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ str_starts_with() ΠΈ str_ends_with() Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ ΠΈ ΠΊΡΠ°Ρ Π½Π° Π½ΠΈΠ·Π°.
- ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡ , ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΈΠ·ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΡΠ»Π°.
- Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΡΠ°Π·ΡΡ βecho Β«sum: Β» . $a + $bβ ΠΏΡΠ΅Π΄ΠΈ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΡΠΎ βecho (Β«sum: Β» . $a) + $bβ, Π° Π² PHP 8 ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΊΠ°ΡΠΎ βecho Β«sum: Β» . ($a + $b)β.
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ½ΠΈ ΠΈ Π±ΠΈΡΠΎΠ²ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Β«[] % [42]Β» ΠΈ Β«$object + 4Β» ΡΠ΅ Π΄ΠΎΠ²Π΅Π΄Π°Ρ Π΄ΠΎ Π³ΡΠ΅ΡΠΊΠ°.
- ΡΡΠ°Π±ΠΈΠ»Π΅Π½ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΡΠΎΡΡΠΈΡΠ°Π½Π΅, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π° ΡΠ΅Π΄Π° Π½Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π±Π° Π½Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
