ืฉื—ืจื•ืจ ืฉืœ ืžื–ืžื•ืจ 3.12, ืžื ืชื— ืกื˜ื˜ื™ ืœืฉืคืช PHP. ืžื”ื“ื•ืจืช ืืœืคื ืฉืœ PHP 8.0

ื—ื‘ืจืช Vimeo ะพะฟัƒะฑะปะธะบะพะฒะฐะปะฐ ืžื”ื“ื•ืจื” ื—ื“ืฉื” ืฉืœ ืžื ืชื— ืกื˜ื˜ื™ ืชื”ื™ืœื™ื 3.12, ื”ืžืืคืฉืจ ืœืš ืœื–ื”ื•ืช ื’ื ืฉื’ื™ืื•ืช ื‘ืจื•ืจื•ืช ื•ื’ื ืขื“ื™ื ื•ืช ื‘ืงื•ื“ PHP, ื›ืžื• ื’ื ืœืชืงืŸ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ื›ืžื” ืกื•ื’ื™ ืฉื’ื™ืื•ืช. ื”ืžืขืจื›ืช ืžืชืื™ืžื” ืœื–ื™ื”ื•ื™ ื‘ืขื™ื•ืช ื”ืŸ ื‘ืงื•ื“ ืžื“ื•ืจ ืงื•ื“ื ื•ื”ืŸ ื‘ืงื•ื“ ื”ืžืฉืชืžืฉ ื‘ืชื›ื•ื ื•ืช ืžื•ื“ืจื ื™ื•ืช ืฉื”ื•ืฆื’ื• ื‘ืขื ืคื™ื ื—ื“ืฉื™ื ืฉืœ PHP. ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ื›ืชื•ื‘ ื‘-PHP ื• ืžื•ืคืฅ ืขืœ ื™ื“ื™ ืชื—ืช ืจื™ืฉื™ื•ืŸ MIT.

ืชื”ื™ืœื™ื ืžื–ื”ื” ืืช ืจื•ื‘ ื”ื‘ืขื™ื•ืช ื”ืงืฉื•ืจื•ืช ื‘ืฉื™ืžื•ืฉ ืœื ื ื›ื•ืŸ ื‘ืกื•ื’, ื›ืžื• ื’ื ืฉื•ื ื•ืช ื˜ืขื•ื™ื•ืช ืื•ืคื™ื™ื ื™ื•ืช. ืœื“ื•ื’ืžื”, ื”ื•ื ืชื•ืžืš ื‘ืื–ื”ืจื•ืช ืœื’ื‘ื™ ืขืจื‘ื•ื‘ ืžืฉืชื ื™ื ืžืกื•ื’ื™ื ืฉื•ื ื™ื ื‘ื‘ื™ื˜ื•ื™, ื‘ื“ื™ืงื•ืช ืœื•ื’ื™ื•ืช ืฉื’ื•ื™ื•ืช (ื›ื’ื•ืŸ "if ($a && $a) {}", "if ($a && !$a) {}" ื•- " if ($a) {} elseif ($a) {}"), ืืชื—ื•ืœ ืœื ืฉืœื ืฉืœ ืžืืคื™ื™ื ื™ ื”ืื•ื‘ื™ื™ืงื˜. ื”ืžื ืชื— ืคื•ืขืœ ื‘ืžืฆื‘ ืจื™ื‘ื•ื™ ื—ื•ื˜ื™ื. ืืคืฉืจ ืœื‘ืฆืข ืกืจื™ืงื•ืช ืžืฆื˜ื‘ืจื•ืช, ื”ืžื ืชื—ื•ืช ืจืง ืงื‘ืฆื™ื ืฉื”ืฉืชื ื• ืžืื– ื”ืกืจื™ืงื” ื”ืื—ืจื•ื ื”.

ื‘ื ื•ืกืฃ, ืžืกื•ืคืงื™ื ื›ืœื™ ืชื›ื ื•ืช ืžืื•ื‘ื˜ื—ื™ื ื›ื“ื™ ืœืืคืฉืจ ืฉื™ืžื•ืฉ ื”ืขืจื•ืช ื‘ืคื•ืจืžื˜ ื“ื•ืงื‘ืœื•ืง ("/** @var Type */") ื›ื“ื™ ืœืกืคืง ืžื™ื“ืข ืขืœ ืกื•ื’ื™ ืžืฉืชื ื™ื, ืขืจื›ื™ ื”ื—ื–ืจื”, ืคืจืžื˜ืจื™ื ืฉืœ ืคื•ื ืงืฆื™ื•ืช, ืžืืคื™ื™ื ื™ ืื•ื‘ื™ื™ืงื˜. ื”ื’ื“ืจืช ื“ืคื•ืกื™ ืฉื™ืžื•ืฉ ื‘ืกื•ื’ื™ื ื•ืฉื™ืžื•ืฉ ื‘ื”ืฆื”ืจื•ืช assert ื ืชืžืš ื’ื ื›ืŸ. ืœื“ื•ื’ืžื”:

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

