Я бы использовал json_encode($myText). Я обнаружил, что предложенные решения print_rи (string)varхорошо работают для скалярных значений и простых объектов. Для сложных переменных, классов или объектов, если целое __toString()не определено, я предпочитаю вышеупомянутое json_encode.
В разделе «Строки» руководства по PHP содержится более подробная информация о приведении и преобразовании строк , включая специальную обработку логических значений и значений NULL.
Object of class Foo could not be converted to string, Есть ли общие решения, которые могут преобразовать что-либо (массивы + объекты + все что угодно) в строку?
Примечание: это даст уведомление 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 . Пример ниже:
classBottles{publicfunction __toString(){return'Ninety nine green bottles';}}
$ex =newBottles;
var_dump($ex,(string) $ex);// Returns: instance of Bottles and "Ninety nine green bottles"
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 () . (Правка: как сказал и Томас ).
Это также должно быть автоматически приведено для вас, когда вы используете его как строку.
Получить строковое значение переменной. См. Документацию по строке для получения дополнительной информации о преобразовании в строку.
Эта функция не выполняет форматирование возвращаемого значения. Если вы ищете способ форматирования числового значения в виде строки, пожалуйста, смотрите sprintf () или number_format ().
Это на самом деле очень полезно, потому что я хотел преобразовать все числа в строки без использования обратного вызова. $strings = array_map('strval', $my_numbers);
peterchaula
Это единственный ответ, который работает со array_mapстроками в общем.
Данон
18
Для примитивов просто используйте (string)$var или напечатайте эту переменную прямо сейчас. PHP - это динамически типизированный язык, и переменная будет преобразована в строку на лету.
Если вы хотите преобразовать объекты в строки, вам нужно определить __toString()метод, который возвращает строку. Этот метод запрещает генерировать исключения.
Стоит отметить, что вам это не нужно с 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)?>
Это фактически выполняет преобразование переменной в отличие от преобразования типов и позволяет использовать общий способ преобразования в несколько типов.
Если вы перейдете по ссылке на руководство по приведению строк, есть особый случай, который очень важно понять:
(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 (всякий раз, когда это хорошо или стоит).
Как уже упоминалось, объекты должны __toStringбыть преобразованы в строку. Объект, который не определяет этот метод, все еще может создать строковое представление, используя функцию spl_object_hash .
Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хэш-ключа для хранения объектов или для идентификации объекта, если объект не уничтожен. Как только объект уничтожен, его хэш может быть повторно использован для других объектов.
У меня есть базовый класс Object с __toStringметодом, который по умолчанию вызываетmd5(spl_object_hash($this)) для того, чтобы сделать вывод явно уникальным, поскольку выходные данные из spl_object_hash могут выглядеть очень похожими между объектами.
Это особенно полезно для отладки кода, где переменная инициализируется как объект, а затем в коде предполагается, что она изменилась на другой объект. Простое отображение переменных в журнале может показать изменение из хеша объекта (или нет).
Некоторые, если не все, методы в предыдущих ответах терпят неудачу, когда предполагаемая строковая переменная имеет начальный ноль , например, 077543 .
Попытка преобразовать такую переменную не может получить намеченную строку, потому что переменная преобразуется в основание 8 (восьмеричное) .
Это ПИКНИК (проблема в кресле, а не в компьютере), так как здесь ничего не выходит из строя ! 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.
Что я имею в виду под «представлением строки»? Представьте себе класс для библиотеки с миллионами книг.
Преобразование этого класса в строку (по умолчанию) преобразует данные, в данном случае все книги, в строку, поэтому строка будет очень длинной и в большинстве случаев тоже не очень полезной.
Вместо этого в 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 для более подробной информации.
Двойные кавычки тоже должны работать ... он должен создать строку, затем он ДОЛЖЕН / ВСТАВИТЬ приведенное значение STRING $ myVar между 2 пустыми строками.
Если вы конвертируете что-либо, кроме простых типов, таких как целые или логические, вам нужно написать собственную функцию / метод для типа, который вы пытаетесь преобразовать, в противном случае PHP просто напечатает тип (например, массив, GoogleSniffer или биде).
PHP динамически типизирован, поэтому, как сказал Крис Фурнье, «если вы используете его как строку, он становится строкой». Если вам нужен больший контроль над форматом строки, то printf - ваш ответ.
$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()метод.
Например, следующее будет выводить содержимое в журнал ошибок:
Попробуйте этот немного странный, но работающий подход для преобразования текстовой части stdClass в строковый тип:
$my_std_obj_result = $SomeResponse->return->data;// Specific to object/implementation
$my_string_result = implode ((array)$my_std_obj_result);// Do conversion
print_r(foo, true)
)!json_encode($myText)
. Я обнаружил, что предложенные решенияprint_r
и(string)var
хорошо работают для скалярных значений и простых объектов. Для сложных переменных, классов или объектов, если целое__toString()
не определено, я предпочитаю вышеупомянутоеjson_encode
.Ответы:
Вы можете использовать операторы приведения :
В разделе «Строки» руководства по PHP содержится более подробная информация о приведении и преобразовании строк , включая специальную обработку логических значений и значений NULL.
источник
Object of class Foo could not be converted to string
, Есть ли общие решения, которые могут преобразовать что-либо (массивы + объекты + все что угодно) в строку?__toString()
«магический метод», но не упомянул об этом вообще. Пользователь запросил ответ, который был похож наtoString()
метод Java , а в PHP это была__toString()
функция.Это делается с помощью Typecasting:
В классе вы можете определить, что выводится с помощью магического метода
__toString
. Пример ниже:Еще несколько примеров приведения типов:
источник
Используйте print_r :
Вы также можете использовать его как:
Это установит
$myText
строку, например:Используйте var_export, чтобы получить немного больше информации (с типами переменных, ...):
источник
true
часть важна! Я перепробовал несколько методов преобразования строк, в том числеprint_r
и был разочарован всеми из них, а затем обнаружилtrue
параметр (см. Документацию, почему он работает).Вы можете использовать Typecasting:
или StringValue:
или SetType:
Все они работают на одно и то же в терминах Type-Juggling.
источник
strval()
это то, что я искал, потому что я хотел использовать его сarray_walk
. Например$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Значение можно преобразовать в строку, используя приведение (string) или функцию strval () . (Правка: как сказал и Томас ).
Это также должно быть автоматически приведено для вас, когда вы используете его как строку.
источник
Вы ищете strval :
источник
$strings = array_map('strval', $my_numbers);
array_map
строками в общем.Для примитивов просто используйте
(string)$var
или напечатайте эту переменную прямо сейчас. PHP - это динамически типизированный язык, и переменная будет преобразована в строку на лету.Если вы хотите преобразовать объекты в строки, вам нужно определить
__toString()
метод, который возвращает строку. Этот метод запрещает генерировать исключения.источник
Помещение в двойные кавычки должно работать:
источник
Я думаю, что стоит упомянуть, что вы можете перехватить любой вывод (например
print_r
,var_dump
) в переменной, используя буферизацию вывода:Спасибо: Как я могу записать результат var_dump в строку?
источник
$result = var_export($someVar, true)
без об.Другой вариант - использовать встроенную функцию settype :
Это фактически выполняет преобразование переменной в отличие от преобразования типов и позволяет использовать общий способ преобразования в несколько типов.
источник
В дополнение к ответу Томаса Дж. Мэйфилда:
Если вы перейдете по ссылке на руководство по приведению строк, есть особый случай, который очень важно понять:
(string) приведение предпочтительнее, особенно если ваша переменная $ a является объектом, потому что PHP будет следовать протоколу приведения в соответствии со своей объектной моделью, вызывая магический метод __toString () (если таковой определен в классе, из которого создается экземпляр $ a ).
PHP делает что-то похожее на
Операция приведения (строки) является рекомендуемой техникой для программирования на PHP5 +, что делает код более объектно-ориентированным. IMO, это хороший пример сходства (различий) в дизайне с другими языками ООП, такими как Java / C # / и т. Д., Т. Е. С его собственным особым способом PHP (всякий раз, когда это хорошо или стоит).
источник
Как уже упоминалось, объекты должны
__toString
быть преобразованы в строку. Объект, который не определяет этот метод, все еще может создать строковое представление, используя функцию spl_object_hash .У меня есть базовый класс Object с
__toString
методом, который по умолчанию вызываетmd5(spl_object_hash($this))
для того, чтобы сделать вывод явно уникальным, поскольку выходные данные из spl_object_hash могут выглядеть очень похожими между объектами.Это особенно полезно для отладки кода, где переменная инициализируется как объект, а затем в коде предполагается, что она изменилась на другой объект. Простое отображение переменных в журнале может показать изменение из хеша объекта (или нет).
источник
Некоторые, если не все, методы в предыдущих ответах терпят неудачу, когда предполагаемая строковая переменная имеет начальный ноль , например, 077543 .
Попытка преобразовать такую переменную не может получить намеченную строку, потому что переменная преобразуется в основание 8 (восьмеричное) .
Все они будут
$str
иметь значение 32611 :источник
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: не понижен, поскольку эта ошибка распространена)Я думаю, что этот вопрос немного вводит в заблуждение, поскольку toString () в Java - это не просто способ привести что-либо к String. Это то, что делает приведение через (string) или String.valueOf (), и это работает также в PHP.
Обратите внимание, что это может быть проблематично, поскольку Java является типобезопасной ( более подробную информацию см. Здесь ).
Но, как я уже сказал, это приведение и, следовательно, не эквивалент toString () Java.
toString в Java не просто приводит объект к String. Вместо этого он даст вам представление String . И это то, что делает __toString () в PHP.
А с другой стороны:
Что я имею в виду под «представлением строки»? Представьте себе класс для библиотеки с миллионами книг.
Это оба правильные подходы, но с совершенно разными целями, ни одно из них не является идеальным решением для каждого случая, и вам нужно выбирать мудро, который лучше соответствует вашим потребностям.
Конечно, есть еще больше вариантов:
Все эти методы будут возвращать строку, некоторые из них будут использовать внутреннюю __toString, а некоторые другие не будут работать с объектами. Посмотрите на документацию PHP для более подробной информации.
источник
В документации сказано, что вы также можете сделать:
Это то же самое, что и актеры, но я думаю, что это выглядит красивее.
Источник:
источник
Двойные кавычки тоже должны работать ... он должен создать строку, затем он ДОЛЖЕН / ВСТАВИТЬ приведенное значение STRING $ myVar между 2 пустыми строками.
источник
Вы всегда можете создать метод с именем .ToString ($ in), который возвращает
источник
Если вы конвертируете что-либо, кроме простых типов, таких как целые или логические, вам нужно написать собственную функцию / метод для типа, который вы пытаетесь преобразовать, в противном случае PHP просто напечатает тип (например, массив, GoogleSniffer или биде).
источник
PHP динамически типизирован, поэтому, как сказал Крис Фурнье, «если вы используете его как строку, он становится строкой». Если вам нужен больший контроль над форматом строки, то printf - ваш ответ.
источник
Вы также можете использовать PHP-функцию var_export .
источник
источник
strval()
строк - это просто пустая трата времени.Для объектов вы не сможете использовать оператор приведения. Вместо этого я использую
json_encode()
метод.Например, следующее будет выводить содержимое в журнал ошибок:
источник
Попробуйте этот немного странный, но работающий подход для преобразования текстовой части stdClass в строковый тип:
источник
Я использую variableToString . Он обрабатывает каждый тип PHP и является гибким (вы можете расширить его, если хотите).
источник