可以用数字作为粘合剂和分隔符


Ok to use numbers as glue and delimiters?

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

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

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

你可以这样做类型转换:

// 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'));
}

编辑

根据ryan的建议,你也可以这样做:

if (is_scalar($glue) && !is_bool($glue)) { // ...

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

不过,这样做可能更好:

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

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

Manual从来没有说$glue和$delimiter "必须"是字符串。
它只是提到了类型,这是字符串操作的明显类型。其他类型将被强制转换为这种类型——这在PHP中无处不在,没什么大不了的。

每个字符串操作符都会将它的参数强制转换为字符串——我不明白,你在这里想知道什么。
例如,TRUE.TRUE也会将布尔值转换为字符串。

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

我看不出这种检查有什么意义。