Equivalente en PHP de .NET / Java's toString ()

556

¿Cómo convierto el valor de una variable PHP a cadena?

Estaba buscando algo mejor que concatenar con una cadena vacía:

$myText = $myVar . '';

Como el ToString()método en Java o .NET.

Antoine Aubry
fuente
66
Esta parece ser la respuesta correcta: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234
Que haría uso json_encode($myText). He encontrado que las soluciones sugeridas print_ry (string)varfuncionan bien para valores escalares y objetos simples. Para variables complejas, clases u objetos si un completo __toString()no está definido, prefiero lo mencionado anteriormente json_encode.
Eric Kigathi el

Respuestas:

791

Puedes usar los operadores de casting :

$myText = (string)$myVar;

Hay más detalles para la conversión y conversión de cadenas en la sección Cadenas del manual de PHP, incluido el manejo especial para booleanos y nulos.

Tom Mayfield
fuente
11
Object of class Foo could not be converted to string. ¿Hay soluciones generales que puedan convertir cualquier cosa (matrices + objetos + lo que sea) en una cadena?
ripper234
2
Nota: esto dará un aviso PHP cuando se use en matrices.
dave1010
29
@ MarkAmery Dio una respuesta que implícitamente llama el __toString()"Método Mágico", pero no mencionó eso en absoluto. El usuario solicitó una respuesta que era como el toString()método Java , y en PHP, esa es la __toString()función.
Supuhstar
2
@Supuhstar Ah, claro, finalmente entiendo de dónde vienes. Lo siento si estaba siendo obtuso antes. Estoy de acuerdo en que este es un detalle relevante y sería valioso agregarlo, tal vez separando la respuesta en las secciones 'Convertir primitivas' y 'Convertir objetos' con encabezados.
Mark Amery
309

Esto se hace con la conversión de texto:

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

En una clase, puede definir lo que se genera mediante el método mágico __toString. Un ejemplo está abajo:

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"

Algunos ejemplos más de conversión de tipos:

$i = 1;

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

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

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

Use print_r :

$myText = print_r($myVar,true);

También puedes usarlo como:

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

Esto se establecerá $myTexten una cadena, como:

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

Use var_export para obtener un poco más de información (con tipos de variables, ...):

$myText = var_export($myVar,true);
Cedric
fuente
1
"cuando el parámetro de retorno es VERDADERO, [print_r] devolverá una cadena". Como print_r es una buena manera de imprimir objetos, matrices (y también números / cadenas), es una buena manera de transformar un objeto en una cadena legible para humanos.
Cedric
1
Para tu información, ¡la trueparte es esencial! Probé varios métodos de conversión de cadenas, incluidos print_rtodos, y me decepcionó, y luego descubrí el trueparámetro (lea la documentación para saber por qué funciona).
ripper234
57

Puede usar la conversión de texto:

$var = (string)$varname;

o StringValue:

$var = strval($varname);

o SetType:

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

Todos trabajan para lo mismo en términos de malabarismo de tipos.

Joel Larson
fuente
strval ($ varname) hace el truco para mí, especialmente cuando el valor se devuelve como tipo "variante" y necesita convertirse en una cadena o int.
Milán
strval()es lo que buscaba porque quería usarlo array_walk. Por ejemplo$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus
33

¿Cómo convierto el valor de una variable PHP a cadena?

Un valor se puede convertir en una cadena usando la función (cadena) o la función strval () . (Editar: como también dijo Thomas ).

También debe lanzarse automáticamente cuando lo use como una cadena.

Chris
fuente
28

Estás buscando strval :

string strval ( mixed $var )

Obtiene el valor de cadena de una variable. Consulte la documentación en cadena para obtener más información sobre la conversión a cadena.

Esta función no realiza formateo en el valor devuelto. Si está buscando una forma de formatear un valor numérico como una cadena, consulte sprintf () o number_format ().

opensas
fuente
3
Esto es realmente muy útil porque quería convertir todos los números en cadenas sin usar una devolución de llamada personalizada. $strings = array_map('strval', $my_numbers);
peterchaula
Esta es la única respuesta que funciona con array_mapy callables en general.
Danon
18

