Co nowego w PHP v7.3? Opisaliśmy wszystkie 34 zmiany

13 grudnia zostanie udostępniona wersja produkcyjna PHP v7.3. Zmian jest naprawdę dużo, choć nie są rewolucyjne. Większość z nich to drobnostki, ale na pewno każdy znajdzie coś dla siebie. Wszystkie 34 aktualizacje postanowiłem opisać poniżej.

22. ArrayAccess nie zrzutuje $offset typu string na int

Gdy obiekt implementuje interfejs ArrayAccess i odwołujesz się do niego poprzez $foo['123'] to zostanie na nim wywołana metoda ->offsetGet(123) w przypadku v7.2. Zwróć uwagę, że string 123 został rzucony na int. W v7.3 zostało to poprawione więc kod prawidłowo wywoła ->offsetGet('123'); Przykład kodu:

Przy tej zmianie radzę zweryfikować czy stary kod działa poprawnie. Polecam Unit Testy do tego.

Więcej informacji:

https://github.com/php/php-src/commit/30156d588c07e26d4e752ddb62344e96854d4773#diff-ff4e2dc4962dc25a1512353299992c8dL19

23. Naprawiono referencje w statycznych własnościach klas

Statyczne własności są współdzielone między instancjami klasy oraz między instancjami klasami potomnymi. Wyjątkiem jest klasa potomna, która bezpośrednio nadpisze własność. Co ciekawe, w v7.2 jest dość ciekawy błąd, który pozwala zepsuć współdzielenie dzięki użyciu referencji:

W v7.3 zostało to naprawione, obie klasy będę miały wartość int(1).

Przy tej zmianie radzę zweryfikować czy stary kod działa poprawnie. Polecam Unit Testy do tego.

Więcej informacji:

24. Naprawiono odpakowywanie argumentów z kluczami nie int

Okazuje się, że w PHP v7 – v7.2 był błąd, dzięki któremu ten kod:

w pełni działał. Zostało to naprawione i rzucany jest teraz wyjątek:

Przy tej zmianie radzę zweryfikować czy stary kod działa poprawnie. Polecam Unit Testy do tego.

Więcej informacji:

https://github.com/php/php-src/commit/3a8f26060c44b86145f332e87c53668cac58a6d0

25. BCMath użyje obsługi błędów PHP

Wcześniej niektóre ostrzeżenia rzucane przez funkcje BCMath były wypisane bezpośrednio do stderr. Przykład:

Więcej informacji:

26. Wsparcie dla BeOS porzucono

System ten został wykupiony przez Palm w 2001. Od tego czasu nie było nowej wersji systemu. Więcej:

27. Deprecated – image2wbmp()

