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
Лучший способ сделать это - привести переменную в число с плавающей точкой:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP обрезает конечные нули с плавающей точкой, а затем преобразует число с плавающей точкой в конкатенацию.
(string)
забросы ?
$intval.'bar'
бросает исключение, я все еще не согласен. Это не исключение на любом языке. (Все языки, которые я знаю, выполняют либо автоматическое приведение, либо а .toString()
). Если вы говорите, что $intval = $stringval
выбрасывает исключение, то вы говорите о строго типизированном языке. Я не хотел показаться грубым, так что извините, если я сделал. Я просто думаю, что это идет вразрез с тем, к чему привык каждый разработчик, и намного, намного менее удобно.