Odpowiednik PHP metody .NET / Java toString ()

556

Jak przekonwertować wartość zmiennej PHP na ciąg znaków?

Szukałem czegoś lepszego niż połączenie pustego łańcucha:

$myText = $myVar . '';

Podobnie jak ToString()metoda w Javie lub .NET.

Antoine Aubry
źródło
6
To wydaje się być poprawna odpowiedź: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234
Skorzystałbym json_encode($myText). Odkryłam, że proponowane rozwiązania print_ri (string)vardziała dobrze dla wartości skalarnych i prostych obiektów. W przypadku zmiennych złożonych, klas lub obiektów, jeśli __toString()nie zdefiniowano kompletności , wolę wyżej wymienione json_encode.
Eric Kigathi

Odpowiedzi:

791

Możesz użyć operatorów rzutowania :

$myText = (string)$myVar;

Więcej szczegółów na temat rzutowania i konwersji ciągów znajduje się w sekcji Ciągi podręcznika PHP, w tym specjalnej obsługi wartości logicznych i zer.

Tom Mayfield
źródło
11
Object of class Foo could not be converted to string. Czy istnieją ogólne rozwiązania, które mogą konwertować cokolwiek (tablice + obiekty + cokolwiek) na ciąg?
ripper234
2
Uwaga: powiadomi to PHP, gdy zostanie użyte na tablicach.
dave1010
29
@ MarkAmery Udzielił odpowiedzi, która domyślnie nazywa __toString()„Magiczną Metodą”, ale w ogóle o tym nie wspomniał. Użytkownik poprosił o odpowiedź podobną do toString()metody Java , a w PHP taka jest __toString()funkcja.
Supuhstar,
2
@ Supuhstar Ach, prawda, w końcu rozumiem skąd pochodzisz. Przepraszam, jeśli wcześniej byłem tępy. Zgadzam się, że jest to istotny szczegół i warto je dodać, być może rozdzielając odpowiedź na sekcje „Konwertowanie prymitywów” i „Konwertowanie obiektów” nagłówkami.
Mark Amery
309

Odbywa się to za pomocą rzutowania typu:

$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable

W klasie możesz zdefiniować, co jest wyprowadzane za pomocą magicznej metody __toString. Przykład jest poniżej:

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"

Kilka innych przykładów rzutowania typu:

$i = 1;

// int 1
var_dump((int) $i);

// bool true
var_dump((bool) $i);

// string "1"
var_dump((string) 1);
Ross
źródło
126

Użyj print_r :

$myText = print_r($myVar,true);

Możesz także użyć go w następujący sposób:

$myText = print_r($myVar,true)."foo bar";

Ustawi $myTextsię na ciąg znaków, na przykład:

array (
  0 => '11',
)foo bar

Użyj var_export, aby uzyskać trochę więcej informacji (z typami zmiennych, ...):

$myText = var_export($myVar,true);
Cedric
źródło
1
„gdy parametr zwracany jest PRAWDA, [print_r] zwróci ciąg.” Ponieważ print_r to dobry sposób na drukowanie obiektów, tablic (a także liczb / ciągów), jest to dobry sposób na przekształcenie obiektu w ciąg czytelny dla człowieka.
Cedric
1
Dla początkujących, ta trueczęść jest niezbędna! Wypróbowałem kilka metod konwersji ciągów, w tym print_ri byłem rozczarowany wszystkimi, a potem odkryłem trueparametr (przeczytaj dokumentację, dlaczego to działa).
ripper234
57

Możesz albo użyć rzutowania czcionek:

$var = (string)$varname;

lub StringValue:

$var = strval($varname);

lub SetType:

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

Wszystkie działają na tę samą rzecz w zakresie żonglowania typami.

Joel Larson
źródło
strval ($ varname) robi dla mnie lewę, szczególnie gdy wartość jest zwracana jako typ „variant” i musi zostać przekonwertowana na string lub int.
Mediolan
strval()właśnie tego szukałem, ponieważ chciałem go używać array_walk. Np.$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus
33

Jak przekonwertować wartość zmiennej PHP na ciąg znaków?

Wartość można przekonwertować na ciąg za pomocą funkcji cast (ciąg) lub strval () . (Edycja: Jak stwierdził również Thomas ).

Powinien również zostać automatycznie zarzucony, gdy użyjesz go jako łańcucha.

Chris
źródło
28

Szukasz strval :

string strval ( mixed $var )

Uzyskaj wartość ciągu zmiennej. Więcej informacji na temat konwersji na ciąg znajduje się w dokumentacji dotyczącej ciągu.

Ta funkcja nie wykonuje formatowania zwracanej wartości. Jeśli szukasz sposobu na sformatowanie wartości liczbowej jako łańcucha, zobacz sprintf () lub number_format ().

opensas
źródło
3
Jest to w rzeczywistości bardzo pomocne, ponieważ chciałem przekonwertować wszystkie liczby na ciągi bez korzystania z niestandardowego wywołania zwrotnego. $strings = array_map('strval', $my_numbers);
peterchaula
Jest to jedyna odpowiedź, która array_mapogólnie działa z ciągami callables.
Danon
18

