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.
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.
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?
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:
classBottles{publicfunction __toString(){return'Ninety nine green bottles';}}
$ex =newBottles;
var_dump($ex,(string) $ex);// Returns: instance of Bottles and "Ninety nine green bottles"
„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.
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 ().
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.
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.
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).
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).
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.
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 .
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.
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).
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 .
$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)."'";
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:
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
print_r(foo, true)
)!json_encode($myText)
. Odkryłam, że proponowane rozwiązaniaprint_r
i(string)var
dział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 wymienionejson_encode
.Odpowiedzi:
Możesz użyć operatorów rzutowania :
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.
źródło
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?__toString()
„Magiczną Metodą”, ale w ogóle o tym nie wspomniał. Użytkownik poprosił o odpowiedź podobną dotoString()
metody Java , a w PHP taka jest__toString()
funkcja.Odbywa się to za pomocą rzutowania typu:
W klasie możesz zdefiniować, co jest wyprowadzane za pomocą magicznej metody
__toString
. Przykład jest poniżej:Kilka innych przykładów rzutowania typu:
źródło
Użyj print_r :
Możesz także użyć go w następujący sposób:
Ustawi
$myText
się na ciąg znaków, na przykład:Użyj var_export, aby uzyskać trochę więcej informacji (z typami zmiennych, ...):
źródło
true
część jest niezbędna! Wypróbowałem kilka metod konwersji ciągów, w tymprint_r
i byłem rozczarowany wszystkimi, a potem odkryłemtrue
parametr (przeczytaj dokumentację, dlaczego to działa).Możesz albo użyć rzutowania czcionek:
lub StringValue:
lub SetType:
Wszystkie działają na tę samą rzecz w zakresie żonglowania typami.
źródło
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)
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.
źródło
Szukasz strval :
źródło
$strings = array_map('strval', $my_numbers);
array_map
ogólnie działa z ciągami callables.W przypadku prymitywów po prostu użyj
(string)$var
lub 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.źródło
Umieszczenie go w podwójnych cudzysłowach powinno działać:
źródło
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:Dzięki: Jak mogę przechwycić wynik var_dump do łańcucha?
źródło
$result = var_export($someVar, true)
bez ob.Inną opcją jest użycie wbudowanej funkcji settype :
To faktycznie wykonuje konwersję zmiennej w przeciwieństwie do rzutowania typów i pozwala mieć ogólny sposób konwersji na wiele typów.
źródło
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
(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).
źródło
Jak wspomnieli inni, obiekty wymagają
__toString
metody 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 .Mam podstawową klasę Object z
__toString
metodą, która domyślnie wywołujemd5(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).
źródło
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ą
$str
miały wartość 32611 :źródło
print 077543;
wyjściowe32611
, więc jest to poprawna wartość ciągu$no
. Nikt tego nie oczekuje(string)+1
zwróci ciąg+1
(poprawnie zwraca1
), ani że nie$no = 1+1; print (string)$no;
wyświetli1+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ący0
, „077543” + 1` daje,77544
podczas gdy077543+1
(poprawnie) daje32612
. (PS: nie przegłosowano, ponieważ ten błąd jest powszechny)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.
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.
A z drugiej strony:
Co mam na myśli przez „przedstawienie reprezentacji ciągu”? Wyobraź sobie klasę dla biblioteki z milionami książek.
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:
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 .
źródło
Dokumentacja mówi, że możesz także:
Jest taki sam jak obsada, ale myślę, że wygląda ładniej.
Źródło:
źródło
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.
źródło
Zawsze możesz utworzyć metodę o nazwie .ToString ($ in), która zwraca
źródło
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).
źródło
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 .
źródło
Możesz także użyć funkcji PHP var_export .
źródło
źródło
strval()
ciągów to po prostu całkowita strata czasu.W przypadku obiektów użycie operatora rzutowania może być niemożliwe. Zamiast tego używam
json_encode()
metody.Na przykład następujące dane wypisują zawartość do dziennika błędów:
źródło
Wypróbuj to trochę dziwne, ale działające podejście, aby przekonwertować tekstową część stdClass na ciąg znaków:
źródło
Używam zmiennejToString . Obsługuje każdy typ PHP i jest elastyczny (możesz go rozszerzyć, jeśli chcesz).
źródło