Para las primitivas, simplemente use (string)$varo imprima esta variable de inmediato. PHP es un lenguaje de tipo dinámico y la variable se convertirá en una cadena sobre la marcha.

Si desea convertir objetos en cadenas, deberá definir un __toString()método que devuelva cadenas. Este método tiene prohibido lanzar excepciones.

Michał Rudnicki
fuente
15

Ponerlo entre comillas dobles debería funcionar:

$myText = "$myVar";
Mark Biek
fuente
Eso funciona, pero no sé si es la forma estándar de hacerlo en PHP.
Antoine Aubry
Es una forma muy estándar de hacerlo en bash
Yauhen Yakimovich
Este método funcionará si $ myVar es un objeto de clase con __toString o tipo escalar. En otros casos genera un error.
zennin
11

Creo que vale la pena mencionar que puede capturar cualquier salida (como print_r, var_dump) en una variable utilizando el almacenamiento en búfer de salida:

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

Gracias a: ¿Cómo puedo capturar el resultado de var_dump en una cadena?

Daan
fuente
1
Vale la pena mencionar que no necesita eso con print_r . Simplemente use la anulación para regresar como una cadena.
ars265
1
Una mejor manera sería usar $result = var_export($someVar, true)sin ob.
Danon
8

Otra opción es usar la función settype incorporada:

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

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

Esto realmente realiza una conversión en la variable a diferencia de la conversión de texto y le permite tener una forma general de convertir a múltiples tipos.

Justin Weeks
fuente
8

Además de la respuesta dada por Thomas G. Mayfield:

Si sigue el enlace al manual de fundición de cadenas, hay un caso especial que es bastante importante de entender:

(cadena) es preferible especialmente si su variable $ a es un objeto, porque PHP seguirá el protocolo de conversión de acuerdo con su modelo de objeto llamando al método mágico __toString () (si tal se define en la clase de la cual se instancia $ a )

PHP hace algo similar a

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

La operación de conversión (cadena) es una técnica recomendada para la programación PHP5 + que hace que el código sea más orientado a objetos. En mi opinión, este es un buen ejemplo de similitud de diseño (diferencia) con otros lenguajes OOP como Java / C # / etc., es decir, en su propia forma especial de PHP (siempre que sea por el bien o por el valor).

Yauhen Yakimovich
fuente
8

Como otros han mencionado, los objetos necesitan un __toStringmétodo para convertirse en una cadena. Un objeto que no define ese método aún puede producir una representación de cadena usando la función spl_object_hash .

Esta función devuelve un identificador único para el objeto. Esta identificación se puede utilizar como una clave hash para almacenar objetos o para identificar un objeto, siempre que el objeto no se destruya. Una vez que el objeto es destruido, su hash puede ser reutilizado para otros objetos.

Tengo una clase de objeto base con un __toStringmétodo predeterminado para llamar md5(spl_object_hash($this))para que la salida sea claramente única, ya que la salida de spl_object_hash puede ser muy similar entre los objetos.

Esto es particularmente útil para el código de depuración donde una variable se inicializa como un Objeto y más tarde en el código se sospecha que ha cambiado a un Objeto diferente. Simplemente haciendo eco de las variables en el registro puede revelar el cambio desde el hash del objeto (o no).

pobre
fuente
6

Algunos, si no todos, los métodos en las respuestas anteriores fallan cuando la variable de cadena deseada tiene un cero inicial , por ejemplo, 077543 .

Un intento de convertir dicha variable no puede obtener la cadena deseada, porque la variable se convierte a base 8 (octal) .

