PHP-Äquivalent zu toString () von .NET / Java

556

Wie konvertiere ich den Wert einer PHP-Variablen in einen String?

Ich suchte nach etwas Besserem als mit einer leeren Zeichenfolge zu verketten:

$myText = $myVar . '';

Wie die ToString()Methode in Java oder .NET.

Antoine Aubry
quelle
6
Dies scheint die richtige Antwort zu sein: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
Ripper234
Ich würde verwenden json_encode($myText). Ich habe festgestellt, dass die vorgeschlagenen Lösungen print_rund (string)vargut für skalare Werte und einfache Objekte funktionieren. Für komplexe Variablen, Klassen oder Objekte, wenn keine vollständige __toString()definiert ist, bevorzuge ich die oben genannten json_encode.
Eric Kigathi

Antworten:

791

Sie können die Casting-Operatoren verwenden :

$myText = (string)$myVar;

Weitere Details zum Casting und zur Konvertierung von Strings finden Sie im Abschnitt Strings des PHP-Handbuchs, einschließlich der speziellen Behandlung für Boolesche Werte und Nullen.

Tom Mayfield
quelle
11
Object of class Foo could not be converted to string. Gibt es allgemeine Lösungen, die alles (Arrays + Objekte + was auch immer) in einen String konvertieren können?
Ripper234
2
Hinweis: Dies gibt einen PHP-Hinweis, wenn es auf Arrays verwendet wird.
Dave1010
29
@ MarkAmery Er gab eine Antwort, die implizit die __toString()"magische Methode" nennt , erwähnte dies aber überhaupt nicht. Der Benutzer fragte nach einer Antwort, die der Java- toString()Methode ähnelte, und in PHP ist dies die __toString()Funktion.
Supuhstar
2
@Supuhstar Ah richtig, ich verstehe endlich, woher du kommst. Tut mir leid, wenn ich vorher stumpf war. Ich bin damit einverstanden, dass dies ein relevantes Detail ist, und es wäre wertvoll, es hinzuzufügen, wobei die Antwort möglicherweise in die Abschnitte "Konvertieren von Grundelementen" und "Konvertieren von Objekten" mit Überschriften unterteilt wird.
Mark Amery
309

Dies geschieht mit Typografie:

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

In einer Klasse können Sie mithilfe der magischen Methode definieren, was ausgegeben wird __toString. Ein Beispiel ist unten:

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"

Einige weitere Beispiele für Typguss:

$i = 1;

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

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

// string "1"
var_dump((string) 1);
Ross
quelle
126

Verwenden Sie print_r :

$myText = print_r($myVar,true);

Sie können es auch wie folgt verwenden:

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

Dies setzt $myTexteine Zeichenfolge wie:

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

Verwenden Sie var_export , um ein bisschen mehr Informationen zu erhalten (mit Variablentypen, ...):

$myText = var_export($myVar,true);
Cedric
quelle
1
"Wenn der Rückgabeparameter TRUE ist, gibt [print_r] eine Zeichenfolge zurück." Da print_r eine gute Möglichkeit ist, Objekte, Arrays (und auch Zahlen / Zeichenfolgen) zu drucken, ist es eine gute Möglichkeit, ein Objekt in eine für Menschen lesbare Zeichenfolge umzuwandeln.
Cedric
1
Zu Ihrer Information Neulinge, der trueTeil ist wichtig! Ich habe verschiedene Methoden zur Konvertierung von Zeichenfolgen ausprobiert, einschließlich print_rund war von allen enttäuscht. Dann habe ich den trueParameter entdeckt (lesen Sie die Dokumentation, warum er funktioniert).
Ripper234
57

Sie können entweder Typografie verwenden:

$var = (string)$varname;

oder StringValue:

$var = strval($varname);

oder SetType:

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

Sie alle arbeiten in Bezug auf Typ-Jonglieren für dasselbe.

