8

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

具体初始化示例:

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

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

4

4 回答 4

5

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 中如何处理数字的人工制品。所以结论很清楚:在使用 literals 初始化时使用强制转换毫无意义

如果您要使用不同类型 Y(或未知类型)的值初始化您打算用作类型 X 的变量,那么有理由使用显式强制转换:在代码中记录变量的运行方式以后可以使用。但不要高估它的好处:这些信息仅供人类使用;每当您尝试将变量用作与它不同的类型时,PHP 都会自动进行通常的类型转换。

于 2013-07-03T10:32:51.557 回答
2

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

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

所有类型的测试方法

于 2013-07-03T10:23:18.120 回答
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
于 2013-07-03T10:23:01.283 回答
0

某些函数返回“混合”数据类型,即可能返回布尔值“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"
于 2013-07-03T12:55:35.773 回答