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

519

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

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

$myText = $myVar . '';

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

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

24 ответа

792
Лучший ответ

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

$myText = (string)$myVar;

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

  • 11
    Object of class Foo could not be converted to string . Есть ли общие решения, которые могут преобразовать что-либо (массивы + объекты + все что угодно) в строку?
  • 3
    Это ответ - stackoverflow.com/questions/28098/php-tostring-equivalent/…
Показать ещё 8 комментариев
310

Это делается с помощью 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);
  • 0
    ИМХО это должен быть принятый ответ +1
127

Используйте 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 параметр (прочитайте документацию, чтобы узнать, почему он работает).
57

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

$var = (string)$varname;

или StringValue:

$var = strval($varname);

или SetType:

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

Все они работают одинаково с точки зрения типа-жонглирования.

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

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

Значение может быть преобразовано в строку с помощью (string) cast или strval(). (Изменить: как указано Thomas).

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

27

Вы ищете strval:

string strval ( mixed $var )

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

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

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

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

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

15

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

$myText = "$myVar";
  • 0
    Это работает, но я не знаю, является ли это стандартным способом сделать это в PHP.
  • 0
    Это очень стандартный способ сделать это в Bash
Показать ещё 1 комментарий
9

Я думаю, что стоит упомянуть, что вы можете поймать любой вывод (например, 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

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

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

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

(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-способе (когда это подходит или полезно).

7

Другой вариант - использовать встроенную функцию 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, и позволяет вам иметь общий способ преобразования в несколько типов.

6

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

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

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

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

4

Некоторые, если не все, перечисленные выше методы завершаются сбоем, когда предполагаемая строковая переменная имеет начальный ноль, т.е. 077543, попытка преобразовать такую переменную не может получить намеченную строку, поскольку переменная преобразуется в основание 8 (восьмеричное).

Все это даст $str значение 32611

$no = 077543  
$str = (string)$no;   
$str = "$no";   
$str = print_r($no,true);  
$str = strval($no);   
$str = settype($no, "integer");  
  • 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» + 77544 дает 77544 то время как 077543+1 (правильно) дает 32612 . (PS: не понижен, поскольку эта ошибка распространена)
3

В документации говорится, что вы также можете:

$str = "$foo";

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

Источник:

1

Я думаю, что этот Вопрос сильно вводит в заблуждение (извините): 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';
    }
}

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

  • Преобразование этого класса в строку приведет к преобразованию данных, в данном случае всех книг, в строку, поэтому строка будет очень длинной и в большинстве случаев не очень полезной.
  • Для String insted даст вам представление String, т.е. только имя библиотеки. Это короче и поэтому дает вам меньше, но более важную информацию, но не содержит всю информацию. Оба являются действительными подходами, но с очень разными целями, соседство является идеальным решением для каждого случая, и вы должны выбрать мудро, который лучше подходит для вашего случая.

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

$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

Все эти методы возвращают строку.

1
$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)."'";
  • 0
    Понизил голос, поскольку я действительно понятия не имею, что вы хотите сказать нам. Использование strval() для строк - это просто пустая трата времени.
  • 0
    чувак, дело в том, что вы получили строковое значение = когда оно будет представлено, оно будет "строкой". Но когда вы хотите отобразить это в javascript, вам нужно сделать его «stringx»
Показать ещё 1 комментарий
1

Вы также можете использовать var_export php function.

1

Двойные кавычки тоже должны работать... он должен создать строку, тогда она должна ПРИНЯТЬ/ВСТАВИТЬ значение броузера STRING из $myVar между двумя пустыми строками.

1

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

1

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

1

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

$in . '';  
0

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

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

$my_string_result = implode ((array)$my_std_obj_result); //do conversion
0

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

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

error_log(json_encode($args));
-2

Я использую variableToString

https://github.com/lingtalfi/VariableToString

Он обрабатывает каждый тип php и является гибким (вы можете его расширить, если хотите)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню