PHP 7.3 novinky a zmeny

PHP 7.3 nám prináša nové užitočné funkcie, deprecations a množstvo opravných chýb. Táto verzia php uľahči život hlavne webovým vývojárom .

Aktuálnu verziu PHP 7.3 si už môžete stiahnuť a testovať. Pokiaľ však nevyšla plna verzia PHP neodporúčame používať ju v produkčnom prostredí.

Harmonogram vydania verzii:

harmonogram vydania verzii

V tomto článku poskytneme prehľad o funkciách a zmenách, ktoré osobne považujeme za najzaujimavejsie. Úplný zoznam nových funkcií, zmien a opravených chýb nájdete na poznámkach upgradu a na stránke RFC návrhu PHP 7.3.

Čo je nové v PHP 7.3?

V tomto clanku sa pozrieme na nasledujúce zmeny PHP 7.3:

Heredoc a Nowdoc

Heredoc môže byť užitočným nástrojom pre väčšie reťazce, heredoc a nowdoc sa sa používaju na priradenie alebo identifikáciu retazca.

// Namiesto tohto výrazu:

$query = <<<SQL
SELECT * 
FROM `table`
WHERE `column` = true;
SQL;

// Je možné použiť toto:

$query = <<<SQL
    SELECT * 
    FROM `table`
    WHERE `column` = true;
    SQL;

To je obzvlášť užitočné, keď používate Heredoc v už vnorenom kontexte.

Biele priestory pred značkou na zatvorenie budú ignorované na všetkých riadkoch.

Dôležitá poznámka: kvôli tejto zmene niektoré existujúce Heredocs môžu prestat fungovat, keď používajú v tele tú istú uzavieraciu značku.

Koncové čiarky vo funkčných volaniach

Zadávacie čiarky (alebo „záverečné čiarky“) sú čiarky priložené k zoznamu prvkov, parametrov alebo vlastností a používajú sa v kontextoch, kde sa často pridávajú nové hodnoty, pretože zabraňujú chybám kvôli chýbajúcej čiarke. V PHP sú v poliach povolené koncové čiarky a od PHP 7.2 sú povolené v zoskupených menných priestoroch.

Od PHP 7.3 sa v deklaráciách funkcií povolili koncové čiarky. Funkcie Variadic sú príkladom kontextu, kde sú koncové čiarky veľmi užitočné:

foo( $bar, $baz, );

Môžeme použiť zadnú čiarku, keď vytvárame pole s compact() , aby sme vrátili formátovaný reťazec so sprintf() alebo pri zlúčení poľa:

$newArray = array_merge( $arrayOne, $arrayTwo, ['foo', 'bar'], );

Taktiež koncové čiarky by boli užitočné pri ladení:

var_dump( $foo, $bar, $baz, );

A sú velmi silny nastroj s unset() a isset() :

unset( $foo, $bar, $baz, ); isset( $foo, $bar, $baz, );

Koncové čiarky budú povolené aj v prípade volaní metód a príloh.

Táto zmena ovplyvní iba funkčné volania. Syntax definície funkcie sa nezmení .  Navyše voľné čiarky, viacnásobné zadávacie čiarky a vedúce čiary nebudú povolené vo funkciach povolené nebudú.

Ďalšie príklady nájdete na stránke RFC .

JSON_THROW_ON_ERROR

Jedna z najdôležitejších funkcií, ktoré prichádzajú s PHP 7.3, poskytuje nový spôsob riešenia chýb JSON. Toto nie je hlavná funkcia, ale prídavok k rozšíreniu JSON, ktorý zmenil chybové správanie json_decode () a json_encode () .

V súčasnosti json_decode() vracia hodnotu null ako chybu, ale null môže byť tiež platným výsledkom. To by mohlo byť mätúce, pretože

Je možné zistiť, či sa vyskytla chyba iba prostredníctvom volania json_last_error() alebo json_last_error_msg() , ktoré vrátia globálny stav chyby v strojovo čitateľných a ľudsky čitateľných formulároch. PHP RFC

json_encode() vracia chybu FALSE . Je to jasnejšie, pretože existuje špecifická hodnota chyby. Každopádne obe funkcie nezastavujú vykonanie programu pri chybe, ani nevyhazujú žiadne upozornenie .

Tento stav meni s PHP 7.3, RFC návrh zmeny:

Táto RFC namiesto aktuálneho stavu navrhuje pridanie novej hodnoty príznakovej voľby pre json_decode() a json_encode() , JSON_THROW_ON_ERROR . Pri odovzdaní tohto príznaku sa zmení chovanie týchto funkcií. Celkový stav chyby zostáva nedotknutý a ak sa vyskytne chyba, ktorá by ho inak nastavila, tieto funkcie namiesto toho hodia JsonException so správou a kódom na akékoľvek json_last_error() a json_last_error_msg(), ktore by nastali.

