PHP to język skryptowy używany przez dużą liczbę użytkowników do celów tworzenia stron internetowych. Najnowsza stabilna i zaktualizowana wersja PHP 8.3 została wydana 23.11.2023. Od czasu wydania PHP 3.x w 2000 roku wprowadzono wiele innowacji i zmian. PHP jest nadal jednym z najpopularniejszych języków tworzenia stron internetowych (projektowania stron internetowych), z którego korzysta bardzo duża publiczność. W tym artykule zbadamy i przeanalizujemy innowacje i zmiany w PHP 8.3 z przykładami kodu.
PHP 8.3 Główne nowe funkcje i ulepszenia
W PHP 8.3 wprowadzono wiele istotnych innowacji i ulepszeń w porównaniu z poprzednią wersją PHP, PHP 8.2. Jednocześnie niektóre funkcje zostały uznane za przestarzałe. Przeanalizujemy teraz innowacje i ulepszenia jedna po drugiej z przykładami kodu.
Wpisane stałe klasy
Deklarowanie typu jest bardzo ważną funkcją dla programistów, która zwiększa stabilność i zmniejsza liczbę błędów podczas tworzenia stron internetowych. Funkcja deklaracji typu dla właściwości w klasie została dodana w PHP 7.4. Chociaż w późniejszych wersjach wprowadzono wiele ulepszeń tej funkcji, funkcja ta nadal nie była dostępna dla stałych w tej klasie. W PHP 8.3 możliwe jest teraz deklarowanie typów stałych w klasach.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}Niektóre deklaracje typów nie są obsługiwane w przypadku stałych klas.
Nieobsługiwane deklaracje typów stałych klas: void, callable, never
Nowa funkcja: json_validate()
Pracując z danymi w formacie JSON (dane zakodowane w formacie JSON), przed ich użyciem musimy sprawdzić, czy przychodzące dane są prawidłowe. Robiliśmy to w wersjach wcześniejszych niż PHP 8.3, używając następujących lub podobnych metod.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}W tym starym przykładzie podczas sprawdzania poprawności danych JSON PHP może zużywać znaczną ilość pamięci, w zależności od rozmiaru danych. W PHP 8.3 dodano nową funkcję PHP, która tworzy szybkie rozwiązanie zorientowane na wydajność: json_validate(). Poniżej przedstawiliśmy przykładowy scenariusz użycia tej funkcji.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}Nowa funkcja: #[Zastąpienie]
Implementując interfejsy w języku PHP, zapewniamy szczegółową funkcjonalność metod znajdujących się w interfejsie. Tworząc instancję klasy, możemy zastąpić metodę nadrzędną, tworząc alternatywną wersję o tej samej nazwie i zgodnym podpisie. Może to spowodować poważne problemy w oprogramowaniu. Krótko mówiąc, problem polega na tym, że naszym zdaniem zastąpiliśmy metodę główną w wyniku małej przeoczonej literówki.
Funkcja #[Override] w PHP 8.3 zapewnia rozwiązanie tego problemu. Zobaczmy to teraz na przykładzie.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}Głębokie klonowanie właściwości tylko do odczytu
PHP wprowadziło możliwość deklarowania właściwości poszczególnych klas jako tylko do odczytu w PHP 8.1 i przypisywania ich do całej klasy w PHP 8.2. Jednak większość twórców stron internetowych uważała, że ograniczenia nałożone podczas pracy z klasami zawierającymi takie funkcje uniemożliwiają praktyczność logiki programowania.
Aby to zmienić RFC Podano dwa główne zalecenia:
tylko do odczytu
readonlydopuszczenie zajęć, których nie wolno przedłużaćreadonlyumożliwiając ponowne uruchomienie funkcji podczas klonowania
Druga sugestia została uwzględniona w PHP 8.3. To nowe podejście zostało dodane do PHP 8.3 readonly instancje klasy z właściwościamireadonly właściwości) __clone Pozwala na ponowne uruchomienie za pomocą magicznej metody.
Ten przykładowy kod z RFC może pomóc nam zrozumieć, jak działa ta nowa metoda:
Dynamiczne pobieranie stałych klas i elementów wyliczeniowych
W przeciwieństwie do innych funkcji PHP, przechwytywanie stałych klas i elementów wyliczeniowych z nazwami zmiennych jest nieco bardziej skomplikowane. Przed PHP 8.3 mogliśmy to zrobić jak w poniższym przykładzie:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;Teraz uzyskajmy wartości, korzystając z definicji klas i wyliczeń z powyższego przykładu w PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;Nowa metoda: getBytesFromString()
Można powiedzieć, że ta metoda była najbardziej nieoczekiwana spośród funkcji dodanych w PHP 8.3: Generowanie losowego tekstu przy użyciu wstępnie zatwierdzonego zbioru znaków.
Ta nowa metoda jest bardzo prosta i przejrzysta. Nadajemy metodzie niektóre znaki jako zasoby i określamy, ile z nich chcemy wykorzystać. To wszystko! Teraz nasza metoda będzie zwracać wyniki z losowymi znakami, aż osiągną określoną długość. Teraz wyjaśnijmy to na przykładzie
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veriMożliwe jest, że wynik będzie dłuższy niż całkowita długość określonych przez nas znaków. Zrobiliśmy to w poniższym przykładzie:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriJeśli wszystkie znaki, które podajemy jako parametry są różne, prawdopodobieństwo, który z nich zostanie wybrany, jest równe. Możemy jednak sprawić, że na wyjściu pojawi się więcej tego samego znaku, dodając więcej niż jeden taki sam znak do naszej listy obsługiwanych znaków. Pokazaliśmy to w następnym przykładzie.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriNowe metody: getFloat() i nextFloat()
W tej innowacji PHP 8.3 wprowadza dwie nowe metody rozszerzające losowe rozszerzenie PHP: getFloat() i nextFloat().
Przykład tych metod:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veriDrobne innowacje i ulepszenia w PHP 8.3
Oprócz powyższych innowacji, PHP 8.3 zawiera dziesiątki innych drobnych ulepszeń i innowacji. Zestawiliśmy je wraz z dokumentami źródłowymi w poniższej liście.
- Nowe metody klasy DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() iMParentNode::replaceChildren(). - Nowe metody dla klasy IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()iIntlGregorianCalendar::createFromDateTime(). - Nowe funkcje LDAP: ldap_connect_wallet() i ldap_exop_sync().
- nowy
mb_str_pad()funkcja ciągu wielobajtowego (funkcja ciągu wielobajtowego). - Nowe funkcje POSIX:
posix_sysconf(),posix_pathconf(),posix_fpathconf()iposix_eaccess(). - Nowa metoda:
ReflectionMethod::createFromMethodName() - Nowa funkcja gniazda:
socket_atmark(). - Nowe funkcje ciągów (tekstowych):
str_increment(),str_decrement(), istream_context_set_options(). - Nowa metoda klasy ZipArchive:
ZipArchive::getArchiveFlag(). - Nowe ustawienie php.ini umożliwiające ustawienie maksymalnego dozwolonego rozmiaru stosu:
zend.max_allowed_stack_size.
Przestarzałe w PHP 8.3
Z każdą nową wersją PHP część kodu jest oznaczana jako przestarzała. Nigdy nie zaleca się używania tych funkcji, gdy są one całkowicie przestarzałe. Jeśli zostanie użyty przestarzały kod, po wykonaniu kodu zostanie zwrócony komunikat o błędzie.
Lista przestarzałych wersji PHP 8.3:
- Stała U_MULTIPLE_DECIMAL_SEPARATORS jest przestarzała.
- Mt19937
3MT_RAND_PHPWariant został wycofany. ReflectionClass::getStaticProperties()nie może już mieć wartości null.- Ustawienia PHP.ini
assert.active,assert.bail,assert.callback,assert.exceptioniassert.warningzostało zdeprecjonowane. get_class()iget_parent_class()zostało zdeprecjonowane.
PHP 8.3
W tym artykule dokonaliśmy przeglądu ważnych zmian i innowacji w PHP 8.3. Bardziej szczegółową listę wszystkich zmian w PHP 8.3 oficjalny dziennik zmian Zalecamy zapoznanie się z nim. Jeśli chcesz zaktualizować swoje kody lub witrynę z PHP 8.2 do PHP 8.3, ten przewodnik może być przydatny: Przewodnik migracji PHP 8.3 -> https://www.php.net/manual/en/migration83.php
Jeśli martwisz się wersjami PHP i migracją, zalecamy dać nowej wersji trochę czasu na aktualizację do PHP 8.3.
Pełne pokrycie języków PHP i JavaScript oraz powiązanych technologii jako Onur Özden Web Çözümleri Oprogramowanie internetowe Oferujemy usługi. Jeśli masz pytanie lub prośbę, możesz szybko skontaktować się z nami za pomocą przycisku Whatsapp w lewym dolnym rogu, aby otrzymać wycenę.



