Wpis PHP 7.3 – nieścisłosci

Cześć!

Serdecznie dziękuję za przeczytanie poprzedniego wpisu o nowej wersji PHP. Wpis był bardzo długi, poświęciłem mnóstwo pracy nad nim. Głównie w godzinach bardzo porannych 🙃. Niestety znalazły się w nim dwa błędy, za co najmocniej przepraszam. W tym wpisie opiszę oba błędy, zapraszam do czytanie 🙂.

Operator instanceof – literał jako pierwszy operand – brak Fatal error

Błędny był opis tej sekcji. Pierwotny opis brzmiał:

Załóżmy, że masz tablicę z nieznaną Ci zawartością i chcesz z wyciągnąć tylko obiekty danej instancji. Teoretycznie wystarczy przefiltrować tablicę za pomocą instanceof:

$dateTimeObjects = array_filter($data, function ($data) {
return $data instanceof \DateTime;
});

Jednak w v7.2 spowoduje to Fatal error:

// Fatal error: instanceof expects an object instance, constant given in php shell code on line 1

Do wersji v7.2 operator instanceof działał tylko z obiektami, w v7.3 naprawili to i teraz możesz wykonać instanceof na dowolnym typie zmiennej, w przypadku gdy nie będzie ona obiektem, zwróci false:

php > var_dump(false instanceof \stdClass);
bool(false)
php > var_dump([] instanceof \stdClass);
bool(false)
php > var_dump('test' instanceof \stdClass);
bool(false)
php > var_dump(1 instanceof \stdClass);
bool(false)

Operator instanceof działa z zmiennymi, nie rzuca wyjątku. Użytkownik PHP w komentarzach mi zwrócił uwagę na ten błąd. Faktycznie sprawdziłem ten przykład kodu raz jeszcze i wyjątek nie był rzucany w poprzednich wersjach 🙈. Co ciekawe napisałem w tytule sekcji Literał, a Literał to przecież zapis stałej wartości, nie zmiennej 🙃 (https://pl.wikipedia.org/wiki/Literał). Także tutaj popełniłem gafę tysiąc. Poprawiona wersja dostępna w oryginalnym wpisie (https://damian.dziaduch.pl/2018/11/15/php-7-3-co-nowego/#instanceof-literal-jako-pierwszy-operand-brak-fatal-error).

Nowe funkcje array_key/value_first/last()

RFC (https://wiki.php.net/rfc/array_key_first_last) opisuje cztery nowe funkcje:

  • array_key_first(),
  • array_key_last(),
  • array_value_first(),
  • array_value_last().

Przegłosowane i zaimplementowane z nich zostały tylko dwie pierwsze… Niedoczytałem tej informacji i w wersji pierwotnej opisałem że będą wszystkie funkcje dostępne 🤦🏻‍♂️. Z wpisu usunąłem już informacje o dwóch ostatnich funkcjach (https://damian.dziaduch.pl/2018/11/15/php-7-3-co-nowego/#nowe-funkcje-array_key_first_last).

Wpis o wersji 7.3 zawiera 34 sekcje. Dwie były błędne. Cały artykuł w wersji obecnej ma 3264 słowa i jest 119 wersją. Dotarł on do 2500 czytelników. Serdecznie dziękuję 😃