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:
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
- Povolenie koncovej čiarky vo funkčných volaniach
- JSON_THROW_ON_ERROR
- list () Referenčné priradenie
- is_countable Funkcia
- array_key_first (), array_key_last ()
- Argon2 Password Hash Enhancements
- Deprecations
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()
alebojson_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()
ajson_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 hodiaJsonException
so správou a kódom na akékoľvekjson_last_error()
ajson_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í
- PHP Manual – list ()
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 natrue
– 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
anull
) – PHP 7.3 - Odstrániť možnosť deklarovať konštanty citlivé na veľkosť písmen – PHP 8.0
- Konvert
true
,false
anull
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