Joel Larson
quelle
strval ($ varname) macht den Trick für mich, besonders wenn der Wert als Typ "variante" zurückgegeben wird und in string oder int konvertiert werden muss.
Mailand
strval()ist das, wonach ich gesucht habe, weil ich es verwenden wollte array_walk. ZB$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus
33

Wie konvertiere ich den Wert einer PHP-Variablen in einen String?

Ein Wert kann mit der Umwandlung (string) oder der Funktion strval () in einen String konvertiert werden. (Edit: Wie Thomas auch sagte).

Es sollte auch automatisch für Sie umgewandelt werden, wenn Sie es als Zeichenfolge verwenden.

Chris
quelle
28

Sie suchen strval :

string strval ( mixed $var )

Ruft den Zeichenfolgenwert einer Variablen ab. Weitere Informationen zum Konvertieren in eine Zeichenfolge finden Sie in der Dokumentation zur Zeichenfolge.

Diese Funktion führt keine Formatierung für den zurückgegebenen Wert durch. Wenn Sie nach einer Möglichkeit suchen, einen numerischen Wert als Zeichenfolge zu formatieren, lesen Sie bitte sprintf () oder number_format ().

opensas
quelle
3
Dies ist eigentlich sehr hilfreich, da ich alle Zahlen in Strings konvertieren wollte, ohne einen benutzerdefinierten Rückruf zu verwenden. $strings = array_map('strval', $my_numbers);
Peterchaula
Dies ist die einzige Antwort, die mit array_mapCallables im Allgemeinen funktioniert und diese aufzeichnet.
Danon
18

Verwenden Sie für (string)$varGrundelemente diese Variable einfach oder drucken Sie sie sofort aus. PHP ist eine dynamisch typisierte Sprache und die Variable wird im laufenden Betrieb in einen String umgewandelt.

Wenn Sie Objekte in Zeichenfolgen konvertieren möchten, müssen Sie eine __toString()Methode definieren , die eine Zeichenfolge zurückgibt. Diese Methode darf keine Ausnahmen auslösen.

Michał Rudnicki
quelle
15

Es sollte funktionieren, wenn Sie es in doppelte Anführungszeichen setzen:

$myText = "$myVar";
Mark Biek
quelle
Das funktioniert, aber ich weiß nicht, ob es die Standardmethode in PHP ist.
Antoine Aubry
Es ist eine sehr übliche Art, es in Bash zu
Yauhen Yakimovich
Diese Methode funktioniert, wenn $ myVar ein Objekt der Klasse mit dem Typ __toString oder skalar ist. In anderen Fällen wird ein Fehler generiert.
Zennin
11

Ich denke, es ist erwähnenswert, dass Sie jede Ausgabe (wie ) in einer Variablen abfangen können print_r, var_dumpindem Sie die Ausgabepufferung verwenden:

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

Dank an: Wie kann ich das Ergebnis von var_dump in einem String erfassen?

Daan
quelle
1
Es ist erwähnenswert, dass Sie das mit print_r nicht brauchen . Verwenden Sie einfach die Überschreibung, um als Zeichenfolge zurückzukehren.
Ars265
1
Ein besserer Weg wäre, $result = var_export($someVar, true)ohne ob zu verwenden.
Danon
8

Eine weitere Option ist die Verwendung der integrierten Settype- Funktion:

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

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

Dies führt im Gegensatz zum Typecasting tatsächlich eine Konvertierung für die Variable durch und ermöglicht Ihnen eine allgemeine Konvertierung in mehrere Typen.

Justin Weeks
quelle
8

Zusätzlich zu der Antwort von Thomas G. Mayfield:

Wenn Sie dem Link zum String Casting-Handbuch folgen, gibt es einen Sonderfall, dessen Verständnis sehr wichtig ist:

(string) cast ist besonders dann vorzuziehen, wenn Ihre Variable $ a ein Objekt ist, da PHP dem Casting- Protokoll gemäß seinem Objektmodell folgt, indem es die magische Methode __toString () aufruft (sofern dies in der Klasse definiert ist, aus der $ a instanziiert wird ).

PHP macht etwas ähnliches wie

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

