PHP эквивалент .NET / Java toString ()

556

Как мне преобразовать значение переменной PHP в строку?

Я искал что-то лучше, чем объединение с пустой строкой:

$myText = $myVar . '';

Как ToString()метод в Java или .NET.

Антуан Обри
источник
6
Кажется, это правильный ответ: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234
Я бы использовал json_encode($myText). Я обнаружил, что предложенные решения print_rи (string)varхорошо работают для скалярных значений и простых объектов. Для сложных переменных, классов или объектов, если целое __toString()не определено, я предпочитаю вышеупомянутое json_encode.
Эрик Кигати

Ответы:

791

Вы можете использовать операторы приведения :

$myText = (string)$myVar;

В разделе «Строки» руководства по PHP содержится более подробная информация о приведении и преобразовании строк , включая специальную обработку логических значений и значений NULL.

Том Мэйфилд
источник
11
Object of class Foo could not be converted to string, Есть ли общие решения, которые могут преобразовать что-либо (массивы + объекты + все что угодно) в строку?
ripper234
2
Примечание: это даст уведомление PHP при использовании на массивах.
dave1010
29
@MarkAmery Он дал ответ, который неявно называет __toString()«магический метод», но не упомянул об этом вообще. Пользователь запросил ответ, который был похож на toString()метод Java , а в PHP это была __toString()функция.
Supuhstar
2
@ Supuhstar Ах да, я наконец понял, откуда ты. Извините, если я был тупым раньше. Я согласен, что это важная деталь, и было бы полезно добавить ее, возможно, разделив ответ на разделы «Преобразование примитивов» и «Преобразование объектов» с заголовками.
Марк Эмери
309

Это делается с помощью Typecasting:

$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable

В классе вы можете определить, что выводится с помощью магического метода __toString . Пример ниже:

class Bottles {
    public function __toString()
    {
        return 'Ninety nine green bottles';
    }
}

$ex = new Bottles;
var_dump($ex, (string) $ex);
// Returns: instance of Bottles and "Ninety nine green bottles"

Еще несколько примеров приведения типов:

$i = 1;

// int 1
var_dump((int) $i);

// bool true
var_dump((bool) $i);

// string "1"
var_dump((string) 1);
Росс
источник
126

Используйте print_r :

$myText = print_r($myVar,true);

Вы также можете использовать его как:

$myText = print_r($myVar,true)."foo bar";

Это установит $myTextстроку, например:

array (
  0 => '11',
)foo bar

Используйте var_export, чтобы получить немного больше информации (с типами переменных, ...):

$myText = var_export($myVar,true);
Седрик
источник
1
msgstr "когда возвращаемый параметр равен TRUE, [print_r] вернет строку." Поскольку print_r - это хороший способ печати объектов, массивов (а также чисел / строк), это хороший способ преобразовать объект в удобочитаемую строку.
Седрик
1
К вашему сведению новички, trueчасть важна! Я перепробовал несколько методов преобразования строк, в том числе print_rи был разочарован всеми из них, а затем обнаружил trueпараметр (см. Документацию, почему он работает).
ripper234
57

Вы можете использовать Typecasting:

$var = (string)$varname;

или StringValue:

$var = strval($varname);

или SetType:

$success = settype($varname, 'string');
// $varname itself becomes a string

Все они работают на одно и то же в терминах Type-Juggling.

Джоэл Ларсон
источник
strval ($ varname) помогает мне, особенно когда значение возвращается в виде типа "option" и его необходимо преобразовать в строку или int.
Милан
strval()это то, что я искал, потому что я хотел использовать его с array_walk. Например$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Баттл Буткус
33

Как мне преобразовать значение переменной PHP в строку?

Значение можно преобразовать в строку, используя приведение (string) или функцию strval () . (Правка: как сказал и Томас ).

Это также должно быть автоматически приведено для вас, когда вы используете его как строку.

Крис
источник
28

Вы ищете strval :

string strval ( mixed $var )

Получить строковое значение переменной. См. Документацию по строке для получения дополнительной информации о преобразовании в строку.

Эта функция не выполняет форматирование возвращаемого значения. Если вы ищете способ форматирования числового значения в виде строки, пожалуйста, смотрите sprintf () или number_format ().

opensas
источник
3
Это на самом деле очень полезно, потому что я хотел преобразовать все числа в строки без использования обратного вызова. $strings = array_map('strval', $my_numbers);
peterchaula
Это единственный ответ, который работает со array_mapстроками в общем.
Данон
18

