PHP, як більшість із нас знає, має слабку типізацію . Для тих, хто цього не робить, PHP.net каже:
PHP не вимагає (або підтримує) явного визначення типу в оголошенні змінної; Тип змінної визначається контекстом, в якому використовується змінна.
Любіть це або ненавидите його, PHP повторно передає змінні на ходу. Отже, дійсний наступний код:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP також дозволяє явно надати змінну, наприклад:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Це все круто ... але, за життя мене, я не можу уявити практичної причини для цього.
У мене немає проблем із сильним набором мов, які підтримують її, як-от Java. Це добре, і я цілком це розумію. Крім того, я знаю - і повністю розумію корисність натяку на тип у параметрах функції.
Проблема, яку я маю при кастингу типів, пояснюється наведеною цитатою. Якщо PHP може змінювати типи за власним бажанням , це може робити це навіть після того, як ви змусите видати тип; і це може робити це на ходу, коли вам потрібен певний тип операції. Це робить наступним дійсним:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Тож який сенс?
Візьмемо цей теоретичний приклад світу, де визначений користувачем тип кастингу має сенс у PHP :
- Ви примушуєте змінну передавати
$foo
якint
→(int)$foo
. - Ви намагаєтесь зберегти значення рядка у змінній
$foo
. - PHP кидає виняток !! ← Це мало б сенс. Раптом причина для кастингу, визначеного користувачем, існує!
Той факт, що PHP буде перемикати речі за потребою, робить чітко визначений користувачем тип кастингу. Наприклад, наступні два зразки коду еквівалентні:
// 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;
Через рік після того, як ви спочатку задали це запитання, здогадайтесь, хто опинився в застосуванні набірних програм в практичному середовищі? З повагою.
Вимога полягала в тому, щоб відображати гроші на веб-сайті для меню ресторану. Дизайн сайту вимагав обрізати нулі, щоб відображення виглядало приблизно так:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Найкращий спосіб, який я знайшов, щоб зробити це, щоб передати змінну як float:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP обрізає кінцеві нулі поплавця, а потім переглядає поплавок у вигляді рядка для конкатенації.
(string)
касти ?
$intval.'bar'
викидає виняток, я все ще не згоден. Це не є винятком на будь-якій мові. (Усі мови, які я знаю, виконуються або в автоматичному режимі, або в а .toString()
). Якщо ви говорите, що $intval = $stringval
кидає виняток, ви говорите про сильно набрану мову. Я не хотів звучати грубо, тож, вибачте, якщо це зробив. Я просто думаю, що це суперечить тому, до чого звик кожен розробник, і набагато, набагато менш зручно.