【问题标题】:Ok to use numbers as glue and delimiters?可以使用数字作为胶水和分隔符吗?
【发布时间】:2011-11-29 07:54:00
【问题描述】:

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) 是否安全 作为条件或者有时可能是truejoin()explode() 会出错?

【问题讨论】:

  • 它不显示错误的事实并不意味着您应该注意允许它。
  • @bazmegakapa 但是如果它不会导致错误,那为什么会不安全呢?
  • 我们谈论的是胶水和定界符...只允许使用字符串是完全可以的。

标签: php join types explode implode


【解决方案1】:

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

// 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)) { // ...

【讨论】:

  • Thx // 是的,我不想使用强制转换操作,因为如果传递了一个数组或对象,它会尝试使用“数组”或“对象”作为粘合/分隔符。
  • 我几乎可以使用is_scalar(),除了(string)false 抛出一个“空分隔符”错误并且(string)true 变成'1'
  • @ryanve touche。也许像 is_scalar($var) && false !== $var 这样的东西会是解决方案。
  • is_scalar($var) && !is_bool($var) 更安全 b/c 你不希望 true 要么 b/c 它会使用 '1' 作为胶水。我刚刚进行了一个测试,看起来is_scalar($var) && !is_bool($var)is_string($var) || is_numeric($var) 稍快,我认为它们是等效的。见:dev.airve.com/demo/speed_tests/php_is_scalar_not_bool.php
【解决方案2】:

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

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

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

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

【讨论】:

  • __toString 不能抛出异常。无论如何,你不能抓住一个;)
  • 你是对的。我太习惯于将所有可恢复的错误条件转换为异常。 :)
  • 是的,我也是,这就是我遇到它的原因。 :)
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多