Подтвердить что ты не робот

Проверить, может ли элемент быть преобразован в строку?

Я пишу метод отладки.

У меня есть

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?

4b9b3361

Ответ 1

Хорошо, отредактировано, с учетом предложения Мичиэля Патера (кто ответит сейчас) и предложения @eisberg. settype возвращает true с объектами независимо от того, что, как кажется.

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

Ответ 2

Ради завершения...

http://www.php.net/is_scalar, доступный с PHP 4; ни слова об этом..:)

Ответ 3

Как насчет

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

Ответ 4

Быстрая и грязная реализация с тестом:

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

Ответ 5

Вот кратчайший путь, который я могу найти:

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

Ответ 6

как насчет этого решения?

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

    return true;
}

Ответ 7

Если is_string() вам не помогает, я могу предложить только некоторые идеи:

  • Trap strlen() или действительно другая функция, которая выдает ошибку, если переменная не является строкой
  • Если не NULL, используйте to_string() и проверьте, содержит ли строка только числовые символы. Если нет (и переменная/объект - простая переменная), вы можете предположить что-то

Ответ 8

Я не думаю, что какой-либо из ответов был удовлетворительным.

Простейшая реализация:

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

Ответ 9

Это очень просто:

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

Код уже был протестирован. Функция method_exists() возвращает false если $var не является объектом, поэтому такая проверка не требуется.

Ответ 10

С помощью функций print_r() и var_dump() вы можете распечатывать содержимое любой переменной.

Если вам не нравится вывод упомянутых функций, здесь есть много функций проверки типов http://www.php.net/manual/en/ref.var.php