0

PHP 文档说join()and必须是字符串。我试过了,它没有抛出任何错误:explode()$glue$delimiter

$glue = -8.5;
$delimiter = 0;
echo join( $glue, explode($delimiter, '1_0_1') ); // '1_-8.5_1'

因此,如果我正在检查$var可以用作$glueor的 a $delimiter,那么用作条件是否安全,is_string($var) || is_numeric($var) 或者是否有时可能会true出现join()or错误explode()

4

3 回答 3

2

您可以像这样进行类型转换:

// note join() is just an alias for implode. 
// i like the symmetry of using implode/explode
echo implode((string) $glue, explode((string) $delimiter, '1_0_1'));

无论如何,它们似乎无论如何都在被转换。

尽管如此,如果传递了一个对象,那么使用is_string()is_numeric()避免可捕获的致命错误仍然是一件好事。

if ((is_string($glue) || is_numeric($glue))
    && (is_string($delimiter) || is_numeric($delimiter))
) {
    // objects didn't pass the test, safe to type-cast
    echo implode((string) $glue, explode((string) $delimiter, '1_0_1'));
}

编辑

根据 ryanve 的建议,您也可以这样做:

if (is_scalar($glue) && !is_bool($glue)) { // ...
于 2011-11-29T07:57:38.437 回答
1

PHP 在实际执行连接之前执行对字符串的隐式转换(这应该是implode因为它听起来更酷)。你甚至可以使用一个__toString()定义了魔法函数的类。整数总是可以转换为字符串,所以应该没有问题,不。

不过,这样做可能会更好:

try {
    $var = (string)$var;
}
catch(Exception $e) {
    echo "oh, noes, it wasn't castable to a string!";
}

检查它是否真的是一个字符串。:)

于 2011-11-29T08:04:44.070 回答
0

手册从未说过 $glue 和 $delimiter “必须”是字符串。
它只是提到了类型,这是字符串操作的明显类型。
其他类型将被强制转换为这种类型 - PHP 中到处都使用的东西,没什么大不了的。

每个字符串运算符都会将它的参数转换为字符串 - 我不明白,是什么让你想知道这里。
比如说,TRUE.TRUE也会将布尔值转换为字符串。

使用安全is_string($var) || is_numeric($var)

我认为这种检查毫无意义。

于 2011-11-29T08:35:35.797 回答