ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ 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
