Как преобразовать значение переменной PHP в строку?
Я искал что-то лучшее, чем конкатенирование с пустой строкой:
$myText = $myVar . '';
Как метод ToString()
в Java или .NET.
Вы можете использовать операторы кастинга:
$myText = (string)$myVar;
В разделе Strings руководства по PHP содержится более подробная информация о строчном кастинге и преобразовании, включая специальную обработку для булевых и нулевых значений.
Object of class Foo could not be converted to string
. Есть ли общие решения, которые могут преобразовать что-либо (массивы + объекты + все что угодно) в строку?
Это делается с помощью 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);
Используйте 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);
true
часть важна! Я попробовал несколько методов преобразования строк, включая print_r
и был разочарован всеми из них, а затем я обнаружил true
параметр (прочитайте документацию, чтобы узнать, почему он работает).
Вы можете использовать typecasting:
$var = (string)$varname;
или StringValue:
$var = strval($varname);
или SetType:
$success = settype($varname, 'string');
// $varname itself becomes a string
Все они работают одинаково с точки зрения типа-жонглирования.
strval()
- это то, что я искал, потому что я хотел использовать его с array_walk
. Например, $array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Как преобразовать значение PHP переменная в строку?
Значение может быть преобразовано в строку с помощью (string) cast или strval(). (Изменить: как указано Thomas).
Он также должен автоматически забрасываться для вас, когда вы используете его как строку.
Вы ищете strval:
string strval ( mixed $var )
Получить строковое значение переменной. См. Документацию по строке для Дополнительная информация о конвертации в строка.
Эта функция не выполняет форматирование по возвращаемому значению. Если ты поиск способа форматирования числового значение как строку, см. sprintf() или number_format().
$strings = array_map('strval', $my_numbers);
array_map
и строковыми array_map
вообще.
Для примитивов просто используйте (string)$var
или распечатайте эту переменную сразу. PHP - это динамически типизированный язык, а переменная будет передана в строку на лету.
Если вы хотите преобразовать объекты в строки, вам нужно определить метод __toString()
, который возвращает строку. Этот метод запрещен для исключения.
Ввод в двойные кавычки должен работать:
$myText = "$myVar";
Я думаю, что стоит упомянуть, что вы можете поймать любой вывод (например, print_r
, var_dump
) в переменной с помощью буферизации вывода:
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Благодаря: https://stackoverflow.com/questions/139474/how-can-i-capture-the-result-of-var-dump-to-a-string
$result = var_export($someVar, true)
без ob.
В дополнение к ответу Томаса Дж. Мэйфилда:
Если вы следуете ссылке на руководство по литью строк, есть специальный случай, который очень важно понять:
(string) cast предпочтительнее, особенно если ваша переменная $a является объектом, потому что PHP будет следовать протоколу в соответствии с его объектной модели, вызвав магический метод __ toString() (если такой определяется в классе, из которого создается экземпляр $a).
PHP делает что-то похожее на
function castToString($instance)
{
if (is_object($instance) && method_exists($instance, '__toString')) {
return call_user_func_array(array($instance, '__toString'));
}
}
Операция (string) casting является рекомендуемым методом для программирования PHP5 +, создающего код более Object-Oriented. IMO это хороший пример сходства (разницы) дизайна с другими языками ООП, такими как Java/С#/и т.д., То есть в своем собственном специальном PHP-способе (когда это подходит или полезно).
Другой вариант - использовать встроенную функцию settype:
<?php
$foo = "5bar"; // string
$bar = true; // boolean
settype($foo, "integer"); // $foo is now 5 (integer)
settype($bar, "string"); // $bar is now "1" (string)
?>
Это фактически выполняет преобразование переменной, отличной от typecasting, и позволяет вам иметь общий способ преобразования в несколько типов.
Как уже упоминалось, объектам нужен __toString
для преобразования в строку. Объект, который не определяет этот метод, все еще может генерировать строковое представление, используя функцию spl_object_hash.
Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хэш-ключа для хранения объектов или для идентификации объекта, если объект не уничтожен. Как только объект уничтожен, его хэш может быть повторно использован для других объектов.
У меня есть базовый класс Object с методом __toString
который по умолчанию вызывает md5(spl_object_hash($this))
чтобы сделать вывод явно уникальным, так как вывод из spl_object_hash может выглядеть очень похожим между объектами.
Это особенно полезно для отладки кода, где переменная инициализируется как объект, а затем в коде предполагается, что она изменилась на другой объект. Простое отображение переменных в журнале может показать изменение из хеша объекта (или нет).
Некоторые, если не все, перечисленные выше методы завершаются сбоем, когда предполагаемая строковая переменная имеет начальный ноль, т.е. 077543, попытка преобразовать такую переменную не может получить намеченную строку, поскольку переменная преобразуется в основание 8 (восьмеричное).
Все это даст $str
значение 32611
$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
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» + 77544
дает 77544
то время как 077543+1
(правильно) дает 32612
. (PS: не понижен, поскольку эта ошибка распространена)
В документации говорится, что вы также можете:
$str = "$foo";
Это то же самое, что и приведение, но я думаю, что он выглядит красивее.
Источник:
Я думаю, что этот Вопрос сильно вводит в заблуждение (извините): toString() в Java - это не просто способ приведения чего-либо к String, это то, что делает приведение через via (string) или String.valueOf(), и это хорошо работает в PHP.
//Java
String myText = (string) myVar;
//PHP
$myText = (string) $myVar;
или же
//Java
String myText = String.valueOf(myVar);
//PHP
$var = strval($varname);
Обратите внимание, что и то, и другое может быть проблематичным, поскольку Java является типом сохранения Подробнее смотрите здесь. Но, как я уже сказал, это Casting и, следовательно, не эквивалент Java toString(). 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';
}
}
Что я имею в виду под "представлением строки"? Представьте себе класс для библиотеки с миллионами книг.
Конечно, есть еще больше вариантов:
$no = 077543 //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
Все эти методы возвращают строку.
$parent_category_name = "new clothes & shoes" ;
//TO make it to string option one
$parent_category = strval($parent_category_name);
//Or make it string my concatenating it with 'new clothes & shoes'
//useful for database queries
$parent_category = "'".strval($parent_category_name)."'";
strval()
для строк - это просто пустая трата времени.
Вы также можете использовать var_export php function.
Двойные кавычки тоже должны работать... он должен создать строку, тогда она должна ПРИНЯТЬ/ВСТАВИТЬ значение броузера STRING из $myVar между двумя пустыми строками.
Если вы конвертируете ничего, кроме простых типов, таких как целые или логические, вам нужно написать свою собственную функцию/метод для типа, который вы пытаетесь преобразовать, иначе PHP просто напечатает тип (например, массив, GoogleSniffer или Bidet).
PHP динамически типизирован, так что, как сказал Крис Фурнье, "если вы используете его, как строку, он становится строкой". Если вы ищете больше контроля над форматом строки, то printf - ваш ответ.
Вы всегда можете создать метод с именем .ToString($ in), который возвращает
$in . '';
Попробуйте этот странный, но рабочий подход, чтобы преобразовать текстовую часть stdClass в тип строки:
$my_std_obj_result = $SomeResponse->return->data; //specific to object/implementation
$my_string_result = implode ((array)$my_std_obj_result); //do conversion
Для объектов вы не сможете использовать оператор трансляции. Вместо этого я использую метод json_encode()
.
Например, следующее выводит содержимое в журнал ошибок:
error_log(json_encode($args));
Я использую variableToString
https://github.com/lingtalfi/VariableToString
Он обрабатывает каждый тип php и является гибким (вы можете его расширить, если хотите)
print_r(foo, true)
)!json_encode($myText)
. Я обнаружил, что предлагаемые решенияprint_r
и(string)var
хорошо работают для скалярных значений и простых объектов. Для сложных переменных, классов или объектов, если полная__toString()
не определена, я предпочитаю вышеупомянутыйjson_encode
.