luq techblog

o tworzeniu słów kilka…

PHP i define() 5 stycznia 2011

Filed under: PHP — Łukasz @ 23:46
Tags: ,

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

Advertisements
 

6 Responses to “PHP i define()”

  1. 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ć. ;]

  2. luq Says:

    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()

  3. 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. ;]

  4. luq Says:

    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:

    console.log(0.2 + 0.4); // 0.6000000000000001
    
  5. krzotr Says:

    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
  6. luq Says:

    @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 „*”)


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s