PHP equivalente di .NET / Java's toString ()


556

Come converto il valore di una variabile PHP in stringa?

Stavo cercando qualcosa di meglio che concatenare con una stringa vuota:

$myText = $myVar . '';

Come il ToString()metodo in Java o .NET.


6
Questa sembra essere la risposta corretta: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234,

Vorrei usare json_encode($myText). Ho trovato che le soluzioni suggerite print_re (string)varfunzionano bene per i valori scalari e semplici oggetti. Per variabili complesse, classi o oggetti se __toString()non viene definito un completo preferisco quanto sopra json_encode.
Eric Kigathi,

Risposte:


791

Puoi utilizzare gli operatori di casting :

$myText = (string)$myVar;

Ci sono maggiori dettagli per il casting e la conversione delle stringhe nella sezione Stringhe del manuale di PHP, inclusa la gestione speciale per booleani e valori null.


11
Object of class Foo could not be converted to string. Esistono soluzioni generali che possono convertire qualsiasi cosa (array + oggetti + qualunque cosa) in una stringa?
ripper234,


2
Nota: questo darà un avviso PHP quando usato su array.
dave1010,

29
@MarkAmery Ha dato una risposta che chiama implicitamente il __toString()"Metodo magico", ma non lo ha menzionato affatto. L'utente ha chiesto una risposta simile al toString()metodo Java e in PHP questa è la __toString()funzione.
Supuhstar

2
@Supuhstar Ah giusto, finalmente capisco da dove vieni. Scusa se prima ero ottuso. Concordo sul fatto che si tratta di un dettaglio pertinente e sarebbe utile aggiungerlo, forse separando la risposta nelle sezioni "Conversione di primitivi" e "Conversione di oggetti" con le intestazioni.
Mark Amery,

309

Questo viene fatto con la tipografia:

$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 una classe puoi definire ciò che viene prodotto usando il metodo magico __toString. Un esempio è di seguito:

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"

Alcuni altri esempi di casting di tipo:

$i = 1;

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

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

// string "1"
var_dump((string) 1);

126

Usa print_r :

$myText = print_r($myVar,true);

Puoi anche usarlo come:

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

Questo verrà impostato $myTextsu una stringa, come:

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

Usa var_export per ottenere qualche informazione in più (con tipi di variabili, ...):

$myText = var_export($myVar,true);

1
"quando il parametro return è TRUE, [print_r] restituirà una stringa." Dato che print_r è un buon modo per stampare oggetti, matrici (e anche numeri / stringhe), è un buon modo per trasformare un oggetto in una stringa leggibile dall'uomo.
Cedric

1
FYI nuovi arrivati, la trueparte è essenziale! Ho provato diversi metodi di conversione delle stringhe tra cui print_red ero deluso da tutti loro, e poi ho scoperto il trueparametro (leggi la documentazione sul perché funziona).
ripper234,

57

Puoi usare sia il typecasting:

$var = (string)$varname;

o StringValue:

$var = strval($varname);

o SetType:

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

Funzionano tutti per la stessa cosa in termini di giocoleria di tipo.


strval ($ varname) fa il trucco per me, specialmente quando il valore viene restituito come tipo "variant" e deve essere convertito in stringa o int.
Milano,

strval()è quello che cercavo perché volevo usarlo array_walk. Ad esempio$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus,

33

Come converto il valore di una variabile PHP in stringa?

Un valore può essere convertito in una stringa utilizzando il cast (stringa) o la funzione strval () . (Modifica: come ha anche affermato Thomas ).

Inoltre, dovrebbe essere automaticamente castato per te quando lo usi come stringa.


28

Stai cercando strval :

string strval ( mixed $var )

Ottieni il valore di stringa di una variabile. Vedere la documentazione sulla stringa per ulteriori informazioni sulla conversione in stringa.

Questa funzione non esegue alcuna formattazione sul valore restituito. Se stai cercando un modo per formattare un valore numerico come stringa, vedi sprintf () o number_format ().


3
Questo in realtà è molto utile perché volevo convertire tutti i numeri in stringhe senza usare un callback personalizzato. $strings = array_map('strval', $my_numbers);
peterchaula,

