567 Stimmen

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

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

Ich habe nach etwas Besserem gesucht als der Konkatenation mit einem leeren String:

$myText = $myVar . '';

Ähnlich der ToString() Methode in Java oder .NET.

3 Stimmen

Ich würde json_encode($myText) verwenden. Ich habe festgestellt, dass die vorgeschlagenen Lösungen print_r und (string)var gut für skalare Werte und einfache Objekte funktionieren. Für komplexe Variablen, Klassen oder Objekte ziehe ich, wenn ein vollständiges __toString() nicht definiert ist, json_encode vor.

7voto

Xanlantos Punkte 777

Ich denke, diese Frage ist ein wenig irreführend, da toString() in Java nicht nur eine Möglichkeit ist, etwas in einen String zu casten. Das ist das, was Casting über (string) tut, und das funktioniert auch in PHP.

// Java
String myText = (string) myVar;

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

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

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

toString in Java wandelt nicht einfach ein Objekt in einen String um. Stattdessen liefert es die String-Repräsentation. Und das ist das, was __toString() in PHP tut.

// 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 aus:

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

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

Was meine ich mit "die String-Repräsentation geben"? Stellen Sie sich eine Klasse für eine Bibliothek mit Millionen von Büchern vor.

  • Das Casten dieser Klasse in einen String würde (standardmäßig) die Daten, hier alle Bücher, in einen String umwandeln, sodass der String sehr lang wäre und die meiste Zeit nicht sehr nützlich wäre.
  • ToString wird Ihnen stattdessen die String-Repräsentation geben, d.h. nur den Namen der Bibliothek. Dies ist kürzer und gibt Ihnen daher weniger, aber wichtigere Informationen.

Beide Ansätze sind gültig, aber mit sehr unterschiedlichen Zielen. Keiner ist eine perfekte Lösung für jeden Fall, und Sie müssen weise wählen, welcher besser zu Ihren Bedürfnissen passt.

Sicher, es gibt noch mehr Optionen:

$no = 421337  // Eine Nummer in PHP
$str = "$no"; // In PHP wird der Inhalt von "" berechnet und Variablen werden ersetzt
$str = print_r($no, true); // Gleich wie String.format();
$str = settype($no, 'string'); // Setzt $no auf den String-Typ
$str = strval($no); // Holt den String-Wert von $no
$str = $no . ''; // Wie Sie gesagt haben, funktioniert auch die Verkettung mit einem leeren String

All diese Methoden geben einen String zurück, einige von ihnen verwenden intern __toString und einige andere werden bei Objekten scheitern. Werfen Sie einen Blick auf die PHP-Dokumentation für weitere Details.

7voto

Justin Weeks Punkte 360

Eine weitere Möglichkeit besteht darin, die integrierte settype Funktion zu verwenden:

Dies führt tatsächlich eine Konvertierung der Variablen durch, im Gegensatz zum Typcasting, und ermöglicht es Ihnen, eine allgemeine Möglichkeit zur Konvertierung in verschiedene Typen zu haben.

7voto

Yauhen Yakimovich Punkte 12897

Abgesehen von der Antwort von Thomas G. Mayfield:

Wenn Sie dem Link zum String-Casting-Handbuch folgen, gibt es einen besonderen Fall, den es zu verstehen gilt:

(string) Cast ist besonders empfehlenswert, insbesondere wenn Ihre Variable $a ein Objekt ist, da PHP das Casting-Protokoll gemäß seinem Objektmodell befolgt, indem es die __toString() Magie-Methode aufruft (falls diese in der Klasse definiert ist, von der $a instanziiert ist).

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, die den Code objektorientierter macht. Meiner Meinung nach ist dies ein schönes Beispiel für Designähnlichkeit (Unterschied) zu anderen OOP-Sprachen wie Java/C# usw., d.h. auf seine eigene spezielle PHP-Weise (ob es gut ist oder nicht).

6voto

user1587439 Punkte 1629

Einige, wenn nicht alle, der Methoden in den vorherigen Antworten scheitern, wenn die beabsichtigte Zeichenfolgenvaiable eine führende Null hat, zum Beispiel 077543.

Ein Versuch, eine solche Variable umzuwandeln, führt nicht zur beabsichtigten Zeichenfolge, da die Variable in Basis 8 (Oktal) umgewandelt wird.

All diese werden dazu führen, dass $str den Wert 32611 hat:

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");

1 Stimmen

Dies ist ein Picknick (Problem im Stuhl, nicht im Computer), da hier nichts schiefgeht! print 077543; gibt 32611 aus, also ist dies der richtige Zeichenfolgenwert von $no. Niemand erwartet, dass (string)+1 die Zeichenfolge +1 zurückgibt (es gibt korrekt 1 zurück) noch dass $no = 1+1; print (string)$no; 1+1 ausgibt. Anmerkungen: (1) Gleiches gilt für hex ($no=0xff;). (2) Du kannst den oktalen Wert mit '0'.decoct($no); zurückbekommen. (3) $no="077543"; behält die führende 0, "077543"+1` ergibt 77544, während 077543+1 (korrekt) 32612 ergibt. (PS: nicht heruntergestimmt, da dieser Fehler üblich ist)

3voto

DarthKotik Punkte 43

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

$str = "$foo";

Es ist dasselbe wie cast, aber ich denke, es sieht hübscher aus.

Quelle:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X