在PHP中输入类型 - 安全性和效率

时间:2013-07-03 10:16:13

标签: php casting

我知道PHP是一种弱类型的语言。我的问题是:总的来说,考虑到安全性和效率问题,是否可以将PHP中的变量初始化为特定类型?或者这会不必要地逆潮流游泳?

具体初始化的例子:

$name = (string) "PHP"; // string
$pizzaToppings = array("tomato", "cheese", "pepperoni"); // array
$angle = (integer) 60; // integer

以下文章帮助但未回答我的问题: PHP Typecasting - Good or bad?

4 个答案:

答案 0 :(得分:4)

PHP总是需要知道值的“当前类型”才能将其用于任何目的,包括初始化变量。这种“当前类型”是与所有值一起的元数据(枚举)。

在您的示例代码中,强制转换是没有意义的,因为您使用文字值初始化变量,这些值始终是明显的类型:

$s = "foo";
echo is_string($s); // 1

$s = (string)"foo";
echo is_string($s); // also 1

整数和数组也是如此。

至少有一种情况,变量的类型不是你初看到的东西:

$i = PHP_INT_MAX + 1; // or use something like 999999999999
echo gettype($i); // "double"!

在这种情况下,使用强制转换会使$i成为整数,但它也会更改其值:

$i = (int)(PHP_INT_MAX + 1);
echo gettype($i); // "integer"
echo $i; // a very large negative number -- what?!?

当然,这不是由于缺少演员阵容造成的,而是在PHP中如何处理数字的神器。所以结论很清楚:在用文字初始化时使用强制转换是没有意义的。

如果要初始化一个您打算用作类型X的变量,其值为Y(或未知类型),则有理由使用显式强制转换:在代码中记录如何变量将在未来使用。但是不要过高估计好处:这些信息仅供人类消费;每当您尝试将变量用作与其不同的类型时,PHP将自动执行常规类型转换。

答案 1 :(得分:2)

根据定义,每种类型之间的工作方式不同。建议在程序的生命周期内保持相同的类型,以防止错误的值。

 $val = false // (int) $val => 0
 $val = 0.0010 // (int) $val => 0

All types of test methods

答案 2 :(得分:0)

你不应该担心类型,php会根据需要制作它们,当你必须在计算时使用这些类型时,使用三个===(类型特定的比较)验证它们它们仍然是有效的那种类型在需要时将它们转换为所需的类型

1 === 1 = true
1 === "1" = false
1 === true = false
true === true = true
false === false = true
"hello" === "hello" = true
etc...

类型转换

$numberofpizzas = $_POST['number'];
$price = 16;
$totalprice = $price * (int)$numberofpizzas

答案 3 :(得分:0)

某些函数返回“混合”数据类型,即可能会为失败返回布尔值“false”,并将整数“0”作为有效返回值。

检查返回值时,有时需要使用=== comparsion才能获得正确的结果。

举个例子:

$s = 'Test';
$c = strpos($s, 'T');
// The letter 'T' is at the first position, at index 0

if (false == $c) ... // evaluates to "true" because of the weak type comparsion of "0" and "false" 

if (false === $c) ... // evaluates to "false"