检查项目是否可以转换为字符串?

Hai*_*ood 35 php function tostring

我正在编写一个调试方法.

我拥有的是什么

if(is_xxx($item)){
 //echo output info for type
}

what I want to do at the end is

if(can_be_string($item))
echo $item;
Run Code Online (Sandbox Code Playgroud)

can_be_string类型功能吗?

Dec*_*ler 29

好的,编辑,结合了Michiel Pater的建议(现在他的答案已经消失)和@ eisberg的建议.无论如何,settype都会true带着物体回归.

if(
    ( !is_array( $item ) ) &&
    ( ( !is_object( $item ) && settype( $item, 'string' ) !== false ) ||
    ( is_object( $item ) && method_exists( $item, '__toString' ) ) )
)
{
    echo $item;
}
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶`settype()`没有出现在http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/ (3认同)

Rol*_*sen 25

为了完成...

http://www.php.net/is_scalar,自PHP 4起可用; 关于它没有一个单词.. :)

  • 某些对象可以转换为字符串.那就是如果他们实现了神奇的方法`__toString()`.该注释还说由于某种原因它不考虑空值标量.最重要的是,在资源上使用此功能似乎不可靠. (3认同)

mpe*_*pen 14

怎么样

function can_be_string($var) {
    return $var === null || is_scalar($var) || (is_object($var) && method_exists($var, '__toString'));
}
Run Code Online (Sandbox Code Playgroud)

  • 如果传递一个带有允许的 `__call` 函数的对象,这将返回不正确的结果,请参阅:https://3v4l.org/4ttLv。使用`method_exists`代替`is_callable` (2认同)
  • 此外,使用“method_exists”而不是“is_callable”也没有缺点,因为“__toString”必须是公共的 (2认同)

Max*_*nce 10

通过测试快速而肮脏的实现:

function canBeString($value)
{
    if (is_object($value) and method_exists($value, '__toString')) return true;

    if (is_null($value)) return true;

    return is_scalar($value);
}

class MyClass
{    
}

$object = new MyClass();
var_dump(canBeString($object)); // bool(false)

class MyClassWithToString
{
    public function __toString()
    {
        return 'foo';
    }
}

$objectWithToString = new MyClassWithToString();
var_dump(canBeString($objectWithToString)); // bool(true)

var_dump(canBeString(1)); // bool(true)
echo (string)1 . "\n";

var_dump(canBeString(false)); // bool(true)
echo (string)true . "\n";

var_dump(canBeString(1.0)); // bool(true)
echo (string)1.0 . "\n";

var_dump(canBeString(null)); // bool(false)
var_dump((string)null); // string(0) ""
Run Code Online (Sandbox Code Playgroud)