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

时间:2011-03-31 07:41:53

标签: 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;

是否有can_be_string类型的功能?

10 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:21)

为了完成...

http://www.php.net/is_scalar,自PHP 4开始提供;关于它的一句话......:)

答案 2 :(得分:13)

怎么样

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

答案 3 :(得分:9)

使用测试快速而肮脏的实现:

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) ""

答案 4 :(得分:2)

这是我能找到的最短路:

/**
 * Determine if we can cast a value to a string.
 *
 * @param mixed $v
 *
 * @return bool
 */
function can_be_string($v): bool
{
    return method_exists($v, '__toString') || $v === null || is_scalar($v);
}

答案 5 :(得分:2)

这个决定怎么样?

function canBeString ($value) {
    try {
        $value = (string) $value;
    } catch (\ErrorException $exception) {
        return false;
    }

    return true;
}

答案 6 :(得分:0)

如果is_string()对您没有帮助,那么我只能提出一些想法:

  • 陷阱strlen()或者实际上是另一个如果变量不是字符串
  • 则抛出错误的函数
  • 如果不为NULL,请使用to_string()并检查字符串是否仅包含数字字符。如果不是(并且变量/对象是一个简单的变量)你可以假设

答案 7 :(得分:0)

我认为任何答案都不令人满意。

最简单的实施:

function can_be_string()
{
    return is_string($value)
        || (is_object($value) && method_exists($value, '__toString'));
}

答案 8 :(得分:0)

这很简单:

void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
         ulong addr, ulong * len_ptr, int verify)
{
    ...
    void (*theKernel) (int, char **, char **, int *);
    theKernel = (void (*)(int, char **, char **, int *)) ntohl (hdr->ih_ep);

    ...
    theKernel (linux_argc, linux_argv, linux_env, 0); // <--- pass a control to a linux kernel
}

该代码已经过测试。 如果function can_be_string($var) { return method_exists($var, '__toString') || (is_scalar($var) && !is_null($var)); } 不是对象,则method_exists()函数将返回false,因此此验证是不必要的。

答案 9 :(得分:-7)

使用print_r()var_dump()函数,您可以打印出任何变量的内容。

如果你不喜欢上述函数的输出,那么这里有很多类型检查函数http://www.php.net/manual/en/ref.var.php