Tu je príklad znázorňujúci jednoduchý spôsob hádzania chyby JSON:

try { 
     json_decode("{", false, 512, JSON_THROW_ON_ERROR); 
} catch (\JsonException $exception) { 
     echo $exception->getMessage(); // echo "Syntax error" 
}

 Neplatný parameter hĺbky odovzdaný do json_decode() vráti varovanie a funkcia vráti NULL . Toto správanie nebude mať vplyv na JSON_THROW_ON_ERROR . Podobne chyby analýzy parametrov nie sú ovplyvnené JSON_THROW_ON_ERROR a naďalej vytvárajú upozornenia.

list () Referenčné priradenie

Čo znamená referenčné priradenie?

Pozrite si nasledujúci riadok:

$b = &$a;

Premenna $b dostane hodnotu $a , ale táto hodnota nie je skopírovaná z $a na $b . V PHP môžeme priradiť hodnotu referenciou, čo znamená, že dve premenné môžu smerovať na rovnaké dáta a každá zmena pre každú premennú ovplyvňuje pôvodné dáta. Tu je príklad z manuálu PHP :

<?php 
$a = 3; 
$b = &$a; // $b je referencia na $a 
print "$a\n"; // zobrazí 3 
print "$b\n"; // zobrazí 3

Teraz zmeníme hodnotu $a :

$a = 4; // zmena $a 
print "$a\n"; // zobrazí 4 
print "$b\n"; // zobrazí 4 pretože b je referencia na premennú a

Čo je list () Konštrktor a ako sa mení s PHP 7.3

list () sa môže použiť na „priraďovanie premenných, ako keby boli v poli“, ale s list() nie je v súčasnosti dovolené priraďovať hodnoty premenných referenciou.

PHP 7.3 tent problem vyriesilo, čo nám umožňuje priradiť premenné referenciou aj na list() konštrukt, ako je uvedené v nasledujúcom príklade:

$array = [1, 2]; list($a, &$b) = $array;

Ktorá je rovnaká ako:

$array = [1, 2]; $a = $array[0]; $b =& $array[1];

Výhodou tohto návrhu je, že teraz môžeme priradiť viaceré premenné odkazom, ktorý doteraz nebol povolený.

Viac informácií

is_countable Funkcia

Ďalšou užitočnou funkciou, ktorá prichádza s PHP 7.3 je is_countable() . Až do PHP 7.2 dostaneme chybu pri pokuse count () niečoho, čo nie je spočítateľné. Z tohto dôvodu, aby sme zabránili varovaniu, sme nútení pridať nasledujúci kód:

if (is_array($foo) || $foo instanceof Countable) { 
    // $foo is countable 
}

Z tohto dôvodu RFC navrhol funkciu is_countable () , ktorá vracia hodnotu true ak daná premenná je pole alebo je to počítajúca premenná, inak false . Takže vyššie uvedený kód by sa mohol zmeniť takto:

if (is_countable($foo)) { 
     // $foo is countable 
}

array_key_first (), array_key_last ()

V súčasnosti môžeme načítať prvý a posledný kľúč poľa pomocou funkcií reset () , end () a key () . Bohužiaľ, pri týchto funkciách nie je žiadny spôsob, ako zhromaždiť prvý alebo posledný index poľa bez zmeny jeho vnútorného stavu. Ďalšie možnosti zvyčajne znižujú čitateľnosť a výkonnosť kódu.
Z tohto dovodu boli navrhnute funkcie:

  • array_key_first()
  • array_key_last()

Od PHP 7.3, array_key_first() a array_key_last() umožňujú načítať prvý a posledný kľúč daného poľa bez ovplyvnenia vnútorného ukazovateľa poľa . Tieto nové funkcie nám umožnia napísať menej zložitý kód a v niektorých prípadoch zabrániť chybám.

viac informácií najdete na

Argon2 Password Hash Enhancements

Argon2 je hashovací algoritmus implementovaný v PHP 7.2 ako alternatíva k algoritmu Bcrypt. PHP 7.2 zaviedol konštantu PASSWORD_ARGON2I , ktorá je k dispozícii pre použitie v password_* :

password_hash('password', PASSWORD_ARGON2I);

Od jeho prvej implementácie bol pridaný nový variant Argonu2, takže PHP 7.3 pre Argon2 prichádza v troch variantoch:

  • Argon2d maximalizuje odolnosť proti crakujúcim útokom GPU. Je rýchlejší a využíva prístup založený na dátovej pamäti.
  • Argon2i využíva prístup k dátam nezávislý od pamäte, ktorý je preferovaný pri hašovaní hesla. Je pomalší, pretože robí viac prechádza cez pamäť na ochranu proti útokom z obchodovania.
  • Argon2id je hybridná verzia, ktorá kombinuje prístup Argon2i pre prvý prechod cez pamäť a prístup Argon2d pre následné prechody.