Die (String-) Casting-Operation ist eine empfohlene Technik für die PHP5 + -Programmierung, um den Code objektorientierter zu gestalten. IMO ist dies ein schönes Beispiel für Designähnlichkeit (Unterschied) zu anderen OOP-Sprachen wie Java / C # / etc., Dh auf seine eigene spezielle PHP-Art (wann immer es zum Guten oder zum Wert ist).

Yauhen Yakimovich
quelle
8

Wie andere bereits erwähnt haben, benötigen Objekte eine __toStringMethode, um in eine Zeichenfolge umgewandelt zu werden. Ein Objekt, das diese Methode nicht definiert, kann mithilfe der Funktion spl_object_hash weiterhin eine Zeichenfolgendarstellung erstellen .

Diese Funktion gibt eine eindeutige Kennung für das Objekt zurück. Diese ID kann als Hash-Schlüssel zum Speichern von Objekten oder zum Identifizieren eines Objekts verwendet werden, solange das Objekt nicht zerstört wird. Sobald das Objekt zerstört ist, kann sein Hash für andere Objekte wiederverwendet werden.

Ich habe eine Basisobjektklasse mit einer __toStringMethode, die standardmäßig aufruft md5(spl_object_hash($this)), um die Ausgabe eindeutig zu machen, da die Ausgabe von spl_object_hash zwischen Objekten sehr ähnlich aussehen kann.

Dies ist besonders hilfreich beim Debuggen von Code, bei dem eine Variable als Objekt initialisiert wird und später im Code vermutlich in ein anderes Objekt geändert wurde. Durch einfaches Echo der Variablen in das Protokoll kann die Änderung des Objekt-Hashs angezeigt werden (oder nicht).

jimp
quelle
6

Einige, wenn nicht alle Methoden in den vorherigen Antworten schlagen fehl, wenn die beabsichtigte Zeichenfolgenvariable eine führende Null hat , z. B. 077543 .

Bei dem Versuch, eine solche Variable zu konvertieren, wird die beabsichtigte Zeichenfolge nicht abgerufen, da die Variable in die Basis 8 (oktal) konvertiert wird .

