czwartek, 19 kwietnia 2012

Dlaczego nie PHP - Rzutowanie łańcuchów znakowych (odc. 2)

Ostatnio natknąłem się w pracy na niemiłą niespodziankę. Okazało się, że PHP ma trochę odmienne podejście do konwersji łańcuchów tekstowych do zmiennych typu logicznego (boolean). Różnica polega na tym, że większość języków niepuste ciągi znaków rzutują do boolean na logiczną prawdę (TRUE).

 Weźmy na przykład tutaj Pythona:
matis@linux-xcbr:~> python
Python 2.6.5 (r265:79063, May  6 2011, 17:25:59)
[GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bool("0")
True
>>>
Jednak jak wiadomo Python pomimo dynamicznego typowania jest zaliczany do języków silnie typowanych, dlatego postanowiłem zweryfikować dla spokoju swojego sumienia jak to się odbywa w JavaScript, który tak jak PHP jest językiem słabo typowanym.

Poniżej komenda wpisana do konsoli Firebuga wraz z rezultatem:

>>> Boolean("0")
true


W PHP jest troszkę inaczej, a konkretniej odwrotnie: 
matis@linux-xcbr:~> php -r 'echo var_export( (bool)"0", true )."\n";'
false
matis@linux-xcbr:~> php -r 'echo ( (bool)"0") ? 1 : 0;'
0
Fakt ten miałem ochotę zgłosić jako błąd jednak w dokumentacji PHP fakt ten jest opisany jako prawidłowe działanie. Przypuszczałem, że wynika to z kolejności rzutowania - możliwe, że najpierw "0" rzutowane jest na integer, a dopiero potem na boolean, co w konsekwencji daje logiczny fałsz.

Jednak moje przypuszczenia rozwiały próby z "0" oraz "0.0":

matis@linux-xcbr:~> hp -r 'echo var_export( (bool)"00", true )."\n";'
true
matis@linux-xcbr:~> php -r 'echo var_export( (bool)"0.0", true )."\n";'
true
 Również jestem zdania, że znając kilka języków programowania nowego możemy się nauczyć stosunkowo szybko, jednak powyższy przykład pokazuje, że do osiągnięcia perfekcji potrzeba trochę czasu.


Artykuł udostępniany na licencji CC-BY-SA-3.0

Brak komentarzy:

Prześlij komentarz