如何将字符串视为字符串而不是PHP中的int

时间:2012-10-25 05:10:15

标签: php type-conversion

我正在阅读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的错误。

2 个答案:

答案 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编写的很多优秀的库都采用相同的方法。