/** @var string $a */
echo strpos($a, 'ืฉืœื•ื');

/** @psalm-assert-if-true B $a */
function isValidB(A $a) : bool {
ื”ื—ื–ืจ $a ืžื•ืคืข ืฉืœ B && $a->isValid();
}

ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ื‘ื™ื˜ื•ืœ ืœืื•ื˜ื•ืžื˜ื™ ืฉืœ ื‘ืขื™ื•ืช ืฉื ืžืฆืื•, ืžืกื•ืคืง ื›ืœื™ ื”ืฉื™ืจื•ืช Psalter, ื”ืชื•ืžืš ื‘ืชื•ืกืคื™ื ื• ื”ื™ื ืžืืคืฉืจืช ืคืชื•ืจ ื‘ืขื™ื•ืช ืงื•ื“ ื ืคื•ืฆื•ืช, ื”ื•ืกืฃ ื”ืขืจื•ืช ืกื•ื’ ื•ื‘ืฆืข ืžื ื™ืคื•ืœืฆื™ื•ืช ื›ื’ื•ืŸ ื”ืขื‘ืจืช ืžื—ืœืงื•ืช ืžืžืจื—ื‘ ืฉืžื•ืช ืื—ื“ ืœืื—ืจ, ื”ืขื‘ืจืช ืฉื™ื˜ื•ืช ื‘ื™ืŸ ืžื—ืœืงื•ืช ื•ืฉื™ื ื•ื™ ืฉืžื•ืช ืฉืœ ืžื—ืœืงื•ืช ื•ืฉื™ื˜ื•ืช.

ื‘ื’ื™ืœื™ื•ืŸ ื”ื—ื“ืฉ ืฉืœ ืชื”ื™ืœื™ื ืžื•ื˜ืžืข ื”ืืคืฉืจื•ืช "--taint-analysis" ืžืืคืฉืจืช ืœืš ืœืขืงื•ื‘ ืื—ืจ ื”ืงืฉืจ ื‘ื™ืŸ ืคืจืžื˜ืจื™ ืงืœื˜ ืฉื”ืชืงื‘ืœื• ืžื”ืžืฉืชืžืฉ (ืœื“ื•ื’ืžื”, $_GET['name']) ื•ื”ืฉื™ืžื•ืฉ ื‘ื”ื ื‘ืžืงื•ืžื•ืช ืฉื“ื•ืจืฉื™ื ื‘ืจื™ื—ืช ืชื•ื•ื™ื (ืœื“ื•ื’ืžื”, echo " $name "), ืœืจื‘ื•ืช ื‘ืืžืฆืขื•ืช ืฉืจืฉืจื•ืช ืžืขืงื‘ ืฉืœ ืžื˜ืœื•ืช ื‘ื™ื ื™ื™ื ื•ืฉื™ื—ื•ืช ืคื•ื ืงืฆื™ื”. ื”ืฉื™ืžื•ืฉ ื‘ืžืขืจื›ื™ื ืืกื•ืฆื™ืื˜ื™ื‘ื™ื™ื $_GET, $_POST ื•-$_COOKIE ื ื—ืฉื‘ ื›ืžืงื•ืจื•ืช ืœื ืชื•ื ื™ื ืฉืขืœื•ืœื™ื ืœื”ื™ื•ืช ืžืกื•ื›ื ื™ื, ืื‘ืœ ื–ื” ื’ื ืืคืฉืจื™ ื”ื’ื“ืจื” ืžืงื•ืจื•ืช ืžืฉืœื•. ืคืขื•ืœื•ืช ื”ื“ื•ืจืฉื•ืช ืžืขืงื‘ ื‘ืจื™ื—ื” ื›ื•ืœืœื•ืช ืคืขื•ืœื•ืช ืคืœื˜ ื”ื™ื•ืฆืจื•ืช ืชื•ื›ืŸ HTML, ื”ื•ืกืคืช ื›ื•ืชืจื•ืช HTTP ืื• ื‘ื™ืฆื•ืข ืฉืื™ืœืชื•ืช SQL.

