我正在阅读PHP手册,我遇到了type juggling
我很困惑,因为我从未遇到过这样的事情。
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
当我使用这段代码时,它返回15,它加起来10 + 5,当我使用is_int()
时,它返回我的真实即。我怀疑是错误的1
,后来我将String conversion to numbers
引用到If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero)
$foo = 1 + "bob3"; /* $foo is int though this doesn't add up 3+1
but as stated this adds 1+0 */
现在,如果我想将10只小猪或bob3视为string
而不是int
,我该怎么办?使用settype()
也无效。我想要一个我无法在字符串中添加5的错误。
答案 0 :(得分:4)
如果您想要错误,则需要触发错误:
$string = "bob3";
if (is_string($string))
{
trigger_error('Does not work on a string.');
}
$foo = 1 + $string;
或者如果您想要一些界面:
class IntegerAddition
{
private $a, $b;
public function __construct($a, $b) {
if (!is_int($a)) throw new InvalidArgumentException('$a needs to be integer');
if (!is_int($b)) throw new InvalidArgumentException('$b needs to be integer');
$this->a = $a; $this->b = $b;
}
public function calculate() {
return $this->a + $this->b;
}
}
$add = new IntegerAddition(1, 'bob3');
echo $add->calculate();
答案 1 :(得分:1)
这是PHP的动态类型性质的结果,当然缺乏明确的类型声明要求。变量类型是根据上下文确定的。
根据您的示例,执行以下操作:
$a = 10;
$b = "10 Pigs";
$c = $a + $b // $c == (int) 20;
调用is_int($c)
当然总是求值为布尔值true,因为PHP决定将语句的结果转换为整数。
如果您正在寻找解释器的错误,那么您将无法获得它,因为这就像我提到的那样内置于该语言中。您可能必须编写大量丑陋的条件代码来测试数据类型。
或者,如果你想这样做来测试传递给你的函数的参数 - 这是我能想到你可能想要做的唯一场景 - 你可以相信客户端调用你的函数知道他们在做什么。否则,可以简单地将返回值记录为未定义。
我知道来自其他平台和语言,可能很难接受,但不管你是否相信,用PHP编写的很多优秀的库都采用相同的方法。