Çfarë ka të re në PHP 8.1?


PHP 8.1 u lëshua në nëntor 2021 si versioni më i fundit i vogël i gjuhës PHP. Ai shton disa veçori të reja gjuhësore së bashku me disa përmirësime më të vogla dhe përmirësime të performancës. Ka disa ndryshime të rëndësishme për t'u ditur, por shumica e përmirësimeve nga PHP 8.0 duhet të jenë të drejtpërdrejta.

Tipare të reja

Përditësimi i PHP-së i këtij viti shton disa veçori të reja për të rritur produktivitetin e zhvilluesve. Ja çfarë do të mund të përdorni pasi të përmirësoni.

Enums

Llojet Enum janë më në fund pjesë e gjuhës PHP. Ato ju lejojnë të specifikoni se një vlerë duhet të jetë një nga një grup konstantesh të paracaktuara.

Krahasuar me konstantet e rregullta, enum-et ju japin vërtetim të integruar kur përdoren si parametra të metodës dhe vlera të kthyera. Ata gjithashtu mund të kenë vlera mbështetëse dhe metoda që bashkojnë sjellje shtesë.

# PHP 8.0
class PostStatus {
    const Draft = 1;
    const Published = 2;
}
 
# PHP 8.0 - Cannot typehint that the value 
#           of `$PostStatus` must be defined 
#           within `PostStatus`.
class Post {
    public function __construct(
        public string $Headline,
        public int $PostStatus) {}
}
 
# PHP 8.1
enum PostStatus {
    case Draft = 1;
    case Published = 2;
}
 
# PHP 8.1 - Now it's impossible to pass an 
#           invalid value as the status.
class Post {
    public function __construct(
        public string $Headline,
        public PostStatus $PostStatus) {}
}

Vetitë vetëm për lexim

Fjala kyçe e re vetëm për lexim shënon një veti të klasës si të pandryshueshme. Karakteristikat vetëm për lexim mund të shkruhen vetëm një herë. Përpjekja për të ndryshuar vlerën e tyre pas inicializimit do të sjellë një gabim.

Kjo thjeshton krijimin e objekteve të thjeshta me vlerë të pandryshueshme. Më parë ju duhej të shtonit metoda të përsëritura në një klasë nëse dëshironi të ekspozoni vlerat e vetive pa lejuar modifikimin. Tani mund t'i bëni vetitë publike pa rrezikuar mutacione të paqëllimshme.

# PHP 8.0 - This quickly becomes repetitive!
class Post {
    public function __construct(
        protected string $Headline) {}
 
    public function getHeadline() : string {
        return $this -> Headline;
    }
}
 
# PHP 8.1
class Post {
    public function __construct(
        public readonly string $Headline) {}
}

Llojet e kryqëzimeve

Sistemi i tipit PHP tani kupton kryqëzimet. Këto ju lejojnë të specifikoni se një vlerë duhet të zbatojë ndërfaqe të shumta.

Kjo është e dobishme në rastet kur kodi duhet të thërrasë metoda të shembullit që përcaktohen nga dy ndërfaqe të ndryshme. Më parë ju duhej të krijonit një ndërfaqe të re që zgjeronte të dyja ato të dëshiruara. Kjo nuk ishte gjithmonë praktike në rastet kur nuk mund të modifikonit klasën e synuar për të zbatuar ndërfaqen tuaj të re.

Kryqëzimet përcaktohen duke kombinuar dy ose më shumë lloje me një harakter ampersand. Ata shtojnë më shumë fleksibilitet në sistemin e tipit pas prezantimit të llojeve të bashkimit në PHP 8.0. Një paralajmërim është që aktualisht nuk mund të përdorni llojet e kryqëzimit dhe bashkimit së bashku – Countable&Stringable|CustomType është jashtë kufijve në këtë version.

# PHP 8.0
interface CountableString extends Countable, Stringable {}
 
public function countAndReport(CountableString $value) : void {
    echo "$value: " . count($value);
}
 
# PHP 8.1
public function countAndReport(Countable&Stringable $value) : void {
    echo "$value: " . count($value);
}

Fibrat

Fijet janë mekanizëm për të lehtësuar ekzekutimin e njëkohshëm. Ato e bëjnë më të lehtë zbatimin e blloqeve të kodit të rifillueshëm që mund të pezullohen nga kudo në pirg.