Argon2id sa odporúča na internete, s výnimkou prípadov, keď existujú dôvody na to, aby ste konkrétne uprednostnili iný variant.

Nový RFC navrhuje implementáciu Argon2id v rámci funkcií password_ * s novou konštantou PASSWORD_ARGON2ID :

password_hash('password', PASSWORD_ARGON2ID);

Implementácia je identická s implementáciou Argon2i a akceptuje rovnaké nákladové faktory:

  • Cena pamäte, ktorá definuje počet KiB, ktorý by sa mal spotrebovať počas hashovania (predvolené hodnoty sú 1 << 10 alebo 1024 KiB alebo 1 MiB)
  • Časové náklady, ktoré určujú počet iteracií algoritmu hash (predvolené na 2)
  • Faktor paralelnosti , ktorý nastavuje počet paralelných vlákien, ktoré sa použijú počas hashovania (predvolené hodnoty 2)

Pozrite si nasledujúci kód (príklad konfigurácie):

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2]; 
password_hash('password', PASSWORD_ARGON2ID, $options);

Deprecations

Nasledujúce funkcie / funkcionality budú označené ako deprecated v PHP 7.3 a odstránené najneskôr PHP 8.0.

  image2wbmp ()

Funkcia image2wbmp () vygeneruje alebo uloží verziu WBMP daného obrázka. Táto funkcia používa tri argumenty: zdroj obrázka, názov súboru (cesta k uloženému súboru) a farbu popredia.
Od PHP 5.0 je totožná s imagewbmp () , preto RFC navrhlo zrušenie a odstránenie tejto funkcie.

Zrušenie konštánt citlivé na malé a malé písmená

PHP v súčasnosti podporuje konštanty citlivé na veľké aj malé písmená a malé a veľké písmená. V každom prípade sú konštanty citlivé na malé a malé písmená podporované, ale považujú sa za predmet nekonzistentnosti vo funkciách a sú zložité na použitie.
Tento návrh začína týmito predpokladmi:

  • triedy konštánt sú vždy rozlišujúce malé a veľké písmená
  • globálne konštanty deklarované s const sú vždy veľké a malé písmená
  • konštány definované s define() majú predvolené rozlíšenie veľkých a malých písmen

RFC navrhuje tieto zmeny:

  • Deprecate call define() s tretím parametrom nastaveným na true – PHP 7.3
  • Odstrániť prístup konštantných citlivých na písmená s puzdrom odlišným od deklaracie (s výnimkou true , false a null ) – PHP 7.3
  • Odstrániť možnosť deklarovať konštanty citlivé na veľkosť písmen – PHP 8.0
  • Konvert true , false a null z konštánt so špeciálnym puzdrom na rezervované kľúčové slová – PHP 8.0

Daľšie deprecations pre PHP 7.3

Zoznam niektorych funkcií, ktoré sú zastarané v PHP 7.3. Úplný zoznam navrhovaných odpisov nájdete v článku Deprecations pre PHP 7.3 .

Nezdokumentované aliasy funkcie mbstring : existuje niekoľko neoznačených aliasov funkcie mbstring, ktoré sú duplicitami ekvivalentných funkcií pomocou prefixu mb_ . Napríklad mbereg je alias mb_ereg .
Všetky tieto funkcie by boli označené ako zastarané a upozornenie na odmietnutie by sa malo odhodiť, keď sa vyskytnú počas kompilácie.

Funkcie vyhľadávania reťazca s celočíselnou hladanim : tieto funkcie zvyčajne pracujú s reťazcami. Ak je zadané číslo s nie reťazcom, konvertuje sa na celé číslo a použije sa ako poradová hodnota znaku (viac si prečítajte v príručke PHP ).

Príklad:

$str = "There are 20 papers";
 var_dump(strpos($str, "20")); // int(20) 
var_dump(strpos($str, 20)); // bool(false)

Toto je považované za mätúce a spôsobuje nepredvídateľné problémy, pretože typ sa môže meniť pomocou zdroja údajov používateľov. Z tohto dôvodu RFC navrhuje vydanie upozornenia na odmietnutie, ak je non-string ihla prenesená na jednu z nasledujúcich funkcií:

  • strpos
  • strrpos
  • stripos
  • strripos
  • strstr
  • strchr
  • strrchr
  • stristr

V PHP 8.0 by sa malo odstrániť upozornenie na odmietnutie a ihly by sa mali automaticky premeniť na reťazce.

RFC navrhuje označiť fgetss() , gzgetss() a SplFileObject::fgetss() ako deprecated