【问题标题】:What is the reason for casting in php?在php中强制转换的原因是什么?
【发布时间】:2011-03-18 18:24:51
【问题描述】:

我在一些帖子上看到过这个:

$num = "5";
if(((int)$num) < 4){ ...}

是否有理由将“5”转换为 int 或者说是一样好:

if($num < 4){ ...}

因为我已经用我的代码对其进行了测试:

echo $num + 4; //outputs 9
echo (int)$num + 4;//also outputs 9

更新: 我的问题是关于铸造的,以上只是一两个例子。

更新 2: 马上type juggling manual php

<?php
$foo = "0";  // $foo is string (ASCII 48)
$foo += 2;   // $foo is now an integer (2)
$foo = $foo + 1.3;  // $foo is now a float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";     // $foo is integer (15)
?>

^^^^为什么最后两件事会发生?

【问题讨论】:

  • 关于您的更新,请继续阅读:如果上面的最后两个示例看起来很奇怪,请参阅php.net/manual/en/…(字符串转换为数字)。
  • @konforce 我明白了。但手册并不总是给出清晰的画面。我已经使用 php 很长时间了。而且我从不强制类型转换
  • 我回滚了您的上次编辑,因为我认为您的问题有效。另外,我更新了我的问题来回答这些问题。
  • @Kevin - 好的。不知道我上次的编辑是否相关,所以我删除了它。
  • 完全相关,因为它有助于消除您的困惑 :)

标签: php string casting


【解决方案1】:

在您提到的情况下,没有真的充分的理由。这是因为,PHP 不仅是一种动态类型语言,而且所使用的运算符对类型不敏感。

不过,铸造也有许多好的用途。对于(int),您可以进行强制转换以确保您在操作期间始终使用整数。此外,通过提前投射,您可以让 PHP 不必在以后不断地键入 juggle。

因问题编辑而编辑 (rev4)

最后两项发生是因为 PHP 在数学运算期间会尝试将字符串强制转换为整数。因此,它将字符串解析为数字。一旦找不到有效整数,就会返回找到的数字。

基本上,从字符串的开头,找到与integer/float numbering format 匹配的任何内容。一旦停止匹配该格式的内容,返回您拥有的内容。如果第一个字符与格式不匹配,return 0;

为了更好的解释,请阅读:http://www.php.net/manual/en/language.types.integer.php#language.types.integer.casting

【讨论】:

  • 所以只有数字“10”出现并添加到 5 以得到 15? (在最后一个例子中)
  • 对,因为空格字符停止解析为整数(无效字符),返回10。
  • 但如果是:$foo = 5 + "There are 10 Small Pigs";,会返回什么?
  • "T" 不是有效的整数字符。因此,例程被翻译为5 + 0= "monkeys"
  • 字母 T 不能是数字,因此 PHP 知道字符串不是数字。由于遗留原因,PHP 接受 10 Pigs 作为数字。 "10 Pigs" + "10 Pigs" 如果您阅读它也很有意义。然而,"Pigs 10" 可能意味着任何东西,但可能不是 10
【解决方案2】:

我在这里读到的一切听起来都很合理,所以我不会重复它。相反,我会给你两个例子,说明我在 PHP 中经常使用类型转换的地方:

  1. 提供 API 并尝试以各种格式返回正确的类型通常需要显式键入每个返回值。例如,如果我通过 XML_Serializer 或 XML-RPC 返回一些混合的数据数组并且我没有正确地转换我的整数/浮点数,它们将作为字符串返回,这会导致使用强类型语言的人尝试使用 API。但是,我不能谈论 SOAP+WSDL 将如何处理它,因为我没有搞砸它。

  2. 在库(或我们的代码)返回数组或 null 并且我们不能/不想修改它的情况下,将返回的值转换为数组。这通常只是为了防止在将非数组传递给数组控制结构或方法时收到警告。

【讨论】:

    【解决方案3】:

    进行算术运算时不需要强制转换,因为 PHP 会隐式执行。我从来没有遇到过默认隐式强制转换不是我想要的情况。事实上,强制转换在 PHP 中很少相关。

    当我知道变量将用于大量数学运算时,我最常做的转换是在赋值时将字符串显式转换为整数(或浮点数)。

    这是一个有用的阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2010-12-08
      • 2012-02-10
      • 2020-11-06
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多