PHP, jak większość z nas wie, ma słabe pisanie . Dla tych, którzy tego nie robią, PHP.net mówi:
PHP nie wymaga (ani nie obsługuje) jawnej definicji typu w deklaracji zmiennej; typ zmiennej jest określony przez kontekst, w którym zmienna jest używana.
Uwielbiam to lub nienawidzę, PHP ponownie rzuca zmienne w locie. Tak więc następujący kod jest prawidłowy:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP pozwala również jawnie rzutować zmienną, na przykład:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
To wszystko fajnie ... ale przez całe życie nie mogę wymyślić praktycznego powodu, aby to zrobić.
Nie mam problemu z mocnym pisaniem w językach, które go obsługują, takich jak Java. W porządku i całkowicie to rozumiem. Jestem także świadom - i w pełni rozumiem przydatność - podpowiedzi typu w parametrach funkcji.
Problem, który mam z rzutowaniem typu, jest wyjaśniony powyższym cytatem. Jeśli PHP może zamienić typy at-woli , może to zrobić nawet po zmuszają cast typu; i może to robić w locie, gdy potrzebujesz określonego typu operacji. To sprawia, że następujące są prawidłowe:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Więc o co chodzi?
Weź ten teoretyczny przykład świata, w którym rzutowanie typu zdefiniowane przez użytkownika ma sens w PHP :
- Zmuszasz rzutowaną zmienną
$foo
jakoint
→(int)$foo
. - Próbujesz zapisać wartość ciągu w zmiennej
$foo
. - PHP zgłasza wyjątek !! ← To miałoby sens. Nagle istnieje przyczyna rzutowania typu zdefiniowanego przez użytkownika!
Fakt, że PHP będzie zmieniać rzeczy w zależności od potrzeb, powoduje, że punkt definiowania typu zdefiniowanego przez użytkownika jest niejasny. Na przykład następujące dwa przykłady kodu są równoważne:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Rok po tym, jak pierwotnie zadałem to pytanie, zgadnij, kto używał rzutowania czcionek w praktycznym środowisku? Z poważaniem.
Wymaganiem było wyświetlanie wartości pieniężnych na stronie internetowej dla menu restauracji. Projekt witryny wymagał przycięcia końcowych zer, aby wyświetlacz wyglądał mniej więcej tak:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Najlepszy sposób, w jaki udało mi się to zrobić, aby rzutować zmienną jako zmiennoprzecinkową:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP przycina końcowe zera pływaka, a następnie przekształca go jako ciąg do konkatenacji.
(string)
casty ?
$intval.'bar'
zgłasza wyjątek, nadal się nie zgadzam. Nie rzuca to wyjątku w żadnym języku. (Wszystkie języki, które znam, przeprowadzają automatyczną obsadę lub a .toString()
). Jeśli mówisz, że $intval = $stringval
zgłasza wyjątek, to mówisz o silnie napisanym języku. Nie chciałem brzmieć niegrzecznie, więc przepraszam, jeśli tak zrobiłem. Wydaje mi się, że jest to sprzeczne z tym, do czego jest przyzwyczajony każdy programista, i jest o wiele, znacznie mniej wygodne.