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, включаючи спеціальну обробку для булів та нулів.


11
Object of class Foo could not be converted to string. Чи є загальні рішення, які можуть перетворити що-небудь (масиви + об'єкти + все, що завгодно) в рядок?
ripper234


2
Примітка: це дасть повідомлення PHP при використанні на масивах.
dave1010

29
@MarkAmery Він дав відповідь, яка неявно називає __toString()"Чарівний метод", але зовсім не згадує про це. Користувач попросив відповідь, яка нагадувала toString()метод Java , а в PHP - це __toString()функція.
Супухстар

2
@ Supuhstar Ага, я нарешті розумію, звідки ти родом. Вибачте, якщо я був тупим раніше. Я погоджуюся, що це відповідна деталь, і було б корисно додати її, можливо, розділивши відповідь на розділи "Перетворення примітивів" та "Перетворення об'єктів" із заголовками.
Марк Амері

309

Це робиться за допомогою набору:

$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
"коли параметр return дорівнює TRUE, [print_r] поверне рядок." Оскільки print_r - це хороший спосіб друкувати об’єкти, масиви (а також цифри / рядки), це хороший спосіб перетворити об’єкт у читабельний для людини рядок.
Седрік

1
FYI-новачки, trueважлива частина! Я спробував кілька методів перетворення рядків, включаючи, print_rі був розчарований від усіх, і тоді я виявив trueпараметр (прочитайте документацію, чому він працює).
ripper234

57

Ви можете використовувати typecasting:

$var = (string)$varname;

або StringValue:

$var = strval($varname);

або SetType:

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

Всі вони працюють на одне і те ж саме з точки зору типу жонглювання.


strval ($ varname) робить для мене хитрість, особливо коли значення повертається як тип "варіант" і його потрібно перетворити на рядок або int.
Мілан,

strval()це те, що я був lookigng, тому що я хотів ним скористатися array_walk. Напр.$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus

33

Як перетворити значення змінної PHP в рядок?

Значення може бути перетворене в рядок за допомогою (string) акторів або функції strval () . (Редагувати: Як також сказав Томас ).

Він також повинен бути автоматично кастинг для вас, коли ви використовуєте його як рядок.


28

Ви шукаєте strval :

string strval ( mixed $var )

Отримайте значення рядка змінної. Для отримання додаткової інформації про перетворення в рядок див. Документацію на рядок.

Ця функція не виконує форматування поверненого значення. Якщо ви шукаєте спосіб відформатувати числове значення у вигляді рядка, перегляньте sprintf () або number_format ().


3
Це насправді дуже корисно, тому що я хотів перетворити всі числа в рядки, не використовуючи спеціальний зворотний дзвінок. $strings = array_map('strval', $my_numbers);
петерчаула

Це єдина відповідь, яка array_mapвзагалі працює з рядковими дзвінками.
Данон

18

Для примітивів просто використовуйте (string)$varабо надрукуйте цю змінну відразу. PHP є динамічно набраною мовою, і змінна буде передана на рядок на ходу.

Якщо ви хочете перетворити об'єкти в рядки, вам потрібно буде визначити __toString()метод, який повертає рядок. Цей метод забороняється викидати винятки.


15

Розміщення в подвійних лапках повинно працювати:

$myText = "$myVar";

Це працює, але я не знаю, чи це стандартний спосіб зробити це в PHP.
Антуан Обрі

Це дуже стандартний спосіб зробити це в Баш
Yauhen Якимович

Цей метод буде працювати, якщо $ 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

Іншим варіантом є використання вбудованої функції постоянного типу :

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

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

Це фактично виконує перетворення на змінну на відміну від typecasting і дозволяє мати загальний спосіб перетворення в кілька типів.


8

Окрім відповіді, яку дав Томас Г. Мейфілд:

Якщо ви переходите за посиланням на посібник з перекладу рядків, є окремий випадок, який досить важливо зрозуміти:

(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'));
    }
}

Операція (строкового) кастингу є рекомендованою технікою для програмування PHP5 +, що робить код більш об'єктно-орієнтованим. IMO - це гарний приклад подібності дизайну (відмінність) з іншими мовами OOP, такими як 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");

1
Це PICNIC (проблема в кріслі, а не в комп'ютері), оскільки тут нічого не вдається ! print 077543;Виводи 32611, тож це правильне значення рядка $no. Ніхто не очікує, що (string)+1поверне рядок +1(вона правильно повертається 1), а також що $no = 1+1; print (string)$no;виводить 1+1. Примітки: (1) Те саме для шестигранної ( $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 був би дуже довгим і в більшості випадків не дуже корисним.
  • Натомість 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 для отримання більш детальної інформації.



1

Подвійні лапки також повинні працювати ... він повинен створити рядок, тоді він повинен ДОДАТИ / ВСТАВИТИ закинуте значення STRING $ myVar між двома порожніми рядками.



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 не була частиною питання.)
Тіно

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

-1

Я використовую зміннуToString . Він обробляє кожен тип PHP і є гнучким (ви можете розширити його, якщо хочете).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.