To zdefiniujmy sobie lodówkę jako coś, co pozwala polecieć na księżyc

. Jak już się bierzesz za definiowanie, definiuj na podstawie tego, co faktycznie ma miejsce, gdyż inaczej taka definicja nie jest nic warta. Wg Twojej zmienną jest nawet zapis
53 - ostatecznie też reprezentuje wartość i ma określony typ.
"Coś" o określonym typie nazywa się "wartością". Zmienną masz zdefiniowaną w gramatyce PHP jako coś o nazwie
\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* . Czy pole obiektu spełnia ten warunek? Nie. Czy element tablicy spełnia ten warunek? Nie. Wprawdzie zmienne, pola obiektów oraz elementy tablic przechowują wartości oraz mają pewne nazwy pozwalające na dobranie się do nich, mają inne właściwości w gramatyce i semantyce języka, więc nie można ich traktować tak samo. Prosty przykład: jeśli wszystkie te rzeczy są zmiennymi, dlaczego nie zadziała poniższy kod:
<?php
$foo = function(){ echo 'foo'; } $obj = new stdClass;
$obj->bar = function(){ echo 'bar'; }
$foo(); // OK
$obj->bar(); // Błąd
Nie zadziała, ponieważ
$obj->bar nie jest zmienną, lecz polem obiektu, a tymczasem aby wywołać funkcję anonimową, musi być ona zapisana w zmiennej. Zauważ, że taki zapis jest nawet niejednoznaczny gramatycznie. Przecież w obiekcie może być zarówno pole
bar, jak i metoda
bar(). Jeśli do pola przypiszemy funkcję anonimową, co wtedy należy wywołać?