Для примитивов просто используйте (string)$var или напечатайте эту переменную прямо сейчас. PHP - это динамически типизированный язык, и переменная будет преобразована в строку на лету.

Если вы хотите преобразовать объекты в строки, вам нужно определить __toString()метод, который возвращает строку. Этот метод запрещает генерировать исключения.

Михал Рудницкий
источник
15

Помещение в двойные кавычки должно работать:

$myText = "$myVar";
Марк Бик
источник
Это работает, но я не знаю, является ли это стандартным способом сделать это в PHP.
Антуан Обри
Это очень стандартный способ сделать это в bash
Евгений Якимович
Этот метод будет работать, если $ myVar является объектом класса с __toString или скалярным типом. В других случаях выдает ошибку.
zennin
11

Я думаю, что стоит упомянуть, что вы можете перехватить любой вывод (например print_r, var_dump) в переменной, используя буферизацию вывода:

<?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
?>

Спасибо: Как я могу записать результат var_dump в строку?

Даан
источник
1
Стоит отметить, что вам это не нужно с print_r . Просто используйте переопределение для возврата в виде строки.
ars265
1
Лучше было бы использовать $result = var_export($someVar, true)без об.
Данон
8

Другой вариант - использовать встроенную функцию settype :

<?php
$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)
?>

Это фактически выполняет преобразование переменной в отличие от преобразования типов и позволяет использовать общий способ преобразования в несколько типов.

Джастин Уикс
источник
8

В дополнение к ответу Томаса Дж. Мэйфилда:

Если вы перейдете по ссылке на руководство по приведению строк, есть особый случай, который очень важно понять:

(string) приведение предпочтительнее, особенно если ваша переменная $ a является объектом, потому что PHP будет следовать протоколу приведения в соответствии со своей объектной моделью, вызывая магический метод __toString () (если таковой определен в классе, из которого создается экземпляр $ a ).

PHP делает что-то похожее на

function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

Операция приведения (строки) является рекомендуемой техникой для программирования на PHP5 +, что делает код более объектно-ориентированным. IMO, это хороший пример сходства (различий) в дизайне с другими языками ООП, такими как Java / C # / и т. Д., Т. Е. С его собственным особым способом PHP (всякий раз, когда это хорошо или стоит).

Евгений Якимович
источник
8

Как уже упоминалось, объекты должны __toStringбыть преобразованы в строку. Объект, который не определяет этот метод, все еще может создать строковое представление, используя функцию spl_object_hash .

Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хэш-ключа для хранения объектов или для идентификации объекта, если объект не уничтожен. Как только объект уничтожен, его хэш может быть повторно использован для других объектов.

У меня есть базовый класс Object с __toStringметодом, который по умолчанию вызываетmd5(spl_object_hash($this)) для того, чтобы сделать вывод явно уникальным, поскольку выходные данные из spl_object_hash могут выглядеть очень похожими между объектами.

Это особенно полезно для отладки кода, где переменная инициализируется как объект, а затем в коде предполагается, что она изменилась на другой объект. Простое отображение переменных в журнале может показать изменение из хеша объекта (или нет).

скудный
источник
6

Некоторые, если не все, методы в предыдущих ответах терпят неудачу, когда предполагаемая строковая переменная имеет начальный ноль , например, 077543 .

Попытка преобразовать такую ​​переменную не может получить намеченную строку, потому что переменная преобразуется в основание 8 (восьмеричное) .

