Efter et års udvikling blev udgivelsen af programmeringssproget PHP 8.4 præsenteret. Den nye filial indeholder en række nye funktioner samt adskillige ændringer, der bryder kompatibiliteten.
Vigtigste ændringer i PHP 8.4:
- En ny implementering af JIT-kompileren, bygget på basis af IR Framework, foreslås. Den vigtigste forskel er, at den gamle JIT direkte genererede maskininstruktioner baseret på bytekode og ved hjælp af forskellige backends til x86_64- og AArch64-arkitekturerne, mens den nye JIT bruger en enkelt backend til alle arkitekturer og genererer en mellemrepræsentation (IR), som derefter er yderligere optimeret og konverteret til maskininstruktioner til den ønskede målplatform.
- Tilføjet understøttelse for at vedhæfte egenskabshook, så du kan tilføje yderligere logik, der udføres, når du ændrer eller får adgang til egenskaberne for et objekt, implementeret uden at opsnappe læse- og skriveoperationer ved hjælp af de almindelige funktioner __get og __set, og uden at oprette yderligere bindingsmetoder. Brugen af ejendomshandlere gør det muligt at reducere mængden af kode betydeligt og forenkle redefineringen af adfærden ved at arbejde med egenskaber, takket være bindingen af sin egen handler til hver egenskab. class User { public string $name { set { if (strlen($value) === 0) { throw new ValueError("Navnet skal være ikke-tomt"); } $this->name = $værdi; } } offentlig funktion __construct(streng $navn) { $this->name = $navn; } }
- Det er tilladt at angive referencer til metoder i den ”nye” konstruktion uden adskillelse af beslag, dvs. i stedet for “$name = (new MyClass())->method()” kan du nu angive “$name = new MyClass()->method()”.
- Tilføjet muligheden for asymmetrisk at kontrollere synligheden af objektegenskaber (offentlige, private, beskyttede), separat for skrive (sæt) og læse (hent) operationer. For eksempel: klasse PhpVersion { public private(set) string $version = '8.4'; } $phpVersion = ny PhpVersion(); var_dump($phpVersion->version); // string(3) "8.4" $phpVersion->version = 'PHP 8.3'; // fejl
- Leveret standardunderstøttelse af "dovne" objekter, som initialiseres på tidspunktet for første brug.
- I stedet for den generelle parameter "opcache.jit_buffer_size", foreslås parametrene "opcache.jit" og "opcache.jit_buffer_size" til at styre JIT-kompileren og konfigurere JIT-bufferstørrelsen. For at deaktivere JIT kan du nu angive "opcache.jit=disable" i stedet for "opcache.jit_buffer_size=0". Der er foretaget ændringer for at reducere hukommelsesforbruget og forbedre JIT-ydeevnen i nogle situationer.
- Tilføjet "#[\Deprecated]" attributten for at markere forældede funktioner, klasser og metoder. #[\Deprecated("brug newFunction() i stedet", siden: "1.1")] funktion oldFunction() { // ... }
- \Dom\HTMLDocument-klassen er blevet implementeret, der understøtter korrekt parsing af HTML5-markup.
- Tilføjet request_parse_body() funktion til at parse HTTP-anmodninger med multipart/form-data indholdstype (RFC1867).
- Tilføjede funktioner array_find(), array_find_key(), array_any() og array_all(). Funktionerne array_find() og array_find_key() returnerer det første element eller den første nøgle i arrayet, som checken specificeret gennem den brugerspecificerede tilbagekaldsfunktion virkede for. Funktionerne array_any() og array_all() returnerer til gengæld et hvilket som helst matchet element og alle matchede elementer. For at vise det første element, hvis titelfelt er større end 5 tegn, kan du for eksempel angive: $firstMatch = array_find( $posts, function (Post $post) { return strlen($post->title) > 5; } ) ;
- Tilføjet DateTime::getMicrosecond() og DateTimeImmutable::setMicrosecond($microsecond) metoder til at få og indstille tid med mikrosekund præcision, samt DateTime::createFromTimestamp() metoden.
- PDO (PHP Data Objects), en abstrakt grænseflade til at arbejde med databaser, har tilføjet muligheden for at oprette SQL-parsere og underklasser, der er specifikke for visse DBMS-drivere. Nye underklasser Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc og Pdo\Sqlite er blevet tilføjet.
- Tilføjet nye funktioner mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), mb_lcfirst(), bcceil(), bcdivmod(), bcfloor() og bcround(), pcntl_getcpu(), pcntl_getcpuaffinity(), pcosntl_getq , pcntl_setns(), pcntl_waitid(), http_get_last_response_headers(), http_clear_last_response_headers(), fpow()
- Exit- og die-operationerne kan nu kaldes som fuldgyldige funktioner, der kan overføres som et argument til andre funktioner. Tidligere var funktionaliteten af funktionerne exit() og die() meget begrænset, da de var indpakket over exit- og die-nøgleordene.
- Ændringer er blevet tilføjet for at gøre det sværere at udnytte bufferoverløbssårbarheder, samt for at øge randomiseringen af filnavne oprettet gennem tempnam()-funktionen.
- Forældede den adfærd, hvorved funktionsparametre med en standardværdi på null automatisk fik lov til at blive tildelt null-værdier. For at sådanne parametre kan acceptere nulværdier, kræves der nu en eksplicit indikation af præfikset "?". For eksempel, i stedet for "function save(Book $book = null) {}" skal du angive "function save(?Book $book = null) {}".
- Konstanterne E_STRICT, MYSQLI_REFRESH_*, funktionerne mysqli_ping(), mysqli_kill(), mysqli_refresh(), metoderne mysqli::ping(), mysqli::kill(), mysqli::refresh(), muligheden for at bruge "_ ” som klassenavn, nogle DOMDocument- og DOMEntity-egenskaber. Det er forbudt at omdefinere GMP-klassekonstanter, hvor det "endelige" nøgleord nu er indstillet.
Derudover kan vi bemærke udgivelsen af den statiske analysator PHPStan 2.0, som giver dig mulighed for at finde fejl i PHP-kode uden at udføre den og bruge enhedstests. Analysatoren giver 10 niveauer, der dækker områder som at identificere udefinerede variabler, ukendte klasser, funktioner og metoder; kontrollere typerne af argumenter og returværdier; korrekt brug af nogle typer; Definition af aldrig kaldt kode. Projektkoden er skrevet i PHP og distribueret under MIT-licensen.
Kilde: opennet.ru