Todo esto hará que $strtenga un valor de 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
usuario1587439
fuente
1
¡Esto es PICNIC (problema en la silla, no en la computadora) ya que aquí nada falla ! print 077543;salidas 32611, por lo que este es el valor de cadena correcto de $no. Nadie espera que (string)+1devuelva la cadena +1(devuelve correctamente 1) ni que $no = 1+1; print (string)$no;salga 1+1. Notas: (1) Lo mismo para hex ( $no=0xff;) también. (2) Puede recuperar el valor octal con '0'.decoct($no);(3) $no="077543";mantiene el 0inicio, "077543" + 1` da 77544mientras 077543+1(correctamente) da 32612. (PD: no se ha rechazado, ya que este error es común)
Tino
4

Creo que esta pregunta es un poco engañosa ya que toString () en Java no es solo una forma de transmitir algo a una cadena. Eso es lo que hace la conversión a través de (string) o String.valueOf (), y también funciona en PHP.

// Java
String myText = (string) myVar;

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

Tenga en cuenta que esto puede ser problemático ya que Java es de tipo seguro ( consulte aquí para obtener más detalles ).

Pero como dije, esto es casting y, por lo tanto, no es el equivalente de toString () de Java.

toString en Java no solo convierte un objeto en una cadena. En su lugar, le dará la representación de cadena . Y eso es lo que hace __toString () en PHP.

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

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

Y desde el otro lado:

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

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

¿Qué quiero decir con "dar la representación de cadena"? Imagine una clase para una biblioteca con millones de libros.

  • Convertir esa clase en una Cadena convertiría (por defecto) los datos, aquí todos los libros, en una cadena, por lo que la Cadena sería muy larga y la mayoría de las veces tampoco sería muy útil.
  • To String en su lugar le dará la representación de String, es decir, solo el nombre de la biblioteca. Esto es más corto y, por lo tanto, le brinda menos, pero más información importante.

Ambos son enfoques válidos pero con objetivos muy diferentes, ninguno de los dos es una solución perfecta para cada caso y debe elegir sabiamente cuál se adapta mejor a sus necesidades.

Claro, hay aún más opciones:

$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

Todos estos métodos devolverán una Cadena, algunos de ellos usando __toString internamente y otros fallarán en Objetos. Consulte la documentación de PHP para obtener más detalles.

Xanlantos
fuente
3

La documentación dice que también puedes hacer:

$str = "$foo";

Es lo mismo que el elenco, pero creo que se ve más bonito.

Fuente:

DarthKotik
fuente
1

Las comillas dobles también deberían funcionar ... debería crear una cadena, luego debería APENDER / INSERTAR el valor de CADENA de $ myVar entre 2 cadenas vacías.

Flak DiNenno
fuente
1

Siempre puede crear un método llamado .ToString ($ in) que devuelve

$in . '';  
Joel Coehoorn
fuente
1

Si está convirtiendo algo que no sean tipos simples como enteros o booleanos, necesitaría escribir su propia función / método para el tipo que está tratando de convertir, de lo contrario, PHP simplemente imprimirá el tipo (como array, GoogleSniffer o bidet).

Brian Warshaw
fuente
1

PHP se escribe dinámicamente, por lo que, como dijo Chris Fournier, "si lo usa como una cadena, se convierte en una cadena". Si está buscando más control sobre el formato de la cadena, printf es su respuesta.

Allain Lalonde
fuente
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
fuente
Votados, ya que realmente no tengo idea de lo que quieres decirnos. Usar strval()cuerdas es solo una completa pérdida de tiempo.
Tino
amigo, la cosa es suponer que recibiste un valor de cadena = cuando se repite será "la cadena". Pero, cuando desea mostrar eso en javascript, debe hacerlo 'stringx' '
Daniel Adenew
Esto es extremadamente peligroso (por no decir: simplemente incorrecto). ¡Eche un vistazo a stackoverflow.com/q/168214 o stackoverflow.com/q/23740548 para comprender cómo pasar de forma segura algo de PHP a JS! (Perdón por ser un poco fuera de tema: pasar una var PHP a JS no era parte de la pregunta).
Tino
0

Para los objetos, es posible que no pueda utilizar el operador de lanzamiento. En cambio, uso el json_encode()método.

Por ejemplo, lo siguiente generará contenido en el registro de errores:

error_log(json_encode($args));
Arquímedes Trajano
fuente
0

Pruebe este enfoque poco extraño pero funcional para convertir la parte textual de stdClass en tipo de cadena:

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

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

Yo uso variableToString . Maneja todos los tipos de PHP y es flexible (puede extenderlo si lo desea).

abadejo
fuente