Questa è l'unica risposta che funziona con array_mape callable in generale.
Danon,

18

Per i primitivi basta usare (string)$varo stampare subito questa variabile. PHP è un linguaggio tipizzato in modo dinamico e la variabile verrà lanciata su stringa al volo.

Se si desidera convertire oggetti in stringhe, sarà necessario definire il __toString()metodo che restituisce stringa. Questo metodo è vietato generare eccezioni.


15

Metterlo tra virgolette dovrebbe funzionare:

$myText = "$myVar";

Funziona, ma non so se sia il modo standard di farlo in PHP.
Antoine Aubry,

È un modo molto standard di farlo in bash
Yauhen Yakimovich l'

Questo metodo funzionerà se $ myVar è un oggetto di classe con __toString o tipo scalare. In altri casi genera un errore.
zennin,

11

Penso che valga la pena ricordare che puoi catturare qualsiasi output (come print_r, var_dump) in una variabile usando il buffering dell'output:

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

Grazie a: Come posso catturare il risultato di var_dump su una stringa?


1
vale la pena ricordare che non è necessario con print_r . Basta usare l'override per tornare come stringa.
ars265,

1
Un modo migliore sarebbe usare $result = var_export($someVar, true)senza ob.
Danon,

8

Un'altra opzione è utilizzare la funzione settype integrata:

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

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

Questo in realtà esegue una conversione sulla variabile a differenza del typecasting e ti consente di avere un modo generale di convertire in più tipi.


8

Oltre alla risposta data da Thomas G. Mayfield:

Se segui il link al manuale di casting delle stringhe, c'è un caso speciale che è abbastanza importante da capire:

(stringa) cast è preferibile soprattutto se la variabile $ a è un oggetto, poiché PHP seguirà il protocollo di casting secondo il suo modello a oggetti chiamando il metodo magico __toString () (se tale è definito nella classe da cui $ a viene istanziato da ).

PHP fa qualcosa di simile a

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

L' operazione di casting (stringa) è una tecnica consigliata per la programmazione PHP5 + che rende il codice più orientato agli oggetti. IMO questo è un bell'esempio di somiglianza progettuale (differenza) con altri linguaggi OOP come Java / C # / ecc., Cioè nel suo modo speciale PHP (ogni volta che è per il bene o per il valore).


8

Come altri hanno già detto, gli oggetti hanno bisogno di un __toStringmetodo per essere lanciati su una stringa. Un oggetto che non definisce tale metodo può comunque produrre una rappresentazione di stringa usando la funzione spl_object_hash .

Questa funzione restituisce un identificatore univoco per l'oggetto. Questo id può essere utilizzato come chiave hash per archiviare oggetti o per identificare un oggetto, purché l'oggetto non venga distrutto. Una volta che l'oggetto viene distrutto, il suo hash può essere riutilizzato per altri oggetti.

Ho una classe Object di base con un __toStringmetodo che per impostazione predefinita chiama md5(spl_object_hash($this))per rendere l'output chiaramente unico, poiché l'output di spl_object_hash può apparire molto simile tra gli oggetti.

Ciò è particolarmente utile per il debug del codice in cui una variabile viene inizializzata come oggetto e successivamente nel codice si sospetta che sia stata modificata in un oggetto diverso. La semplice eco delle variabili nel registro può rivelare la modifica dall'hash dell'oggetto (o meno).


6

Alcuni, se non tutti, i metodi nelle risposte precedenti falliscono quando la variabile stringa desiderata ha uno zero iniziale , ad esempio 077543 .

Un tentativo di convertire una tale variabile non riesce a ottenere la stringa desiderata, poiché la variabile viene convertita in base 8 (ottale) .

Tutto ciò avrà $strun valore di 32611 :

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

