PHP эквивалент .NET / Java toString () - PullRequest
530 голосов
/ 26 августа 2008

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

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

$myText = $myVar . '';

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

Ответы [ 24 ]

7 голосов
/ 01 сентября 2016

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

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

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

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

7 голосов
/ 06 мая 2012

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

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

(строка) приведение предпочтительнее, особенно если ваша переменная $ 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 (всякий раз, когда это хорошо или стоит).

5 голосов
/ 19 мая 2014

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

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

$no = 077543  
$str = (string)$no;   
$str = "$no";   
$str = print_r($no,true);  
$str = strval($no);   
$str = settype($no, "integer");  
3 голосов
/ 21 декабря 2018

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

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

Обратите внимание, что это может быть проблематично, поскольку Java сохраняет типы. Подробнее см. Здесь

Но, как я уже сказал, это Casting и, следовательно, не эквивалент 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 insted даст вам представление String, то есть только имя библиотеки. Это короче и поэтому дает вам меньше, но более важную информацию.

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

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

$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 concat an empty string works too

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

3 голосов
/ 16 ноября 2013

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

$str = "$foo";

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

Источник:

1 голос
/ 31 июля 2011

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

1 голос
/ 26 августа 2008

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

1 голос
/ 09 июня 2016
$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)."'";
1 голос
/ 11 августа 2015

Вы также можете использовать var_export php функцию.

1 голос
/ 26 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...