Я пишу метод отладки.
У меня есть
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
?
Я пишу метод отладки.
У меня есть
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
?
Хорошо, отредактировано, с учетом предложения Мичиэля Патера (кто ответит сейчас) и предложения @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'));
}
Быстрая и грязная реализация с тестом:
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() вам не помогает, я могу предложить только некоторые идеи:
Я не думаю, что какой-либо из ответов был удовлетворительным.
Простейшая реализация:
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
);
Это очень просто:
function can_be_string($var)
{
return method_exists($var, '__toString') || (is_scalar($var) && !is_null($var));
}
Код уже был протестирован. Функция method_exists()
возвращает false
если $var
не является объектом, поэтому такая проверка не требуется.
С помощью функций print_r()
и var_dump()
вы можете распечатывать содержимое любой переменной.
Если вам не нравится вывод упомянутых функций, здесь есть много функций проверки типов http://www.php.net/manual/en/ref.var.php