07
decembrie 2020
PHP 7.4 - Noutăți
PHP 7.4 este cea mai recentă versiune stabilă a PHP. A fost lansat pe 28 noiembrie 2019 și este ultima versiune înainte de PHP 8 . Acesta aduce o mulțime de caracteristici noi, adăugiri de sintaxă și remedieri. În această postare veți găsi o listă cu tot ce este nou și modificat pentru a vă ajuta să vă pregătiți pentru upgrade. Să începem totuși cu câteva puncte culminante, incluse în PHP 7.4:
- Funcții săgeată pentru funcții mai curate cu o singură linie
- Preîncărcare pentru a îmbunătăți performanța
- Proprietăți tastate în clase
- Varianță de tip îmbunătățită
- Operatorul de atribuire coalescență nul ca prescurtare
- FFI pentru o mai bună dezvoltare a extensiei în PHP
- Punctele de subliniere pot fi utilizate pentru formatarea valorilor numerice
- Răspândirea operatorului în matrice
Functii noi
PHP 7.4 vine cu o cantitate remarcabilă de noi caracteristici. Vom începe cu o listă cu toate funcțiile noi, apoi vom analiza modificările și deprecierile.
O notă înainte să ne scufundăm: dacă totuși aveți o versiune mai mică de PHP, veți dori, de asemenea, să citiți ce este nou în PHP 7.3.
Funcții săgeată rfc
Funcțiile săgeți, denumite și „închideri scurte”, permit funcții cu un singur liner mai puțin detaliate.
În timp ce ați scrie anterior acest lucru:
array_map(function (User $user) {
return $user->id;
}, $users)
Acum puteți scrie acest lucru:
array_map(fn (User $user) => $user->id, $users)
Există câteva note despre funcțiile săgeții:
- Aceștia pot accesa întotdeauna domeniul de aplicare părinte, nu este nevoie de
use
cuvântul cheie. $this
este disponibil la fel ca închiderile normale.- Funcțiile săgeată pot conține o singură expresie, care este și instrucțiunea return.
Proprietăți tastate rfc
Variabilele de clasă pot fi sugerate de tip:
class A
{
public string $name;
public ?Foo $foo;
}
Varianță de tip îmbunătățită rfc
De asemenea, am scris despre sistemul de tip PHP în trecut, așa că este bine să vedem că unele îmbunătățiri sosesc de fapt în nucleul PHP.
Varianța de tip este un alt subiect care merită propria sa postare pe blog, dar pe scurt: veți putea folosi tipuri de returnare covariante -
class ParentType {}
class ChildType extends ParentType {}
class A
{
public function covariantReturnTypes(): ParentType
{ /* … */ }
}
class B extends A
{
public function covariantReturnTypes(): ChildType
{ /* … */ }
}
- și argumente contravariante.
class A
{
public function contraVariantArguments(ChildType $type)
{ /* … */ }
}
class B extends A
{
public function contraVariantArguments(ParentType $type)
{ /* … */ }
}
Operator de atribuire nul rfc
Următorul este operatorul de atribuire nul de coalescență, o prescurtare pentru operațiuni de coalescență nulă. În loc să faceți acest lucru:
$data['date'] = $data['date'] ?? new DateTime();
Poți sa faci asta:
$data['date'] ??= new DateTime();
Operator de răspândire matrice rfc
În continuare, acum este posibil să utilizați operatorul de răspândire în tablouri:
$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6 ,7];
// [0, 1, 2, 3, 4, 5, 6, 7]
Rețineți că acest lucru funcționează numai cu tablouri cu taste numerice.
Separator literal numeric rfc
PHP 7.4 permite utilizarea punctelor de subliniere pentru a separa vizual valorile numerice. Se pare că:
$unformattedNumber = 107925284.88;
$formattedNumber = 107_925_284.88;
Sublinierile sunt pur și simplu ignorate de motor.
Interfață funcție străină rfc
Trecând la câteva caracteristici la nivel de bază: interfața funcției străine sau „FFI” pe scurt, ne permite să apelăm codul C din userland. Aceasta înseamnă că extensiile PHP ar putea fi scrise în PHP pur și încărcate prin intermediul compozitorului.
Trebuie remarcat însă că acesta este un subiect complex. În continuare aveți nevoie de cunoștințe C pentru a putea utiliza corect această caracteristică.
Preîncărcare rfc
O altă caracteristică de nivel inferior este preîncărcarea. Este o completare uimitoare la nucleul PHP, ceea ce poate duce la unele îmbunătățiri semnificative ale performanței.
Pe scurt: dacă utilizați un framework, fișierele acestuia trebuie încărcate și conectate la fiecare cerere. Preîncărcarea permite serverului să încarce fișiere PHP în memorie la pornire și să le aibă permanent disponibile pentru toate cererile ulterioare.
Câștigul de performanță vine, desigur, cu un cost: dacă sursa fișierelor preîncărcate este modificată, serverul trebuie repornit.
Serializarea obiectelor personalizate rfc
Au fost adăugate două noi metode magice: __serialize
și __unserialize
. Diferența dintre aceste metode și __sleep
și __wakeup
este discutată în RFC.
Reflecție pentru referințe rfc
Bibliotecile, cum ar fi basculanta var Symfony, se bazează foarte mult pe API-ul de reflecție pentru a descărca în mod fiabil o variabilă. Anterior nu era posibil să reflectăm în mod corespunzător referințele, rezultând ca aceste biblioteci să se bazeze pe hacks pentru a le detecta.
PHP 7.4 adaugă ReflectionReference
clasa care rezolvă această problemă.
Referințe slabe rfc
Referințele slabe sunt referințe la obiecte, care nu împiedică distrugerea lor.
mb_str_split
adăugat rfc
Această funcție oferă aceeași funcționalitate ca str_split
, dar pe șiruri multi-octet.
Registrul Hashing Parole rfc
S-au făcut modificări interne în modul în care sunt utilizate bibliotecile de hash, astfel încât să fie mai ușor pentru țara utilizatorilor să le folosească.
Mai precis, password_algos
a fost adăugată o nouă funcție care returnează o listă a tuturor algoritmilor de parole înregistrate.
RFC a fost puțin neclar despre beneficii, din fericire, Sara a reușit să ofere mai mult context: Înseamnă că ext / sodium (sau oricine într-adevăr) poate înregistra dinamic algoritmi de hash de parolă. Rezultatul este că argon2i și argon2id vor fi mai frecvent disponibile în continuare
Modificări și deprecieri
Pe lângă funcțiile noi, există și multe modificări ale limbii. Majoritatea acestor modificări sunt neîntrerupte, deși unele ar putea avea un efect asupra bazelor de coduri.
Rețineți că avertismentele de depreciere nu sunt în funcție de definiție „de rupere”, ci doar o notificare către dezvoltator că funcționalitatea va fi eliminată sau modificată în viitor. Ar fi bine să nu ignorați avertismentele de depreciere și să le reparați imediat; deoarece va face mai ușoară calea de actualizare pentru PHP 8.0.
Aprecierea operatorului ternar asociativ la stânga rfc
Operatorul ternar are câteva aspecte ciudate în PHP. Acest RFC adaugă un avertisment de depreciere pentru instrucțiunile ternare imbricate. În PHP 8, această depreciere va fi convertită într-o eroare de timp de compilare.
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
Excepții permise în __toString
rfc
Anterior, excepțiile nu puteau fi aruncate __toString
. Au fost interzise din cauza unei soluții pentru unele mecanisme vechi de tratare a erorilor, dar Nikita a subliniat că această „soluție” nu a rezolvat de fapt problema pe care a încercat să o abordeze.
Acest comportament este acum modificat și pot fi aruncate excepții __toString
.
Prioritatea concatenării rfc
Dacă ai scrie ceva de genul acesta:
echo "sum: " . $a + $b;
PHP l-ar interpreta anterior astfel:
echo ("sum: " . $a) + $b;
PHP 8 îl va face astfel încât să fie interpretat astfel:
echo "sum: " . ($a + $b);
PHP 7.4 adaugă un avertisment de depreciere atunci când întâlnești o expresie neparentezată care conține un semn .
înainte +
sau a -
.
array_merge
fără argumente modernizare
De la adăugarea operatorului spread, ar putea exista cazuri în care doriți să utilizați array_merge
astfel:
$merged = array_merge(...$arrayOfArrays);
Pentru a susține cazul de margine în care $arrayOfArrays
ar fi gol, ambele array_merge
și array_merge_recursive
acum permiteți o listă de parametri goi. O matrice goală va fi returnată dacă nu a fost trecută nicio intrare.
Paranteze cretate pentru acces la matrice și șiruri rfc
A fost posibil să accesați tablouri și compensări de șiruri folosind paranteze buclate:
$array{1};
$string{3};
Acest lucru a fost depreciat.
Notificări de acces la matrice nevalide rfc
Dacă ar fi să utilizați sintaxa accesului matricei, să zicem, un număr întreg; PHP ar reveni anterior null
. Începând cu PHP 7.4, va fi emisă o notificare.
$i = 1;
$i[0]; // Notice
proc_open
îmbunătățiri modernizare
S-au făcut modificări pentru proc_open
a putea executa programe fără a trece printr-un shell. Acest lucru se face prin trecerea unui tablou în locul unui șir pentru comandă.
strip_tags
acceptă, de asemenea, tablouri modernizare
Obișnuiai să poți dezbrăca mai multe etichete astfel:
strip_tags($string, '<a><p>')
PHP 7.4 permite, de asemenea, utilizarea unui tablou:
strip_tags($string, ['a', 'p'])
ext-hash
întotdeauna activat rfc
Această extensie este acum disponibilă permanent în toate instalările PHP.
PEAR nu este activat în mod implicit externe
Deoarece PEAR nu mai este întreținut în mod activ, echipa de bază a decis să elimine instalarea implicită cu PHP 7.4.
Mai multe deprecieri mici rfc
Acest RFC include multe mici deprecieri, fiecare cu votul său. Asigurați-vă că citiți o explicație mai detaliată pe pagina RFC, deși iată o listă de lucruri învechite:
real
tipul- Magia citează moștenirea
array_key_exists()
cu obiecteFILTER_SANITIZE_MAGIC_QUOTES
filtruexport()
Metode de reflecțiemb_strrpos()
cu codificarea ca al 3-lea argumentimplode()
mix de ordine de parametri- Nu se leagă
$this
de închiderile nestatice hebrevc()
funcţieconvert_cyr_string()
funcţiemoney_format()
funcţieezmlm_hash()
funcţierestore_include_path()
funcţieallow_url_include
directiva ini
Alte modificări
Ar trebui să aruncați întotdeauna o privire la documentul complet de ACTUALIZARE atunci când actualizați versiunile PHP.
Iată câteva modificări evidențiate:
- Apelarea
parent::
la o clasă fără părinte este depreciată. - Apelarea
var_dump
laDateTime
sauDateTimeImmutable
instanță nu va mai lăsa în urmă proprietăți accesibile pe obiect. openssl_random_pseudo_bytes
va arunca o excepție în situații de eroare.- Încercarea de a serializa o
PDO
sau oPDOStatement
instanță va genera unException
în loc de unPDOException
. - Apelarea
get_object_vars()
la oArrayObject
instanță va returna proprietățileArrayObject
proprii și nu valorile matricei sau obiectului înfășurat. Rețineți că(array)
proiectările nu sunt afectate. ext/wwdx
a fost depreciat.
Sursa: https://stitcher.io