W przypadku prymitywów po prostu użyj (string)$varlub wydrukuj tę zmienną od razu. PHP jest językiem dynamicznie wpisywanym, a zmienne będą rzutowane na ciąg w locie.

Jeśli chcesz przekonwertować obiekty na ciągi, musisz zdefiniować __toString()metodę zwracającą ciąg. Ta metoda nie może zgłaszać wyjątków.

Michał Rudnicki
źródło
15

Umieszczenie go w podwójnych cudzysłowach powinno działać:

$myText = "$myVar";
Mark Biek
źródło
To działa, ale nie wiem, czy jest to standardowy sposób robienia tego w PHP.
Antoine Aubry,
Jest to bardzo standardowy sposób robienia tego w bash
Yauhen Yakimovich
Ta metoda zadziała, jeśli $ myVar jest obiektem klasy z __toString lub typem skalarnym. W innych przypadkach wygeneruj błąd.
zennin
11

Myślę, że warto wspomnieć, że można złapać żadnego wyjścia (jak print_r, var_dump) w zmiennej za pomocą buforowania wyjścia:

<?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
?>

Dzięki: Jak mogę przechwycić wynik var_dump do łańcucha?

Daan
źródło
1
warto wspomnieć, że nie potrzebujesz tego z print_r . Wystarczy użyć przesłonięcia, aby zwrócić jako ciąg.
ars265
1
Lepszym sposobem byłoby użycie $result = var_export($someVar, true)bez ob.
Danon
8

Inną opcją jest użycie wbudowanej funkcji settype :

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

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

To faktycznie wykonuje konwersję zmiennej w przeciwieństwie do rzutowania typów i pozwala mieć ogólny sposób konwersji na wiele typów.

Justin Weeks
źródło
8

Oprócz odpowiedzi udzielonej przez Thomasa G. Mayfielda:

Jeśli skorzystasz z linku do instrukcji odlewania sznurka, istnieje specjalny przypadek, który należy zrozumieć:

Preferowany jest rzut (string), szczególnie jeśli zmienna $ a jest obiektem, ponieważ PHP będzie postępować zgodnie z protokołem rzutowania zgodnie ze swoim modelem obiektowym, wywołując metodę magiczną __toString () (jeśli taka jest zdefiniowana w klasie, z której $ a jest tworzona ).

PHP robi coś podobnego do

function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

(String) operacja odlewania jest zalecaną techniką PHP5 + programowanie czyni kod bardziej obiektowe. IMO to dobry przykład podobieństwa projektu (różnicy) do innych języków OOP, takich jak Java / C # / itp., Tj. Na swój własny specjalny sposób PHP (ilekroć jest to dla dobra lub dla wartości).

Yauhen Yakimovich
źródło
8

Jak wspomnieli inni, obiekty wymagają __toStringmetody rzutowania na łańcuch. Obiekt, który nie definiuje tej metody, może nadal generować ciąg znaków za pomocą funkcji spl_object_hash .

Ta funkcja zwraca unikalny identyfikator obiektu. Tego identyfikatora można użyć jako klucza skrótu do przechowywania obiektów lub do identyfikacji obiektu, o ile obiekt nie zostanie zniszczony. Po zniszczeniu obiektu jego skrót może zostać ponownie wykorzystany dla innych obiektów.

Mam podstawową klasę Object z __toStringmetodą, która domyślnie wywołuje md5(spl_object_hash($this))funkcję, dzięki czemu dane wyjściowe są wyraźnie unikalne, ponieważ dane wyjściowe z spl_object_hash mogą wyglądać bardzo podobnie między obiektami.

Jest to szczególnie pomocne przy debugowaniu kodu, w którym zmienna inicjuje się jako obiekt, a później w kodzie podejrzewa się, że zmienił się na inny obiekt. Po prostu echo zmiennych w dzienniku może ujawnić zmianę z wartości skrótu obiektu (lub nie).

jimp
źródło
6

Niektóre, jeśli nie wszystkie, metody z poprzednich odpowiedzi zawodzą, gdy zamierzona zmienna łańcuchowa ma wiodące zero , na przykład 077543 .

Próba konwersji takiej zmiennej nie pozwala uzyskać zamierzonego ciągu, ponieważ zmienna jest konwertowana na podstawę 8 (ósemkową) .

