PHP 7.4 - Noutăți

07

decembrie 2020

PHP 7.4 - Noutăți

De: Tree Web Solutions | Etichete: php 7.4, functii noi php 7.4, noutati php 7.4

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 usecuvâ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 __wakeupeste 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ă ReflectionReferenceclasa 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_algosa 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_mergeastfel:

$merged = array_merge(...$arrayOfArrays);

Pentru a susține cazul de margine în care $arrayOfArraysar fi gol, ambele array_mergeși array_merge_recursiveacum 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_opena 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:

  • realtipul
  • Magia citează moștenirea
  • array_key_exists() cu obiecte
  • FILTER_SANITIZE_MAGIC_QUOTES filtru
  • export()Metode de reflecție
  • mb_strrpos() cu codificarea ca al 3-lea argument
  • implode() mix de ordine de parametri
  • Nu se leagă $thisde închiderile nestatice
  • hebrevc() funcţie
  • convert_cyr_string() funcţie
  • money_format() funcţie
  • ezmlm_hash() funcţie
  • restore_include_path() funcţie
  • allow_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_dumpla DateTimesau DateTimeImmutableinstanță 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 PDOsau o PDOStatementinstanță va genera un Exceptionîn loc de un PDOException.
  • Apelarea get_object_vars()la o ArrayObjectinstanță va returna proprietățile ArrayObjectproprii ș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

Distribuie această postare