ืื™ืžื•ืช ืžืฉืžืฉ ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ื›ื’ื•ืŸ echo, exec, include ื•-header. ื‘ืขืช ื ื™ืชื•ื— ื”ืฆื•ืจืš ื‘ื‘ืจื™ื—ื” ื ืœืงื—ื™ื ื‘ื—ืฉื‘ื•ืŸ ืกื•ื’ื™ ื ืชื•ื ื™ื ื›ื’ื•ืŸ ื˜ืงืกื˜, ืžื—ืจื•ื–ื•ืช ืขื SQL, HTML ื•ืงื•ื“ Shell, ืžื—ืจื•ื–ื•ืช ืขื ืคืจืžื˜ืจื™ื ืฉืœ ืื™ืžื•ืช. ื”ืžืฆื‘ ื”ืžื•ืฆืข ืžืืคืฉืจ ืœืš ืœื–ื”ื•ืช ื ืงื•ื“ื•ืช ืชื•ืจืคื” ื‘ืงื•ื“ ืฉืžื•ื‘ื™ืœื•ืช ืœืกืงืจื™ืคื˜ ื—ื•ืฆื” ืืชืจื™ื (XSS) ืื• ื”ื—ืœืคืช SQL.

ื‘ื ื•ืกืฃ, ื ื™ืชืŸ ืœืฆื™ื™ืŸ ื”ืชื—ืœื” ื‘ื“ื™ืงื•ืช ืืœืคื ืฉืœ ืกื ื™ืฃ PHP 8.0 ื”ื—ื“ืฉ. ื”ื”ืฉืงื” ืžืชื•ื›ื ื ืช ืœ-26 ื‘ื ื•ื‘ืžื‘ืจ. ื‘ืกื ื™ืฃ ื”ื—ื“ืฉ ืฆืคื•ื™ื™ื ื”ื‘ืื™ื: ื—ื™ื“ื•ืฉื™ืื›ืžื•:

  • ื”ื›ืœืœื” ืžื”ื“ืจ JIT, ืฉื”ืฉื™ืžื•ืฉ ื‘ื”ื ื™ืฉืคืจ ืืช ื”ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ื•ืช.
  • ืชืžื™ื›ื” ืกื•ื’ื™ ืื™ื’ื•ื“ื™ื, ื”ื’ื“ืจืช ืื•ืกืคื™ื ืžืฉื ื™ ืกื•ื’ื™ื ืื• ื™ื•ืชืจ (ืœื“ื•ื’ืžื”, "ืคื•ื ืงืฆื™ื” ืฆื™ื‘ื•ืจื™ืช foo(Foo|Bar $input): int|float;").
  • ืชืžื™ื›ื” ืชื›ื•ื ื•ืช (ื”ืขืจื•ืช) ื”ืžืืคืฉืจื•ืช ืœืš ืœืื’ื“ ืžื˜ื ื ืชื•ื ื™ื (ื›ื’ื•ืŸ ืžื™ื“ืข ืขืœ ืกื•ื’ื™ื) ืœืžื—ืœืงื•ืช ืžื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘ืชื—ื‘ื™ืจ Docblock.
  • ืชื—ื‘ื™ืจ ืžืงื•ืฆืจ ื”ื’ื“ืจื•ืช ืžื—ืœืงื•ืช, ื”ืžืืคืฉืจื•ืช ืœืš ืœืฉืœื‘ ืืช ื”ื”ื’ื“ืจื” ืฉืœ ื‘ื ืื™ ื•ืžืืคื™ื™ื ื™ื.
  • ืกื•ื’ ื”ื—ื–ืจื” ื—ื“ืฉ - ืกื˜ื˜ื™.
  • ืกื•ื’ ื—ื“ืฉ - ืžืขื•ืจื‘, ืฉื‘ื• ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื›ื“ื™ ืœืงื‘ื•ืข ืื ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืคืจืžื˜ืจื™ื ืžืกื•ื’ื™ื ืฉื•ื ื™ื.
  • ื‘ื™ื˜ื•ื™ ืœื–ืจื•ืง ืœื˜ืคืœ ื‘ื—ืจื™ื’ื™ื.
  • ืžืคื” ื—ืœืฉื” ืœื™ืฆื•ืจ ื—ืคืฆื™ื ืฉื ื™ืชืŸ ืœื”ืงืจื™ื‘ ื‘ืžื”ืœืš ืื™ืกื•ืฃ ื”ืืฉืคื” (ืœืžืฉืœ, ืœืื—ืกืŸ ืžื˜ืžื•ื ื™ื ืžื™ื•ืชืจื™ื).
  • ื”ื–ื“ืžื ื•ืช ืฉื™ืžื•ืฉ ื‘ื‘ื™ื˜ื•ื™ "::class" ืขื‘ื•ืจ ืื•ื‘ื™ื™ืงื˜ื™ื (ื‘ื“ื•ืžื” ืœืงืจื™ืื” get_class()).
  • ื”ื–ื“ืžื ื•ืช ื”ื’ื“ืจื•ืช ื‘ื’ื•ืฉ ื”-catch ืฉืœ ื—ืจื™ื’ื™ื ืฉืื™ื ื ืงืฉื•ืจื™ื ืœืžืฉืชื ื™ื.
  • ื”ื–ื“ืžื ื•ืช ื”ืฉืืจืช ืคืกื™ืง ืื—ืจื™ ื”ืืœืžื ื˜ ื”ืื—ืจื•ืŸ ื‘ืจืฉื™ืžืช ื”ืคืจืžื˜ืจื™ื ืฉืœ ื”ืคื•ื ืงืฆื™ื”.
  • ืžืžืฉืง ื—ื“ืฉ ื ื™ืชืŸ ืœืžื™ืชืจ ืœื–ื”ื•ืช ื›ืœ ืกื•ื’ื™ ืžื—ืจื•ื–ืช ืื• ื ืชื•ื ื™ื ืฉื ื™ืชืŸ ืœื”ืžื™ืจ ืœืžื—ืจื•ื–ืช (ืฉืขื‘ื•ืจื” ื”ืฉื™ื˜ื” __toString() ื–ืžื™ื ื”).
  • ืชื›ื•ื ื” ื—ื“ืฉื” str_contains(), ืื ืœื•ื’ื™ ืคืฉื•ื˜ ืฉืœ strpos ืœืงื‘ื™ืขืช ื”ืชืจื—ืฉื•ืช ืฉืœ ืžื—ืจื•ื–ืช ืžืฉื ื”, ื›ืžื• ื’ื ื”ืคื•ื ืงืฆื™ื•ืช str_starts_with() ื•-str_ends_with() ืœื‘ื“ื™ืงืช ื”ืชืืžื•ืช ื‘ืชื—ื™ืœืช ืžื—ืจื•ื–ืช ื•ื‘ืกื•ืฃ.
  • ื ื•ืกืคื” ืคื•ื ืงืฆื™ื” fdiv(), ืฉืžื‘ืฆืข ืคืขื•ืœืช ื—ืœื•ืงื” ืžื‘ืœื™ ืœื–ืจื•ืง ืฉื’ื™ืื” ื‘ืขืช ื—ืœื•ืงื” ื‘ืืคืก.
  • ื”ืฉืชื ื” ืœื•ื’ื™ืงื” ืฉืœ ื—ื™ื‘ื•ืจ ืžื—ืจื•ื–ืช. ืœื“ื•ื’ืžื”, ื”ื‘ื™ื˜ื•ื™ 'ื”ื“ "ืกื›ื•ื:" . $a + $b' ืคื•ืจืฉื• ื‘ืขื‘ืจ ื›-'echo ("sum: ". $a) + $b', ื•ื‘-PHP 8 ื™ื˜ื•ืคืœื• ื›-'echo "sum: ". ($a + $b)'.
  • ื”ื™ื“ืง ื‘ื“ื™ืงืช ืคืขื•ืœื•ืช ืืจื™ืชืžื˜ื™ื•ืช ื•ืกื™ื‘ื™ื•ืช, ืœืžืฉืœ, ื”ื‘ื™ื˜ื•ื™ื™ื "[] % [42]" ื•-"$object + 4" ื™ื’ืจืžื• ืœืฉื’ื™ืื”.
  • ืžื•ื˜ืžืข ืืœื’ื•ืจื™ืชื ืžื™ื•ืŸ ื™ืฆื™ื‘ ืฉื‘ื• ืกื“ืจ ื”ืขืจื›ื™ื ื”ื–ื”ื™ื ื ืฉืžืจ ืขืœ ืคื ื™ ืจื™ืฆื•ืช ืฉื•ื ื•ืช.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”