1
Questo è PICNIC (problema con la sedia, non con il computer) dato che qui non fallisce nulla ! print 077543;output 32611, quindi questo è il valore stringa corretto di $no. Nessuno si aspetta che (string)+1restituisca la stringa +1(restituisce correttamente 1) né che $no = 1+1; print (string)$no;produca 1+1. Note: (1) Lo stesso vale per hex ( $no=0xff;). (2) Puoi recuperare il valore ottale con '0'.decoct($no);(3) $no="077543";mantiene il valore iniziale 0, "077543" + 1` dà 77544mentre 077543+1(correttamente) dà 32612. (PS: non sottovalutato, poiché questo errore è comune)
Tino

4

Penso che questa domanda sia un po 'fuorviante poiché toString () in Java non è solo un modo per trasmettere qualcosa a una stringa. Questo è ciò che fa il casting tramite (string) o String.valueOf (), e funziona anche in PHP.

// Java
String myText = (string) myVar;

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

Si noti che ciò può essere problematico in quanto Java è sicuro per i tipi ( vedere qui per maggiori dettagli ).

Ma come ho detto, questo è il casting e quindi non l'equivalente di toString () di Java.

toString in Java non si limita a lanciare un oggetto in una stringa. Ti darà invece la rappresentazione String . Ed è quello che fa __toString () in PHP.

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

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

E dall'altra parte:

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

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

Cosa intendo per "dare la rappresentazione String"? Immagina un corso per una biblioteca con milioni di libri.

  • Il cast di quella classe in una stringa convertirà (di default) i dati, qui tutti i libri, in una stringa in modo che la stringa sia molto lunga e il più delle volte non molto utile.
  • String invece ti darà la rappresentazione String, cioè solo il nome della libreria. Questo è più breve e quindi ti dà meno, ma informazioni più importanti.

Questi sono entrambi approcci validi ma con obiettivi molto diversi, né è una soluzione perfetta per ogni caso e devi scegliere saggiamente che si adatta meglio alle tue esigenze.

Certo, ci sono ancora più opzioni:

$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

Tutti questi metodi restituiranno una stringa, alcuni usando internamente __toString e altri falliranno su Oggetti. Dai un'occhiata alla documentazione di PHP per maggiori dettagli.


3

La documentazione dice che puoi anche fare:

$str = "$foo";

È lo stesso del cast, ma penso che sia più bello.

Fonte:


1

Anche le virgolette doppie dovrebbero funzionare ... dovrebbe creare una stringa, quindi APPEND / INSERISCI il valore STRING cast di $ myVar tra 2 stringhe vuote.


1

Puoi sempre creare un metodo chiamato .ToString ($ in) che ritorna

$in . '';  

1

Se stai convertendo qualcosa di diverso da tipi semplici come numeri interi o booleani, dovrai scrivere la tua funzione / metodo per il tipo che stai cercando di convertire, altrimenti PHP stamperà semplicemente il tipo (come array, GoogleSniffer o Bidet).


1

PHP è digitato in modo dinamico, quindi come ha detto Chris Fournier, "Se lo usi come una stringa diventa una stringa". Se stai cercando un maggiore controllo sul formato della stringa, allora printf è la tua risposta.



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) . "'";

Sottovalutato, in quanto non ho davvero idea di cosa ci vuoi dire. L'uso strval()delle stringhe è solo una completa perdita di tempo.
Tino,

amico, il fatto è che tu abbia ricevuto una stringa valore = quando la sua risposta sarà "la stringa". Ma, quando volevi mostrare che in javascript devi renderlo 'stringx' '
Daniel Adenew,

Questo è estremamente pericoloso (per non dire: chiaramente sbagliato). Dai un'occhiata a stackoverflow.com/q/168214 o stackoverflow.com/q/23740548 per capire come passare in sicurezza qualcosa da PHP a JS! (Mi dispiace per essere un po 'offtopico: passare una variante PHP a JS non faceva parte della domanda.)
Tino

0

Per gli oggetti, potresti non essere in grado di utilizzare l'operatore di cast. Invece, io uso il json_encode()metodo.

Ad esempio, quanto segue genererà i contenuti nel registro degli errori:

error_log(json_encode($args));

0

Prova questo approccio un po 'strano, ma funzionante, per convertire la parte testuale di stdClass in tipo stringa:

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

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.