PHP中的类型转换-安全性和效率


Type casting in PHP - security and efficiency

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

具体初始化示例:

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

以下文章帮助但没有回答我的问题:PHP Typecasting-好还是坏?

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就会自动进行通常的类型转换。

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

 $val = false // (int) $val => 0
 $val = 0.0010 // (int) $val => 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

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

在检查返回值时,有时需要使用===比较来获得正确的结果。

举个例子:

$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"