好用数字作胶水和分隔符?

时间:2011-11-29 07:54:01

标签: php join types explode implode

join()explode()的PHP文档说$glue$delimiter必须是字符串。我尝试了这个并没有抛出任何错误:

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

因此,如果我正在查看可用作$var$glue的{​​{1}},那么使用$delimiter是否安全 作为一个条件或有时可能是is_string($var) || is_numeric($var),但truejoin()会出错?

3 个答案:

答案 0 :(得分: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)) { // ...

答案 1 :(得分:1)

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

尽管如此,它可能会更好:

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

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

答案 2 :(得分:0)

手册永远不会说$ glue和$ delimiter“必须”是字符串 它只是提到了类型,这是 string 操作的明显类型 其他类型只会被转换为这种类型 - 在PHP中使用的东西,并不是什么大不了的事。

每个字符串操作符都会将它的参数转换为字符串 - 我不明白,是什么让你想到这里 比方说,TRUE.TRUE也会将布尔值转换成字符串。

  

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

是安全的

我认为这样的检查毫无意义。