Co wolno, a czego nie w tablicach?
Dlaczego zapis $foo[bar] jest niepoprawny?
W starych skryptach można spotkać taką składnię:
$foo[bar] = 'coś';
echo $foo[bar];
// itd.
Ten zapis jest niepoprawny, ale działa. Dlaczego zatem jest niepoprawny? Powód jest to, co opisano w rozdziale składnia, że pomiędzy nawiasami kwadratowymi ('[' i ']') musi znajdować się wyrażenie. Oznacza to, że można używać czegoś takiego:
echo $arr[ foo(true) ];
Jest to przykład użycia wartości zwracanej przez funkcję jako indeksu tablicy. php zna też stałe, więc można spotkać zastosowanie E_*.
$opis_błędu[E_ERROR] = "Wystąpił poważny błąd";
$opis_błędu[E_WARNING] = "php wysłało ostrzeżenie";
$opis_błędu[E_NOTICE] = "To jest tylko nieformalna uwaga";
Proszę pamiętać, że E_ERROR jest także ważnym identyfikatorem, tak jak bar w pierwszym przykładzie. Ale ostatni przykład znaczy to samo co:
$opis_błędu[1] = "Wystąpił poważny błąd";
$opis_błędu[2] = "php wysłało ostrzeżenie";
$opis_błędu[8] = "To jest tylko nieformalna uwaga";
ponieważ E_ERROR znaczy to samo co 1, itd.
W takiem razie, jak to możliwe, że $foo[bar] działa? To działa, ponieważ bar, zgodnie z jego zapisem powinien być stałą. Jednakże w tym przypadku nie instnieje stała o nazwie bar. php teraz zakłada, że masz na myśli bar literalnie, czyli jako łańucuch "bar", tylko że zapomniałeś napisać cudzysłowów.
Więc dlaczego tak jest źle?
Kiedyś w przyszłości grupa php może chcieć dodać jeszcze jedną stałą lub słowo kluczowe i wtedy będziesz miał kłopot. Dla przykładu, obecnie już nie można używać słów empty i default, gdyż są to specjalne słowa kluczowe.
Poza tym, jeśli dotąd argumenty nie przekonują cię: ta składnia jest po prostu odrzucona i kiedyś może przestać działać.
Notatka: Po przełączeniu error_reporting na E_ALL, zobaczysz, że php generuje ostrzeżenie, kiedy tylko powyższa składnia zostanie użyta. Tak samo generowane będą ostrzeżenia odnośnie innych odrzuconych "udogodnień". (umieść w swoim skrypcie linię error_reporting(E_ALL)