W rozszerzeniu gd do PHP są dwie bardzo zbliżone do siebie funkcje, image2wbmp() (http://php.net/manual/en/function.image2wbmp.php) oraz imagewbmp() (http://php.net/manual/en/function.imagewbmp.php). Robią one praktycznie to samo, więc ekipa PHP postanowiła zostawić tylko jedną. W 7.3 image2wmbp zostaje oznaczona jako deprecated, w kolejnych wersjach zostanie usunięta.

Więcej informacji:

28. Deprecated – Stałe case-insensitive

PHP aktualnie wspiera zmienne case-sensitive oraz case-insensitive. Te drugie można zadeklarować używając funkcji define() z trzecim parametrem true (http://php.net/manual/en/function.define.php). By ujednolicić oraz pozbyć się dziwnych problemów typu:

więc zespół PHP oznaczył stałe case-insensitive jako deprecated. Więc teraz język będzie wyrzucał takie oto wiadomości:

W kolejnych wersjach stałe te zostaną usunięte.

ZOBACZ TEŻ:  Pójdziemy na L4, jeśli czujemy wypalenie zawodowe. Zmiany od przyszłego roku

Więcej informacji:

29. Deprecated – funkcje mb* bez dokumentacji

Lista funkcji:

  • mbregex_encoding,
  • mbereg,
  • mberegi,
  • mbereg_replace,
  • mberegi_replace,
  • mbsplit,
  • mbereg_match,
  • mbereg_search,
  • mbereg_search_pos,
  • mbereg_search_regs,
  • mbereg_search_init,
  • mbereg_search_getregs,
  • mbereg_search_getpos,
  • mbereg_search_setpos.

Wszystkie te funkcje to aliasy do funkcji z prefiksem mb_, np. mberegi to alias do mb_eregi.

Więcej informacji:

30. Deprecated – funkcje szukania w string z argumentem nie string int

Dotyczy to funkcji:

  • strpos,
  • strrpos,
  • stripos,
  • strripos,
  • strstr,
  • strchr,
  • strrchr,
  • stristr.

Załóżmy, że w string Ala ma 10 kotów chcesz znaleźć 10, ale przekazujesz 10 jako int. Niestety to nie zadziała, ponieważ powyższe funkcje rzutują na int każdy argument, który nie jest typu string. Następnie dla wynikowej wartości pobierają znak z tablicy ASCII.10 w ASCII to znak nowej linii. Sam tego nie wiedziałem, dopóki nie zacząłem pisać tego wpis. Kod w 7.2:

Kod w 7.3:

Więcej informacji:

31. Deprecated – fgetss() oraz filter string.strip_tags

Obie konstrukcje umożliwiają użycie funkcjonalności z strip_tags() podczas streamingu. Jak wiadomo strip_tags() działa niezbyt dokładnie, dlatego zespół PHP postanowił oznaczyć następujące twory jako deprecated:

  • funkcja fgetss()
  • funkcja gzgetss()
  • metoda SplFileObject::fgetss()
  • filter streamu string.strip_tags()

Więcej informacji:

W PHP jest wbudowana funkcja assert(). Jest ona specjalnie traktowana przez kompilator, tzn gdy ustawisz w zend.assertions=-1 to kompilator tą funkcję po prostu pominie. Przydatne gdy korzystasz z tej funkcji, a kod wrzucasz na produkcję. Co ciekawe, możesz sobie zdefiniować własną funkcję assert() w nieglobalnym namespace np. foo\assert(). A w samym PHP jest błąd, po wyłączeniu wbudowanej funkcji assert(), wszystkie zdefiniowane przez użytkownika również zostaną wyłączone. Dlatego w 7.3 podczas definiowania własnej funkcji assert() zostaniemy poinformowani, że jest to Deprecated:

Więcej informacji:

32. Deprecated – FILTER_FLAG_SCHEME_REQUIRED oraz FILTER_FLAG_HOST_REQUIRED

Od wersji 5.2.1 FILTER_VALIDATE_URL implikuje oba filtry, więc są one zbędne. Dodatkowo tworzą wrażenie, że walidacja schematu / host może zostać pominięta, co jest nieprawdą. Od 7.3 podczas próby ich użycia otrzymasz ostrzeżenie Deprecated:

33. Deprecated – pdo_odbc.db2_instance_name dyrektywa php.ini

Od wersji 5.1.1 ta dyrektywa została oznaczona jako Deprecated w manualu. Okazuje się jednak że w kodzie nie była oznaczona jako Deprecated (a to psikus), więc zostało to „ujednolicone”. Dyrektywa ta modyfikuje zmienną środowiskową DB2INSTANCE dla systemów nie-Windows. Jak wiadomo zmiana czegoś globalnego to nie jest dobry pomysł…

Więcej informacji:

Podsumowanie

Czy warto zaktualizować do v7.3? Jasne, że tak. Nie ma aż tak dużo zmian, które nie są kompatybilne, większość starego kodu powinna bez problemu działać. Przy zmianach, które mogą robić problemy dodałem ostrzeżenia. PhpStorm już jest gotowy na zmiany: https://www.jetbrains.com/phpstorm/nextversion/#php-73-support.

Mam nadzieję że spodobał Ci się ten post. Starałem się, by wszystkie zmiany wytłumaczyć oraz dodać stosowane źródła. Nie chciałem by ten wpis był tylko tłumaczeniem changeloga.


Artykuł został pierwotnie opublikowany na damian.dziaduch.pl. Zdjęcie główne artykułu pochodzi z pexels.com.

Zapraszamy do dyskusji

Patronujemy

 
 
More Stories
Wybór rozwiązań technicznych – co warto wziąć pod uwagę?