czwartek, 30 maja 2019

PHP dziwne przypadki: rzutowanie tablicy na obiekt

Przypisywanie pustego stringa jako klucz elementu


$myArray = ['' => 2];
$result  = $myArray[(string) null];
var_dump($result); // int(2)

Zwr贸膰 uwag臋 偶e null rzutowany na stringa daje w艂a艣nie pusty 艂a艅cuch znak贸w.

Co si臋 zatem stanie gdy taki pusty klucz mia艂by zosta膰 zamieniony na pole obiektu po rzutowaniu tablicy na obiekt?

$myObject = (object) ['' => 2];
var_dump($myObject);

Operacja ta nie wygenerowa艂a na 偶adnego b艂臋du a tre艣膰 var_dump'a jest do przewidzenia 

object(stdClass)#2 (1) { [""]=> int(2) }

Mamy pole do kt贸rego nie mo偶emy si臋 odwo艂a膰, kiepsko. 
Potrafi臋 wyobrazi膰 sobie use case'y gdzie deklaracja pustego klucza tablicy jest po偶膮dana, ale w czasie rzutowania takiego tworu na obiekt, moim zdaniem powinien zosta膰 wyrzucany jaki艣 error mode gdy偶 wtedy pozyskanie tej warto艣ci jest utrudnione.

W akcie desperacji postanowi艂em zaryzykowa膰 i odwo艂a膰 si臋 do obiektu jakbym mia艂 do czynienia z tablic膮!

$myObject[''];

Jednak szybko zosta艂em przywr贸cony do porz膮dku czytaj膮c wy艣wietlony komunikat

Fatal error: Uncaught Error: Cannot use object of type stdClass as array

M贸g艂bym posun膮膰 si臋 jeszcze dalej wprowadzaj膮c do akcji foreach'a - skuteczne ale paskudne.

foreach ($myObject as $field => $value) {
   echo $value;
}
// 2

Wiecie, to nie jest tylko problem pustego klucza ale te偶 kluczy numerycznych. Potrzebna by nam by艂a jaka艣 nowa sk艂adnia dzi臋ki kt贸rej okie艂znaliby艣my. Gdyby tylko co艣 takiego istnia艂o...

https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts

Jak wida膰 funkcjonalno艣膰 dost臋pna od wersji 7.2 - sp贸jrzmy na to


echo $myObject->{''}; // 2

Uda艂o si臋! Dr偶yjcie tablice numeryczne i pustokluczowe rzutowane na obiekty! Teraz ju偶 偶adna warto艣膰 si臋 nie skryje przed developerem. Mamy dost臋p do wszystkiego.

Na koniec, rzutem na ta艣m臋 stworzy艂em takiego potworka

$myObject = (object) [' ' => 2, '  ' => 3, '        ' => 4];

echo $myObject->{'        '}; // 4

I wiecie co? 艣miga a偶 mi艂o.


Brak komentarzy:

Prze艣lij komentarz