To będzie bardzo krótki wpis, do których raczej nie przyzwyczaiłem ;)
Na początek zagadka, co spowoduje podany kod:
echo 100;
define('100', 'stala 100');
echo 100;
Wywali błąd? Nadpisze wartość liczby?
Otóż nie. Jeśli nastąpiłoby nadpisanie wartości integera były to spory idiotyzm ze strony języka. Jednak co ciekawe nie wywali też błędu i stała o nazwie ’100′ powstanie, czego dowodem jest:
print_r(get_defined_constants());
/*
zwróci:
(...)
[100] => stala 100
*/
Jednak nijak nie dostaniemy się do podanej stałej poprzez samą jej nazwę, jedynym sposobem jest użycie funkcji:
echo constant('100');
Dla porównania Javascript nie pozwala na takie rzeczy:
const 100 = 'stala 100'; // SyntaxError: missing variable name
Na koniec dodam tylko, że pomysł na wpis zrodził się, jak już niejednokrotnie było, przez forum.php.pl. Niestety w ten sposób zmiany VAT-u w swojej aplikacji nie dokonamy :D
PHP zaskakuje nie raz, czasem pozytywnie, czasem negatywnie – dlatego lubię ten język i w ogóle to środowisko, bo nie daje się programiście nudzić. ;]
PHP jak każdy język ma swoje smaczki. W porównaniu z JavaScriptem to jeszcze nic ;D
Zapomniałem dopisać – stałą liczbową o której mowa we wpisie, możemy normalnie wykorzystać poprzez użycie funkcji constant()
Tylko JavaScript jest językiem, w którym te smaczki to po prostu folklor języka, a nie “sztuczki czarnomagiczne”. Nadpisywanie atrybutów, czy metod obiektów to w tamtym świecie zwyczajny standard – najpierw ktoś ci definiuje funkcję $(), a Ty potem możesz co najwyżej się spodziewać, że to “nadal” jQuery. ;]
Nadpisywanie jak nadpisywanie, to jedna z fajniejszych opcji tego języka. Bardzo fajnie, że mogę dopisać czy nawet napisać metody np. klasy Array ;)
Gorzej jak JS źle liczy:
Podobnie jest w:
$2 = 'test'; // Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' ${2} = 'test'; print_r( get_defined_vars() ); // [2] => test@krzotr Dzięki za dopełnienie :) Nie pomyślałem o tym żeby w {} deklarować zmienną.
PS: Kody w komentarzach można zamieszczać w znacznikach (i podać nazwę języka pod względem czego wszystko będzie kolorowane) [*code lang="js"*][*/code*] (oczywiście bez “*”)