Wydanie języka programowania PHP 8.2

Po roku prac zaprezentowano wydanie języka programowania PHP 8.2. Nowa gałąź zawiera szereg nowych funkcji, a także kilka zmian psujących kompatybilność.

Kluczowe ulepszenia w PHP 8.2:

  • Dodano możliwość oznaczenia klasy jako tylko do odczytu. Właściwości w takich klasach można ustawić tylko raz, po czym nie będą one dostępne do zmiany. Wcześniej poszczególne właściwości klas można było oznaczyć jako tylko do odczytu, ale teraz można włączyć ten tryb jednocześnie dla wszystkich właściwości klas. Określenie flagi „tylko do odczytu” na poziomie klasy blokuje również dynamiczne dodawanie właściwości do klasy. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->nieznany = 'źle'; // Błąd: Nie można utworzyć właściwości dynamicznej Post::$unknown
  • Dodano osobne typy „true”, „false” i „null”, które mogą przyjmować tylko jedną prawidłową wartość i służą np. do zwrócenia funkcji z flagą zakończenia błędu lub wartością pustą. Wcześniej „true”, „false” i „null” można było używać tylko w połączeniu z innymi typami (na przykład „string|false”), ale teraz można ich używać osobno: funkcja zawszeFalse(): false { return false ; }
  • Zapewniono możliwość filtrowania wrażliwych ustawień w danych wyjściowych śledzenia stosu w momencie wystąpienia błędu. Wycięcie niektórych informacji może być konieczne, gdy informacje o występujących błędach są automatycznie wysyłane do usług stron trzecich, które śledzą problemy i informują o nich programistów. Na przykład można wykluczyć ze śledzenia parametry, które obejmują nazwy użytkowników, hasła i zmienne środowiskowe. test funkcji( $foo, #[\SensitiveParameter] $hasło, $baz ) { wyrzuć nowy wyjątek('Błąd'); } test('foo', 'hasło', 'baz'); Błąd krytyczny: nieprzechwycony wyjątek: błąd w pliku test.php:8 Ślad stosu: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main} rzucony w test.php w linii 8
  • Zezwolono na zdefiniowanie stałych w cechach (cecha, mechanizm ponownego wykorzystania kodu). Dostęp do stałych zdefiniowanych w cesze można uzyskać poprzez klasę korzystającą z tej cechy (ale nie poprzez nazwę cechy). cecha Foo { public constANT = 1; publiczny pasek funkcji(): int { return self::STAŁA; // Błąd krytyczny } } class Bar { use Foo; } var_dump(Bar::STAŁA); // 1
  • Dodano możliwość określenia typów w rozłącznej postaci normalnej (DNF, Disjunctive Normal Form), co pozwala łączyć sumę typów (zbiory dwóch lub więcej typów) i przecięcie typów (typy, których wartości mieszczą się w kilku typów jednocześnie). class Foo { publiczny pasek funkcji((A&B)|null $entity) { if ($entity === null) { return null; } zwróć $jedność; } }
  • Zaproponowano nowe rozszerzenie „Random” zawierające funkcje i klasy umożliwiające generowanie liczb i ciągów pseudolosowych. Moduł udostępnia interfejs obiektowy, umożliwia wybór różnych silników generowania liczb pseudolosowych, w tym nadających się do zastosowania w kryptografii oraz udostępnia funkcje pomocnicze np. losowe mieszanie tablic i ciągów znaków, wybieranie losowych kluczy tablic, jednoczesne korzystanie z kilku generatorów z własnym niezależnym państwem. $rng = $jest_produkcją? nowy Random\Engine\Secure(): nowy Random\Engine\Mt19937(1234); $randomizer = nowy Random\Randomizer($rng); $randomizer->shuffleString('foobar');
  • Zaimplementowano niezależną od ustawień regionalnych konwersję wielkości liter. Funkcje takie jak strtolower() i strtoupper() teraz zawsze konwertują wielkość liter w zakresie ASCII, tak jak podczas ustawiania ustawień regionalnych na „C”.
  • Dodano nowe funkcje: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodu_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
  • Dodano nowe metody: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod::hasPrototype.
  • Możliwość dynamicznego tworzenia właściwości w klasie została uznana za przestarzałą. W PHP 9.0 dostęp do właściwości, które nie są początkowo zdefiniowane w klasie, spowoduje błąd (ErrorException). Klasy udostępniające metody __get i __set do tworzenia właściwości lub właściwości dynamicznych w stdClass będą nadal działać bez zmian. Obsługiwana będzie tylko niejawna praca z nieistniejącymi właściwościami, aby chronić programistę przed ukrytymi błędami. Aby zachować działanie starego kodu, zaproponowano atrybut „#[AllowDynamicProperties]”, pozwalający na wykorzystanie właściwości dynamicznych.
  • Możliwość zastępowania wartości zmiennych ciągami znaków za pomocą wyrażeń „${var}” i ${(var)}” została wycofana. Zachowano obsługę często używanych podstawień „{$var}” i „$var”. Na przykład: „Witaj {$świecie}”; OK „Witaj $świecie”; OK "Witaj ${świecie}"; Przestarzałe: używanie ${} w łańcuchach jest przestarzałe
  • Przestarzałe, częściowo obsługiwane wywołania, które można wywoływać przez „call_user_func($callable)”, ale nie obsługują wywoływania w postaci „$callable()”: „self::method” „parent::method” „static::method” [„self”, „method”] [„parent”, „method”] [„static”, „method”] [„Foo”, „Bar::method”] [new Foo, „Bar :: metoda"]
  • Do ustawień dodana została dyrektywa error_log_mode, pozwalająca na określenie trybu dostępu do logu błędów.

Źródło: opennet.ru

Dodaj komentarz