Π Π΅Π»ΠΈΠ· языка программирования PHP 8.4

ПослС Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСдставлСн Ρ€Π΅Π»ΠΈΠ· языка программирования PHP 8.4. Новая Π²Π΅Ρ‚ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ΅Ρ€ΠΈΡŽ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰ΠΈΡ… ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ измСнСния Π² PHP 8.4:

  • ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° новая рСализация JIT-компилятора, построСнная Π½Π° Π±Π°Π·Π΅ IR Framework. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ старый JIT Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции Π½Π° основС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° ΠΈ с использованиСм Ρ€Π°Π·Π½Ρ‹Ρ… бэкСндов для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ x86_64 ΠΈ AArch64, Π° Π½ΠΎΠ²Ρ‹ΠΉ JIT ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ для всСх Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ бэкСнд ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС (IR), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ оптимизируСтся ΠΈ прСобразуСтся Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции для Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прикрСплСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² свойств (property hook), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ доступС ΠΊ свойствам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡƒΡŽ Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ __get ΠΈ __set, ΠΈ Π±Π΅Π· создания Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²-обвязок. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² свойств Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сущСствСнно ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π° ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ повСдСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ со свойствами, благодаря привязкС собствСнного ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ свойству. class User { public string $name { set { if (strlen($value) === 0) { throw new ValueError(«Name must be non-empty»); } $this->name = $value; } } public function __construct(string $name) { $this->name = $name; } }
  • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ссылок Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² конструкции «new» Π±Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… скобок, Ρ‚.Π΅. вмСсто «$name = (new MyClass())->method()» Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ «$name = new MyClass()->method()».
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ асиммСтричного управлСния Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ свойств ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (public, private, protected), ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи (set) ΠΈ чтСния (get). НапримСр: class PhpVersion { public private(set) string $version = ‘8.4’; } $phpVersion = new PhpVersion(); var_dump($phpVersion->version); // string(3) «8.4» $phpVersion->version = ‘PHP 8.3’; // error
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° ΡˆΡ‚Π°Ρ‚Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° «Π»Π΅Π½ΠΈΠ²Ρ‹Ρ…» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (lazy), инициализация ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… производится Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ использования.
  • ВмСсто ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° «opcache.jit_buffer_size» для управлСния JIT-компилятором ΠΈ настройки Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π° JIT ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ «opcache.jit» ΠΈ «opcache.jit_buffer_size». Для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ JIT Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ «opcache.jit=disable» вмСсто «opcache.jit_buffer_size=0». ВнСсСны измСнСния, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ JIT Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «#[\Deprecated]», ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². #[\Deprecated(«use newFunction() instead», since: «1.1»)] function oldFunction() { // … }
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ класс \Dom\HTMLDocument, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ HTML5.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция request_parse_body() для Ρ€Π°Π·Π±ΠΎΡ€Π° HTTP-запросов с Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° multipart/form-data (RFC1867).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ array_find(), array_find_key(), array_any() ΠΈ array_all(). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ array_find() ΠΈ array_find_key() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ Π² массивС, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сработала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, заданная Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ callback-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ array_any() ΠΈ array_all() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ любой совпавший элСмСнт ΠΈ всС совпавшиС элСмСнты. НапримСр, для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта, Ρ€Π°Π·ΠΌΠ΅Ρ€ поля title Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ большС 5 символов, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ: $firstMatch = array_find( $posts, function (Post $post) { return strlen($post->title) > 5; } );
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ DateTime::getMicrosecond() ΠΈ DateTimeImmutable::setMicrosecond($microsecond) для получСния ΠΈ установки Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с микросСкундной Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ DateTime::createFromTimestamp().
  • Π’ PDO (PHP Data Objects), абстрактный интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания парсСров SQL ΠΈ субклассов, спСцифичных для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π‘Π£Π‘Π”. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ субклассы Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc ΠΈ Pdo\Sqlite.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), mb_lcfirst(), bcceil(), bcdivmod(), bcfloor() ΠΈ bcround(), pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), pcntl_waitid(), http_get_last_response_headers(), http_clear_last_response_headers(), fpow()
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ exit ΠΈ die Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ допускаСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π Π°Π½Π΅Π΅ возмоТности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ exit() ΠΈ die() Π±Ρ‹Π»ΠΈ сильно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ прСдставляли собой обвязки Π½Π°Π΄ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами exit ΠΈ die.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ измСнСния, ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‰ΠΈΠ΅ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ уязвимостСй, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΠΈΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², создаваСмых Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tempnam().
  • ОбъявлСно ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с присвоСнным ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ null автоматичСски Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π»ΠΎΡΡŒ присвоСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ null. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния null Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ трСбуСтся явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ прСфикса «?». НапримСр, вмСсто «function save(Book $book = null) {}» слСдуСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ «function save(?Book $book = null) {}».
  • ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ константы E_STRICT, MYSQLI_REFRESH_*, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mysqli_ping(), mysqli_kill(), mysqli_refresh(), ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ mysqli::ping(), mysqli::kill(), mysqli::refresh(), Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования «_» Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ класса, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свойства DOMDocument ΠΈ DOMEntity. Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ констант класса GMP, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выставлСно ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово «final».

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ выпуск статичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° PHPStan 2.0, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ошибки Π² ΠΊΠΎΠ΄Π΅ Π½Π° языкС PHP Π±Π΅Π· Π΅Π³ΠΎ выполнСния ΠΈ использования unit-тСстов. Анализатор прСдоставляСт 10 ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ‚Π°ΠΊΠΈΠ΅ области, ΠΊΠ°ΠΊ выявлСниС Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, нСизвСстных классов, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ; ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ использования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²; ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° написан Π½Π° языкС PHP ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru