正如我们大多数人所知道的,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可以随意交换类型,即使您强制转换了类型,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
抛出异常,那么您是在谈论强类型语言。我本来不是很粗鲁的,所以,如果我这样做,我很抱歉。我只是认为这违背了每个开发人员的习惯,而且方便程度大大降低。