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:
Poniżej komenda wpisana do konsoli Firebuga wraz z rezultatem:
W PHP jest troszkę inaczej, a konkretniej odwrotnie:
Jednak moje przypuszczenia rozwiały próby z "0" oraz "0.0":
Artykuł udostępniany na licencji CC-BY-SA-3.0
Weźmy na przykład tutaj Pythona:
matis@linux-xcbr:~> pythonJednak 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.
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
>>>
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;'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.
0
Jednak moje przypuszczenia rozwiały próby z "0" oraz "0.0":
matis@linux-xcbr:~> hp -r 'echo var_export( (bool)"00", true )."\n";'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.
truematis@linux-xcbr:~> php -r 'echo var_export( (bool)"0.0", true )."\n";'
true
Artykuł udostępniany na licencji CC-BY-SA-3.0
Komentarze
Prześlij komentarz