Alle diese $strhaben einen Wert von 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
user1587439
quelle
1
Dies ist PICNIC (Problem im Stuhl, nicht im Computer), da hier nichts ausfällt ! print 077543;wird ausgegeben 32611, dies ist also der richtige Zeichenfolgenwert von $no. Niemand erwartet, dass (string)+1der String zurückgegeben wird +1(er wird korrekt zurückgegeben 1) oder $no = 1+1; print (string)$no;ausgegeben wird 1+1. Anmerkungen: (1) Gleiches gilt auch für hex ( $no=0xff;). (2) Sie können den Oktalwert zurückerhalten, indem '0'.decoct($no);(3) $no="077543";den führenden Wert 0beibehält, "077543" + 1` gibt, 77544während 077543+1(korrekt) gibt 32612. (PS: nicht herabgestimmt, da dieser Fehler häufig ist)
Tino
4

Ich denke, diese Frage ist etwas irreführend, da toString () in Java nicht nur eine Möglichkeit ist, etwas in einen String umzuwandeln. Das ist es, was Casting über (string) oder String.valueOf () macht, und es funktioniert auch in PHP.

// Java
String myText = (string) myVar;

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

Beachten Sie, dass dies problematisch sein kann, da Java typsicher ist ( weitere Informationen finden Sie hier ).

Aber wie gesagt, dies ist Casting und daher nicht das Äquivalent von Java toString ().

toString in Java wandelt nicht nur ein Objekt in einen String um. Stattdessen erhalten Sie die Zeichenfolgendarstellung . Und genau das macht __toString () in PHP.

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

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

Und von der anderen Seite:

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

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

Was meine ich mit "Geben der String-Darstellung"? Stellen Sie sich eine Klasse für eine Bibliothek mit Millionen von Büchern vor.

  • Das Umwandeln dieser Klasse in einen String würde (standardmäßig) die Daten, hier alle Bücher, in einen String konvertieren, sodass der String sehr lang und meistens auch nicht sehr nützlich wäre.
  • Wenn Sie stattdessen auf String setzen, erhalten Sie die String-Darstellung, dh nur den Namen der Bibliothek. Dies ist kürzer und gibt Ihnen daher weniger, aber wichtigere Informationen.

Dies sind beide gültige Ansätze, aber mit sehr unterschiedlichen Zielen. Keiner ist eine perfekte Lösung für jeden Fall, und Sie müssen mit Bedacht auswählen, welcher besser zu Ihren Anforderungen passt.

Klar, es gibt noch mehr Möglichkeiten:

$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

Alle diese Methoden geben einen String zurück, einige verwenden __toString intern und andere schlagen bei Objekten fehl. Weitere Informationen finden Sie in der PHP-Dokumentation .

Xanlantos
quelle
3

Die Dokumentation besagt, dass Sie auch Folgendes tun können:

$str = "$foo";

Es ist das gleiche wie bei der Besetzung, aber ich denke, es sieht hübscher aus.

Quelle:

DarthKotik
quelle
1

Doppelte Anführungszeichen sollten ebenfalls funktionieren ... es sollte eine Zeichenfolge erstellt werden, dann sollte der konvertierte STRING-Wert von $ myVar zwischen zwei leeren Zeichenfolgen ANHÄNGEN / EINFÜGEN.

Flak DiNenno
quelle
1

Sie können jederzeit eine Methode mit dem Namen .ToString ($ in) erstellen, die zurückgegeben wird

$in . '';  
Joel Coehoorn
quelle
1

Wenn Sie etwas anderes als einfache Typen wie Ganzzahlen oder Boolesche Werte konvertieren, müssen Sie eine eigene Funktion / Methode für den Typ schreiben, den Sie konvertieren möchten. Andernfalls druckt PHP nur den Typ (z. B. Array, GoogleSniffer) oder Bidet).

Brian Warshaw
quelle
1

PHP wird dynamisch typisiert, so wie Chris Fournier sagte: "Wenn Sie es wie eine Zeichenfolge verwenden, wird es zu einer Zeichenfolge." Wenn Sie mehr Kontrolle über das Format der Zeichenfolge suchen, ist printf Ihre Antwort.

Allain Lalonde
quelle
1

Sie können auch die PHP-Funktion var_export verwenden.

Aby W.
quelle
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
quelle
Abgestimmt, da ich wirklich keine Ahnung habe, was Sie uns sagen wollen. Die Verwendung strval()von Strings ist nur reine Zeitverschwendung.
Tino
Alter, das Ding geht davon aus, dass Sie einen Zeichenfolgenwert erhalten haben = Wenn es dargestellt wird, wird es "die Zeichenfolge" sein. Aber wenn Sie das in Javascript anzeigen wollen, müssen Sie es "stringx" machen
Daniel Adenew
Dies ist äußerst gefährlich (nicht zu sagen: einfach falsch). Schauen Sie sich bitte stackoverflow.com/q/168214 oder stackoverflow.com/q/23740548 an, um zu verstehen, wie Sie sicher etwas von PHP an JS übergeben können! (Tut mir leid, dass ich ein bisschen offtopisch bin: Die Übergabe einer PHP-Variable an JS war nicht Teil der Frage.)
Tino
0

Für Objekte können Sie den Cast-Operator möglicherweise nicht verwenden. Stattdessen verwende ich die json_encode()Methode.

Im Folgenden wird beispielsweise Inhalt in das Fehlerprotokoll ausgegeben:

error_log(json_encode($args));
Archimedes Trajano
quelle
0

Versuchen Sie diesen kleinen seltsamen, aber funktionierenden Ansatz, um den Textteil von stdClass in einen Zeichenfolgentyp zu konvertieren:

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

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion
mikikg
quelle
-1

Ich benutze variableToString . Es behandelt jeden PHP-Typ und ist flexibel (Sie können es erweitern, wenn Sie möchten).

Leng
quelle