Wszystkie te będą $strmiały wartość 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
użytkownik1587439
źródło
1
To jest PIKNIK (problem na krześle, nie na komputerze), ponieważ tutaj nic nie zawodzi ! print 077543;wyjściowe 32611, więc jest to poprawna wartość ciągu $no. Nikt tego nie oczekuje(string)+1 zwróci ciąg +1(poprawnie zwraca 1), ani że nie $no = 1+1; print (string)$no;wyświetli 1+1. Uwagi: (1) To samo dotyczy hex ( $no=0xff;). (2) Możesz odzyskać wartość ósemkową za pomocą '0'.decoct($no);(3) $no="077543";utrzymuje wiodący 0, „077543” + 1` daje, 77544podczas gdy 077543+1(poprawnie) daje 32612. (PS: nie przegłosowano, ponieważ ten błąd jest powszechny)
Tino
4

Myślę, że to pytanie jest nieco mylące, ponieważ toString () w Javie to nie tylko sposób na rzutowanie czegoś na String. Tak właśnie działa casting przez (string) lub String.valueOf () i działa również w PHP.

// Java
String myText = (string) myVar;

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

Zauważ, że może to być problematyczne, ponieważ Java jest bezpieczna dla typu ( więcej informacji znajdziesz tutaj ).

Ale jak powiedziałem, jest to rzutowanie, a zatem nie jest odpowiednikiem metody JavaString ().

toString w Javie nie tylko rzutuje obiekt na String. Zamiast tego da ci reprezentację ciągu . I właśnie to robi __toString () w PHP.

// Java
class SomeClass{
    public String toString(){
        return "some string representation";
    }
}

// PHP
class SomeClass{
    public function __toString()
    {
        return "some string representation";
    }
}

A z drugiej strony:

// Java
new SomeClass().toString(); // "Some string representation"

// PHP
strval(new SomeClass); // "Some string representation"

Co mam na myśli przez „przedstawienie reprezentacji ciągu”? Wyobraź sobie klasę dla biblioteki z milionami książek.

  • Rzutowanie tej klasy na łańcuch znaków (domyślnie) przekształciłoby dane, tutaj wszystkie książki, w łańcuch znaków, dzięki czemu łańcuch byłby bardzo długi i przez większość czasu nie byłby zbyt przydatny.
  • To String zamiast tego da ci reprezentację String, tj. Tylko nazwę biblioteki. Jest to krótsze i dlatego daje mniej, ale ważniejsze informacje.

Oba są słuszne podejścia, ale mają bardzo różne cele, żadne nie jest idealnym rozwiązaniem dla każdego przypadku i musisz mądrze wybrać, który najlepiej pasuje do twoich potrzeb.

Jasne, jest jeszcze więcej opcji:

$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

Wszystkie te metody zwrócą String, niektóre z nich używają __toString wewnętrznie, a inne zawiodą na Obiektach. Więcej informacji znajdziesz w dokumentacji PHP .

Xanlantos
źródło
3

Dokumentacja mówi, że możesz także:

$str = "$foo";

Jest taki sam jak obsada, ale myślę, że wygląda ładniej.

Źródło:

DarthKotik
źródło
1

Podwójne cudzysłowy też powinny działać ... powinny tworzyć ciąg, a następnie DOŁĄCZYĆ / WSTAWIĆ rzutowaną wartość STRING $ myVar pomiędzy 2 pustymi ciągami.

Flak DiNenno
źródło
1

Zawsze możesz utworzyć metodę o nazwie .ToString ($ in), która zwraca

$in . '';  
Joel Coehoorn
źródło
1

Jeśli konwertujesz coś innego niż proste typy, takie jak liczby całkowite lub logiczne, musisz napisać własną funkcję / metodę dla typu, który próbujesz przekonwertować, w przeciwnym razie PHP po prostu wydrukuje typ (taki jak tablica, GoogleSniffer lub Bidet).

Brian Warshaw
źródło
1

PHP jest dynamicznie wpisywane, więc jak powiedział Chris Fournier: „Jeśli użyjesz go jak łańcucha, staje się on ciągiem”. Jeśli szukasz większej kontroli nad formatem ciągu, odpowiedzią jest printf .

Allain Lalonde
źródło
1

Możesz także użyć funkcji PHP var_export .

Aby W
źródło
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) . "'";
Daniel Adenew
źródło
Zagłosowano, ponieważ tak naprawdę nie mam pojęcia, co chcesz nam powiedzieć. Używanie strval()ciągów to po prostu całkowita strata czasu.
Tino
koleś, zakładamy, że otrzymałeś wartość ciągu = gdy będzie reprezentowany, będzie to „ciąg”. Ale jeśli chcesz wyświetlić to w javascript, musisz ustawić go jako „stringx”
Daniel Adenew,
Jest to niezwykle niebezpieczne (nie mówiąc: po prostu źle). Zajrzyj na stackoverflow.com/q/168214 lub stackoverflow.com/q/23740548, aby dowiedzieć się, jak bezpiecznie przekazać coś z PHP do JS! (Przepraszam, że jestem trochę nie na temat: przekazanie var PHP do JS nie było częścią pytania.)
Tino
0

W przypadku obiektów użycie operatora rzutowania może być niemożliwe. Zamiast tego używamjson_encode() metody.

Na przykład następujące dane wypisują zawartość do dziennika błędów:

error_log(json_encode($args));
Archimedes Trajano
źródło
0

Wypróbuj to trochę dziwne, ale działające podejście, aby przekonwertować tekstową część stdClass na ciąg znaków:

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

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
mikikg
źródło
-1

Używam zmiennejToString . Obsługuje każdy typ PHP i jest elastyczny (możesz go rozszerzyć, jeśli chcesz).

molwa
źródło