Fibers API është relativisht i nivelit të ulët. Nuk pritet që zhvilluesit e përdoruesve fundorë të ndërveprojnë me të rregullisht. Në vend të kësaj, Fibers do të integrohet në biblioteka që ofrojnë API asinkrone dhe zbatime të ciklit të ngjarjeve. Ata janë një sistem kontrolli i rrjedhës që mundëson abstraksione të thjeshtuara të nivelit më të lartë.

Fibrat ofrojnë një rrugë drejt thirrjeve të funksioneve asinkronike që duken si operacione të rregullta sinkrone. Ju mund të hiqni pllakën e bojlerit të lidhur me premtimet dhe thirrjet. Fibrat trajtojnë pezullimin dhe rifillimin e kodit në pikat e duhura, duke ofruar një API për bllokimin dhe mosbllokimin e zbatimeve të operacioneve.

# PHP 8.0 - A promise-based HTTP client
$response = $httpClient -> request("http://example.com")
    -> then(function (Response $Response) {
        return $Response -> getBody();
    });
print $response;
 
# PHP 8.1 - An HTTP client using Fibers internally
$response = $httpClient -> request("https://example.com");
print $response -> getBody();

Thirrje të klasit të parë

Callables tani janë qytetarë të klasit të parë në gjuhën PHP. Kjo do të thotë që ju mund t'i caktoni drejtpërdrejt funksionet variablave, pa përdorur sintaksën e vjetër të grupit ose krijimin e qartë të mbylljes.

Ky ndryshim do të jetë më i dobishëm në kontekstet e programimit funksional. Kalimi i funksioneve është më i pastër dhe më i lehtë me caktimin e drejtpërdrejtë të ndryshoreve.

# PHP 8.0
$builtin = Closure::fromCallable("array_filter");
$method = [$this, "getData"];
 
# PHP 8.1
$builtin = array_filter(...);
$method = $this -> getData(...);

... që zëvendëson parametrat e funksionit është një pjesë e detyrueshme e sintaksës. Kjo sinjalizon që dëshironi t'i caktoni funksionin variablit, në vend që të thërrisni funksionin dhe t'i caktoni vlerën e tij të kthimit.

Përdorimi i iniciatorëve të reja në

Një veçori tjetër e re është fjala kyçe i ri në inicializuesit. Tani mund të përdorni instancat e objekteve si vlera të paracaktuara të parametrave:

# PHP 8.0
class SendNewsletterAction {
    protected Mailer $Mailer;
    public function __construct(?Mailer $Mailer=null) {
        $this -> Mailer = $Mailer ?? new SmtpMailer();
    }
}
 
# PHP 8.1
class SendNewsletterAction {
    public function __construct(
        protected readonly Mailer $Mailer=new SmtpMailer()) {}
}

Fjala kyçe new do të funksionojë gjithashtu me variabla statike, konstante globale dhe argumente atribute. Ju jep më shumë fleksibilitet dhe komoditet kur dëshironi një shembull objekti si vlerë të paracaktuar.

Konstantet e klasës përfundimtare

Fjala kyçe përfundimtare tani mbështetet për konstantet e klasës. Ju mund të shënoni konstante individuale si përfundimtare pa vulosur të gjithë klasën. Më parë, klasat e fëmijëve ishin pa pagesë për të mbishkruar vlerën e konstantave të trashëguara nga prindërit.

# PHP 8.0 - Cannot disallow this without 
#           making the whole class `final`
class DemoClass {
    public const DemoConstant = 1;
}
class ChildClass extends DemoClass {
    public const DemoConstant = 2;
}
 
# PHP 8.1 - Just the constant can be `final`.
class DemoClass {
    final public const DemoConstant = 1;
}
class ChildClass extends DemoClass {
    // Raises a fatal error
    public const DemoConstant = 2;
}

Të tjerët

Përveç artikujve të mëdhenj të biletave të listuara më sipër, PHP 8.1 shton gjithashtu disa veçori komoditeti që ndihmojnë për ta bërë kodin më të vetëdokumentuar. Ju mund të shkruani numra oktalë me një shënim të qartë, si p.sh. 0o14, dhe të përdorni llojin e ri never kthye për të treguar funksionet që do të bëjnë një përjashtim ose do të dalin nga skripti aktual. Kjo ndihmon në informimin e zbulimit të kodit të vdekur në softuerin e analizës statike.

