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)
我看不出这种检查有什么意义。