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

发布于 2024-10-29 07:04:09 字数 223 浏览 1 评论 0原文

我正在写一个调试方法。

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

最后想做的是

if(can_be_string($item))
echo $item;

是否有 can_be_string 类型的函数?

I am writing a debug method.

What I have is

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;

Is there a can_be_string type function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

岁月无声 2024-11-05 07:04:09

为了完成...

http://www.php.net/is_scalar,自 PHP 4 起可用;对此只字不提..:)

For the sake of completion...

http://www.php.net/is_scalar, available since PHP 4; not a single word about it.. :)

裂开嘴轻声笑有多痛 2024-11-05 07:04:09

好的,已编辑,合并了 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;
}

Ok, edited, with incorporating Michiel Pater's suggestion (who's answer is gone now) ans @eisberg's suggestions. settype will return true with objects no matter what, as it seems.

if(
    ( !is_array( $item ) ) &&
    ( ( !is_object( $item ) && settype( $item, 'string' ) !== false ) ||
    ( is_object( $item ) && method_exists( $item, '__toString' ) ) )
)
{
    echo $item;
}
﹏半生如梦愿梦如真 2024-11-05 07:04:09

怎么样

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

,从 PHP 8 开始,您可以用 $var instanceof Stringable 替换第三个条件

How about

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

And since PHP 8 you can replace the third condition with $var instanceof Stringable

尐偏执 2024-11-05 07:04:09

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

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

Quick and dirty implementation with test:

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) ""
红玫瑰 2024-11-05 07:04:09

这是我能找到的最短方法:

/**
 * 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);
}

Here is the shortest way I can find:

/**
 * 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);
}
终陌 2024-11-05 07:04:09

这个决定怎么样?

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

    return true;
}

how about this decision?

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

    return true;
}
猫腻 2024-11-05 07:04:09

非常简单:

function can_be_string($var)
{
    return method_exists($var, '__toString') || (is_scalar($var) && !is_null($var));
}

代码已经过测试。
如果 $var 不是对象,则 method_exists() 函数返回 false,因此不需要进行此验证。

It's very simple:

function can_be_string($var)
{
    return method_exists($var, '__toString') || (is_scalar($var) && !is_null($var));
}

The code has already been tested.
The method_exists() function returns false if $var is not an object, so this verification is not necessary.

记忆之渊 2024-11-05 07:04:09

如果IS_STRING()无帮助,那么我只能提出一些想法:

  • trap strlen()或确实会引发错误的另一个函数,如果变量不是字符串
  • ,如果不是null,请使用to_string()并检查字符串是否是否仅包含数字字符。如果不是(并且变量/对象是一个简单变量)你可以假设一些东西

If is_string() doesn't help you, then I can only suggest some ideas:

  • Trap strlen() or indeed another function that throws an error if the variable is not a string
  • if not NULL, use to_string() and check if the string contains only numeric characters. If not (and the variable/object is a simple variable) you could assume something
浪荡不羁 2024-11-05 07:04:09

我认为所有答案都不令人满意。

最简单的实现:

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

class IsString {
    public function __toString() {
        return 'hello';
    }
}

var_dump(
    can_be_string(null), // true
    can_be_string(123), // true
    can_be_string(12.3), // true
    can_be_string('hello'), // true
    can_be_string(new IsString), // true
    can_be_string(new stdClass), // false
    can_be_string([1, 2, 3]) // false
);

I didn't think any of the answers were satisfactory.

Simplest implementation:

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

class IsString {
    public function __toString() {
        return 'hello';
    }
}

var_dump(
    can_be_string(null), // true
    can_be_string(123), // true
    can_be_string(12.3), // true
    can_be_string('hello'), // true
    can_be_string(new IsString), // true
    can_be_string(new stdClass), // false
    can_be_string([1, 2, 3]) // false
);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文