Ka disa funksione të reja në bibliotekën standarde. array_is_list() ju lejon të kontrolloni nëse një grup është një listë ([\foo\, \bar\]) ose shoqëruese ([\ foo\ => \bar\]), duke siguruar një implementim të integruar për një funksion që zakonisht gjendet në kodin ekzistues të tokës së përdoruesit. fsync() dhe fdatasync() ju lejojnë të sinkronizoni ndryshimet e treguesit të skedarit përsëri në median bazë të ruajtjes. Mbështetja e natriumit për algoritmet e hashimit XChaCha20 dhe Ristretto255 është shtuar gjithashtu.

Së fundi, ky version sjell perspektivën e përmirësimeve të performancës. Optimizimet duke përfshirë një memorie të trashëguar të klasës mund të ofrojnë një rritje të performancës falas deri në 8%. Kjo do të ishte më e dukshme në bazat e kodeve shumë të orientuara nga objekti me shumë marrëdhënie prind-fëmijë. PHP tani do t'i ruajë këto lidhje në mënyrë që të mos i rindërtojë vazhdimisht ato.

Ndryshime të papajtueshme prapa

Si një përplasje e vogël e versionit, ka disa ndryshime të thyera dhe zhvlerësim për t'u ditur përpara se të përmirësoni. Këtu janë ato që ka më shumë gjasa të ketë një problem në bazën tuaj të kodeve:

  • Rishkrimi i grupit $_GLOBALS nuk lejohet më. Mund të shkruash ende në çelësa individualë, por nuk mund të ricaktosh vetë $_GLOBALS.
  • Nëse zgjeroni një klasë të integruar, metodat tuaja të anashkaluara duhet të deklarojnë një lloj kthimi që është i pajtueshëm me atë origjinal. Një paralajmërim zhvlerësimi do të lëshohet nëse specifikoni një lloj të papajtueshëm. Një atribut #[ReturnTypeWillChange] aktualisht mbështetet si një mënyrë për të shmangur këtë për bibliotekat që duhet të mbështesin versione të shumta PHP.
  • Kalimi i null te parametrat jo të nulshëm të funksioneve të brendshme është zhvlerësuar. Kjo ishte e lejuar më parë, por nuk ishte në përputhje me zbatimin e shtypjes së shkrimit për funksionet e krijuara nga përdoruesi.
  • Transmetimet e nënkuptuara nga intfloat janë zhvlerësuar – kjo ndikon në skenarë të tillë si $array[10.1], ku do të jetë mantisa të humbur si vargje duhet të kenë çelësa me numra të plotë.
  • Si pjesë e punës së vazhdueshme të PHP për të hequr llojet e burimeve, disa grupe funksionesh tani punojnë me objekte të reja në vend të burimeve. Këto ndryshime zbatohen për API-të FileInfo, FTP, IMAP, LDAP, PgSQL dhe PSpell.
  • Funksionet që punojnë me entitete HTML si htmlspecialchars() dhe htmlentities() tani i shpëtojnë apostrofëve si parazgjedhje, kështu që do të bëhet '.
  • Thirrja e drejtpërdrejtë e metodave statike në tipare është zhvlerësuar; ju duhet të thërrisni metodën në një klasë që përdor tiparin në vend.

Heqjet dhe zhvlerësimet e tjera prekin API-të individuale, duke përfshirë PDO, MySQLi dhe Standard. Duhet të rishikoni të gjithë udhëzuesin e migrimit përpara se të përmirësoni projektin tuaj.

Të marra së bashku, ndryshimet e këtij cikli janë mjaft të padëmshme. Bazat e kodeve që ishin tashmë në përputhje me praktikat më të mira moderne të PHP-së nuk duhet të kenë shumë probleme kur kalojnë në 8.1. Kornizat e njohura duke përfshirë Symfony dhe Laravel tashmë mbështesin PHP 8.1 gjithashtu.

konkluzioni

PHP 8.1 shton shumë veçori të reja që e bëjnë përvojën e zhvillimit më të lehtë dhe më të efektshëm. Enumet kanë qenë prej kohësh një pjesë e munguar e sistemit të tipit ndërsa vetitë vetëm për lexim dhe new në iniciatorë do ta bëjnë më të shpejtë shkrimin e klasave të reja.

Fibrat ndihmojnë për ta bërë PHP-në asinkrone më të arritshme, ndërsa telefonat e klasit të parë lehtësojnë referenca të thjeshta të funksioneve kur praktikohen teknikat e programimit funksional. Të gjitha këto ndryshime e rritin më tej PHP-në si një gjuhë fleksibël që ofron garanci të forta sigurie për kodin tuaj, ndërkohë që është ende e thjeshtë për t'u punuar.


Të gjitha të drejtat e rezervuara. © Linux-Console.net • 2019-2024