Все они будут $strиметь значение 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
user1587439
источник
1
Это ПИКНИК (проблема в кресле, а не в компьютере), так как здесь ничего не выходит из строя ! print 077543;выводит 32611, так что это правильное строковое значение $no. Никто не ожидает, что (string)+1вернет строку +1(она правильно возвращает 1) и что не $no = 1+1; print (string)$no;выведет 1+1. Примечания: (1) То же самое для hex ( $no=0xff;). (2) Вы можете получить восьмеричное значение с помощью '0'.decoct($no);(3) , оставляя $no="077543";ведущий 0, "077543" + 1` дает, в 77544то время как 077543+1(правильно) дает 32612. (PS: не понижен, поскольку эта ошибка распространена)
Тино
4

Я думаю, что этот вопрос немного вводит в заблуждение, поскольку toString () в Java - это не просто способ привести что-либо к String. Это то, что делает приведение через (string) или String.valueOf (), и это работает также в PHP.

// Java
String myText = (string) myVar;

// PHP
$myText = (string) $myVar;

Обратите внимание, что это может быть проблематично, поскольку Java является типобезопасной ( более подробную информацию см. Здесь ).

Но, как я уже сказал, это приведение и, следовательно, не эквивалент toString () Java.

toString в Java не просто приводит объект к String. Вместо этого он даст вам представление String . И это то, что делает __toString () в PHP.

// Java
class SomeClass{
    public String toString(){
        return "some string representation";
    }
}

// PHP
class SomeClass{
    public function __toString()
    {
        return "some string representation";
    }
}

А с другой стороны:

// Java
new SomeClass().toString(); // "Some string representation"

// PHP
strval(new SomeClass); // "Some string representation"

Что я имею в виду под «представлением строки»? Представьте себе класс для библиотеки с миллионами книг.

  • Преобразование этого класса в строку (по умолчанию) преобразует данные, в данном случае все книги, в строку, поэтому строка будет очень длинной и в большинстве случаев тоже не очень полезной.
  • Вместо этого в String вы получите представление String, т. Е. Только имя библиотеки. Это короче и поэтому дает вам меньше, но более важную информацию.

Это оба правильные подходы, но с совершенно разными целями, ни одно из них не является идеальным решением для каждого случая, и вам нужно выбирать мудро, который лучше соответствует вашим потребностям.

Конечно, есть еще больше вариантов:

$no = 421337  // A number in PHP
$str = "$no"; // In PHP, stuff inside "" is calculated and variables are replaced
$str = print_r($no, true); // Same as String.format();
$str = settype($no, 'string'); // Sets $no to the String Type
$str = strval($no); // Get the string value of $no
$str = $no . ''; // As you said concatenate an empty string works too

Все эти методы будут возвращать строку, некоторые из них будут использовать внутреннюю __toString, а некоторые другие не будут работать с объектами. Посмотрите на документацию PHP для более подробной информации.

Xanlantos
источник
3

В документации сказано, что вы также можете сделать:

$str = "$foo";

Это то же самое, что и актеры, но я думаю, что это выглядит красивее.

Источник:

DarthKotik
источник
1

Двойные кавычки тоже должны работать ... он должен создать строку, затем он ДОЛЖЕН / ВСТАВИТЬ приведенное значение STRING $ myVar между 2 пустыми строками.

Flak DiNenno
источник
1

Вы всегда можете создать метод с именем .ToString ($ in), который возвращает

$in . '';  
Джоэл Коухорн
источник
1

Если вы конвертируете что-либо, кроме простых типов, таких как целые или логические, вам нужно написать собственную функцию / метод для типа, который вы пытаетесь преобразовать, в противном случае PHP просто напечатает тип (например, массив, GoogleSniffer или биде).

Брайан Варшоу
источник
1

PHP динамически типизирован, поэтому, как сказал Крис Фурнье, «если вы используете его как строку, он становится строкой». Если вам нужен больший контроль над форматом строки, то printf - ваш ответ.

Аллен Лалонд
источник
1
$parent_category_name = "new clothes & shoes";

// To make it to string option one
$parent_category = strval($parent_category_name);

// Or make it a string by concatenating it with 'new clothes & shoes'
// It is useful for database queries
$parent_category = "'" . strval($parent_category_name) . "'";
Даниэль Аденью
источник
Отказался, так как я действительно понятия не имею, что вы хотите сказать нам. Использование strval()строк - это просто пустая трата времени.
Тино
чувак, дело в том, что вы получили строковое значение = когда оно будет представлено, оно будет "строкой". Но когда вы хотите отобразить это в javascript, вам нужно сделать его «stringx»
Даниэль Аденью
Это чрезвычайно опасно (не сказать: просто неправильно). Пожалуйста, посмотрите на stackoverflow.com/q/168214 или stackoverflow.com/q/23740548, чтобы понять, как безопасно передать что-то из PHP в JS! (Извините за то, что я немного оффтопичен: передача PHP-переменной в JS не была частью вопроса.)
Tino
0

Для объектов вы не сможете использовать оператор приведения. Вместо этого я использую json_encode()метод.

Например, следующее будет выводить содержимое в журнал ошибок:

error_log(json_encode($args));
Архимед Траяно
источник
0

Попробуйте этот немного странный, но работающий подход для преобразования текстовой части stdClass в строковый тип:

$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
mikikg
источник
-1

Я использую variableToString . Он обрабатывает каждый тип PHP и является гибким (вы можете расширить его, если хотите).

вереск
источник