簡體   English   中英

檢查項目是否可以轉換為字符串?

[英]check if item can be converted to string?

我正在編寫調試方法。

我擁有的是

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

最后我想做的是

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

是否有can_be_string類型的函數?

好的,已編輯,並結合了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;
}

為了完成...

http://www.php.net/is_scalar ,自 PHP 4 起可用; 沒有一個字關於它.. :)

怎么樣

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

PHP 8 開始,你可以用$var instanceof Stringable替換第三個條件

使用測試快速而骯臟的實現:

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

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

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

這個決定怎么樣?

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

    return true;
}

如果 is_string() 對您沒有幫助,那么我只能提出一些建議:

  • 陷阱 strlen() 或實際上是另一個函數,如果變量不是字符串則拋出錯誤
  • 如果不是 NULL,則使用 to_string() 並檢查字符串是否僅包含數字字符。 如果不是(並且變量/對象是一個簡單的變量),您可以假設

這很簡單:

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

代碼已經測試過了。 如果$var不是對象, method_exists()函數將返回false ,因此無需進行此驗證。

我不認為任何答案是令人滿意的。

最簡單的實現:

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

使用print_r()var_dump()函數,您可以打印出任何變量的內容。

如果您不喜歡上述函數的輸出,這里有很多類型檢查函數http://www.php.net/manual/en/ref.var.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM