Izdanje PHP 7.4 programskog jezika

Nakon godinu dana razvoja predstavljen izdanje programskog jezika PHP 7.4. Новая Π²Π΅Ρ‚ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ΅Ρ€ΠΈΡŽ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰ΠΈΡ… ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ.

Ključ poboljőanja в PHP 7.4:

  • Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ свойства β€” свойства классов Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ объявлСния Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    class User {
    public int $id;
    public string $name;
    }

  • Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ синтаксис опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Β«fn(parameter_list) => exprΒ» с привязкой области видимости ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. НапримСр Β«fn($x) => $x + $yΒ» являСтся Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Β«$fn2 = function ($x) use ($y) {return $x + $y;}Β»);
  • Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния Β«??=Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для опрСдСлСния значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Β«a ??= bΒ» Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Β«a = a ?? bΒ», Ссли Β«aΒ» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сохраняСтся, Π° Ссли Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«bΒ»);
  • Ograničeno prilika сохранСния ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ наслСдования Ρ‚ΠΈΠΏΠΎΠ² Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Π½ΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСобразования ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ исходных Ρ‚ΠΈΠΏΠΎΠ² Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡƒΡŽ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΊΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Π’ PHP Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкции:

    class A {}
    class B extends A {}

    class Producer {
    public function method(): A {}
    }
    class ChildProducer extends Producer {
    public function method(): B {}
    }

  • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ распаковки Π²Π½ΡƒΡ‚Ρ€ΠΈ массивов «…$varΒ», dozvoljavajuΔ‡i Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ подстановку ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… массивов ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ массива;

    $parts = [β€˜apple’, β€˜pear’];
    $fruits = [β€˜banana’, β€˜orange’, …$parts, β€˜watermelon’];
    // [β€˜banana’, β€˜orange’, β€˜apple’, β€˜pear’, β€˜watermelon’];

  • Sposobnost наглядного оформлСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… чисСл с раздСлитСлями Π² числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ… (1_000_000_00);
  • podrΕ‘ka слабых ссылок, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ связанного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сборщиком мусора;
  • Novo mehanizam сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (комбинация Serializable ΠΈ __sleep()/__wakeup()), ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ Π½Π° смСну интСрфСйсу Serializable, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ объявлСн ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ;

    // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив, содСрТащий всС состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;
    public function __serialize(): array;

    // ВосстанавливаСт состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· массива
    public function __unserialize(array $data): void;

  • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° гСнСрация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __toString();
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ кэша ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Для настройки Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€
    opcache.preload, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ PHP-скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ скомпилирован ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΏΡ€ΠΈ запускС сСрвСра. Π”Π°Π½Π½Ρ‹ΠΉ скрипт ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠΏΠΊΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… прямоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ opcache_compile_file();

  • Π’ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Hash Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция crc32c для вычислСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм с использованиСм ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠ° ΠšΠ°ΡΡ‚Π°Π½ΡŒΠΎΠ»ΠΈ;
  • Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ password_hash() Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ argon2i ΠΈ argin2id, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Sodium, Ссли PHP собираСтся Π±Π΅Π· libargon;
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция mb_str_split(), аналогичная str_split(), Π½ΠΎ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π½Π΅ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ Π° позициями символов Π² ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΉ строкС;
  • Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strip_tags() Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ массива с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‚Π΅Π³ΠΎΠ², Ρ‚.Π΅. вмСсто strip_tags($str, β€˜<a><p>’) Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ strip_tags($str, [β€˜a’, β€˜p’]);
  • Π’ proc_open() Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ пСрСчислСниС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π² массивС, вмСсто ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ строки для запуска, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСнаправлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора;

    proc_open([β€˜php’, β€˜-r’, β€˜echo Β«Hello World\nΒ»;’], $descriptors, $pipes);

    // Как 2>&1 в shell
    proc_open($cmd, [1 => [β€˜pipe’, β€˜w’], 2 => [β€˜redirect’, 1]], $pipes);

    // ΠΊΠ°ΠΊ 2>/dev/null ΠΈΠ»ΠΈ 2>nul Π² shell
    proc_open($cmd, [1 => [β€˜pipe’, β€˜w’], 2 => [β€˜null’]], $pipes);

  • Из Π±Π°Π·ΠΎΠ²ΠΎΠΉ поставки ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Firebird/Interbase, Recode ΠΈ WDDX. Π”Π°Π½Π½Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· PECL;
  • ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π² разряд ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π΅Ρ€Π½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±Π΅Π· скобок, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнтам массивов ΠΈ строкам с использованиСм Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок (Β«$var{$idx}Β»), функция is_real() ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΡƒ real, использованиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова parent Π±Π΅Π· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ allow_url_include, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ array_key_exists() Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

    ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_magic_quotes_gpc(), get_magic_quotes_runtime(),
    hebrevc(), convert_cyr_string(), money_format(), ezmlm_hash(), restore_include_path(), ldap_control_paged_result_response(), ldap_control_paged_result(), ReflectionType::__toString().

    ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ Π²Ρ‹Π²ΠΎΠ΄ прСдупрСТдСния ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ возмоТности ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… символов Π² функциях
    base_convert(), bindec(), octdec() ΠΈ hexdec(), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ нСстрокового шаблона Π² mb_ereg_replace().

izvor: opennet.ru