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)
,但true
或join()
会出错?
答案 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)
我认为这样的检查毫无意义。