Equivalente em PHP a toString () do .NET / Java

556

Como faço para converter o valor de uma variável PHP em string?

Eu estava procurando algo melhor do que concatenar com uma string vazia:

$myText = $myVar . '';

Como o ToString()método em Java ou .NET.

Antoine Aubry
fonte
6
Esta parece ser a resposta correta: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234
Eu usaria json_encode($myText). Descobri que as soluções sugeridas print_re (string)vartrabalho bem para valores escalares e objetos simples. Para variáveis ​​complexas, classes ou objetos, se um completo __toString()não estiver definido, prefiro o mencionado acima json_encode.
Eric Kigathi 12/01/19

Respostas:

791

Você pode usar os operadores de transmissão :

$myText = (string)$myVar;

Há mais detalhes sobre conversão e conversão de strings na seção Strings do manual do PHP, incluindo tratamento especial para booleanos e nulos.

Tom Mayfield
fonte
11
Object of class Foo could not be converted to string. Existe uma solução geral que pode converter qualquer coisa (matrizes + objetos + o que for) em uma string?
precisa saber é o seguinte
2
Nota: isso dará um aviso ao PHP quando usado em matrizes.
dave1010
29
@MarkAmery Ele deu uma resposta que chama implicitamente o __toString()"Método Mágico", mas não mencionou isso. O usuário pediu uma resposta semelhante ao toString()método Java e, em PHP, essa é a __toString()função.
Supuhstar
2
@ Supuhstar Ah, certo, finalmente entendo de onde você vem. Desculpe se eu estava sendo obtuso antes. Concordo que esse é um detalhe relevante e seria valioso adicioná-lo, talvez separando a resposta nas seções 'Convertendo Primitivos' e 'Convertendo Objetos' com cabeçalhos.
Mark Amery
309

Isso é feito com a 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

Em uma classe, você pode definir o que é produzido usando o método mágico __toString. Um exemplo está abaixo:

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"

Mais alguns exemplos de conversão de tipos:

$i = 1;

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

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

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

Use print_r :

$myText = print_r($myVar,true);

Você também pode usá-lo como:

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

Isso será definido $myTextcomo uma sequência, como:

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

Use var_export para obter um pouco mais de informações (com tipos de variáveis, ...):

$myText = var_export($myVar,true);
Cedric
fonte
1
"quando o parâmetro de retorno é TRUE, [print_r] retornará uma string." Como print_r é uma boa maneira de imprimir objetos, matrizes (e também números / strings), é uma boa maneira de transformar um objeto em uma string legível por humanos.
Cedric
1
FYI, recém-chegados, a trueparte é essencial! Eu tentei vários métodos de conversão de strings, incluindo print_re fiquei desapontado com todos eles, e então descobri o trueparâmetro (leia a documentação para saber por que ele funciona).
precisa saber é o seguinte
57

Você pode usar a conversão de texto:

$var = (string)$varname;

ou StringValue:

$var = strval($varname);

ou SetType:

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

Todos eles trabalham para a mesma coisa em termos de malabarismo de tipos.

Joel Larson
fonte
strval ($ varname) faz o truque para mim, especialmente quando o valor é retornado como o tipo "variant" e precisa ser convertido em string ou int.
Milão
strval()era para isso que eu estava procurando, porque queria usá-lo array_walk. Por exemplo$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus
33

Como faço para converter o valor de uma variável PHP em string?

Um valor pode ser convertido em uma string usando a conversão (string) ou a função strval () . (Editar: Como Thomas também afirmou).

Também deve ser convertido automaticamente para você quando você o usa como uma string.

Chris
fonte
28

Você está procurando strval :

string strval ( mixed $var )

Obtenha o valor da sequência de uma variável. Consulte a documentação sobre string para obter mais informações sobre a conversão em string.

Esta função não executa formatação no valor retornado. Se você estiver procurando uma maneira de formatar um valor numérico como uma string, consulte sprintf () ou number_format ().

opensas
fonte
3
Isso é realmente muito útil, porque eu queria converter todos os números em seqüências de caracteres sem usar um retorno de chamada personalizado. $strings = array_map('strval', $my_numbers);
precisa saber é o seguinte
Esta é a única resposta que funciona com array_mape chamando chamadas em geral.
Danon
18

Para primitivos, use (string)$varou imprima essa variável imediatamente. O PHP é uma linguagem de tipo dinâmico e a variável será convertida para string em tempo real.

Se você deseja converter objetos em cadeias, precisará definir o __toString()método que retorna a cadeia. Este método é proibido de lançar exceções.

Michał Rudnicki
fonte
15

Colocá-lo entre aspas duplas deve funcionar:

$myText = "$myVar";
Mark Biek
fonte
Isso funciona, mas não sei se é a maneira padrão de fazê-lo em PHP.
Antoine Aubry
É uma maneira muito padrão de fazê-lo em festa
Yauhen Yakimovich
Este método funcionará se $ myVar for um objeto de classe com __toString ou tipo escalar. Em outros casos, gere um erro.
Zennin
11

Eu acho que vale a pena mencionar que você pode pegar qualquer saída (como print_r, var_dump) em uma variável usando o buffer de saída:

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

Graças a: Como capturar o resultado de var_dump em uma string?

Daan
fonte
1
vale ressaltar que você não precisa disso com o print_r . Basta usar a substituição para retornar como uma sequência.
precisa
1
Uma maneira melhor seria usar $result = var_export($someVar, true)sem ob.
Danon
8

Outra opção é usar a função 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)
?>

Na verdade, isso efetua uma conversão na variável, diferentemente da transmissão de texto, e permite que você tenha uma maneira geral de converter em vários tipos.

Justin Weeks
fonte
8

Além da resposta dada por Thomas G. Mayfield:

Se você seguir o link do manual de fundição de cordas, há um caso especial que é muito importante para entender:

(string) cast é preferível, especialmente se sua variável $ a for um objeto, porque o PHP seguirá o protocolo de conversão de acordo com seu modelo de objeto chamando o método mágico __toString () (se for definido na classe da qual $ a é instanciado )

PHP faz algo semelhante a

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

A operação de conversão de caracteres (string) é uma técnica recomendada para a programação PHP5 +, tornando o código mais orientado a objetos. Na IMO, este é um bom exemplo de semelhança (diferença) de design com outras linguagens OOP, como Java / C # / etc., Ou seja, à sua maneira especial de PHP (sempre que for para o bem ou para o valor).

Yauhen Yakimovich
fonte
8

Como outros já mencionaram, os objetos precisam de um __toStringmétodo para serem convertidos em uma string. Um objeto que não define esse método ainda pode produzir uma representação de sequência usando a função spl_object_hash .

Esta função retorna um identificador exclusivo para o objeto. Esse ID pode ser usado como uma chave de hash para armazenar objetos ou para identificar um objeto, desde que o objeto não seja destruído. Depois que o objeto é destruído, seu hash pode ser reutilizado para outros objetos.

Eu tenho uma classe Object básica com um __toStringmétodo que chama como padrão para md5(spl_object_hash($this))tornar a saída claramente única, pois a saída de spl_object_hash pode parecer muito semelhante entre os objetos.

Isso é particularmente útil para depurar código em que uma variável é inicializada como um Objeto e, posteriormente, no código, suspeita-se que ela tenha sido alterada para um Objeto diferente. Simplesmente ecoar as variáveis ​​no log pode revelar a alteração do hash do objeto (ou não).

jimp
fonte
6

Alguns, se não todos, os métodos nas respostas anteriores falham quando a variável de cadeia pretendida possui um zero à esquerda , por exemplo, 077543 .

Uma tentativa de converter essa variável falha ao obter a sequência pretendida, porque a variável é convertida na base 8 (octal) .

Tudo isso fará com $strque o valor 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
user1587439
fonte
1
Este é o PICNIC (problema na cadeira, não no computador), pois nada falha aqui ! print 077543;saídas 32611, portanto, este é o valor correto da sequência de $no. Ninguém espera que (string)+1retorne a string +1(ela retorna corretamente 1) nem que $no = 1+1; print (string)$no;produza 1+1. Notas: (1) O mesmo para hex ( $no=0xff;) também. (2) Você pode recuperar o valor octal com '0'.decoct($no);(3) $no="077543";mantém a liderança 0, "077543" + 1` dá 77544enquanto 077543+1(corretamente) dá 32612. (PS: não downvoted, pois isso err é comum)
Tino
4

Eu acho que essa pergunta é um pouco enganadora, pois toString () em Java não é apenas uma maneira de converter algo em uma String. É isso que a conversão via (string) ou String.valueOf () faz, e também funciona no PHP.

// Java
String myText = (string) myVar;

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

Observe que isso pode ser problemático, pois o Java é do tipo seguro ( veja aqui para mais detalhes ).

Mas, como eu disse, isso está lançando e, portanto, não é o equivalente ao toString () do Java.

toString em Java não apenas converte um objeto em uma String. Em vez disso, fornecerá a representação String . E é isso que __toString () no PHP faz.

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

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

E do outro lado:

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

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

O que quero dizer com "fornecendo a representação String"? Imagine uma aula para uma biblioteca com milhões de livros.

  • A conversão dessa classe para uma String (por padrão) converterá os dados, aqui todos os livros, em uma string, para que a String seja muito longa e na maioria das vezes também não seja muito útil.
  • Para String, em vez disso, você terá a representação de String, ou seja, apenas o nome da biblioteca. Isso é mais curto e, portanto, fornece menos, mas informações mais importantes.

Ambas são abordagens válidas, mas com objetivos muito diferentes, nem é uma solução perfeita para todos os casos e você deve escolher sabiamente o que melhor se adapta às suas necessidades.

Claro, existem ainda mais opções:

$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 esses métodos retornarão uma String, alguns deles usando __toString internamente e outros falharão em Objetos. Veja a documentação do PHP para mais detalhes.

Xanlantos
fonte
3

A documentação diz que você também pode:

$str = "$foo";

É o mesmo que o elenco, mas acho que parece mais bonito.

Fonte:

DarthKotik
fonte
1

As aspas duplas também devem funcionar ... ele deve criar uma string e APPEND / INSERT o valor STRING convertido de $ myVar entre 2 strings vazias.

Flak DiNenno
fonte
1

Você sempre pode criar um método chamado .ToString ($ in) que retorne

$in . '';  
Joel Coehoorn
fonte
1

Se você estiver convertendo algo diferente de tipos simples, como números inteiros ou booleanos, precisará escrever sua própria função / método para o tipo que está tentando converter; caso contrário, o PHP imprimirá apenas o tipo (como array, GoogleSniffer ou Bidê).

Brian Warshaw
fonte
1

O PHP é digitado dinamicamente, assim como Chris Fournier disse: "Se você usá-lo como uma string, ela se torna uma string". Se você está procurando mais controle sobre o formato da string, printf é a sua resposta.

Allain Lalonde
fonte
1

Você também pode usar a função PHP var_export .

Aby W
fonte
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
fonte
Voto negativo, como eu realmente não tenho ideia do que você quer nos dizer. Usar strval()cordas é apenas uma completa perda de tempo.
Tino
cara, a coisa é supor que você tenha recebido um valor de string = quando for repetido, será "a string". Mas, quando você queria exibi-lo em javascript, precisava torná-lo 'stringx' ''
Daniel Adenew
Isso é extremamente perigoso (para não dizer: errado). Consulte stackoverflow.com/q/168214 ou stackoverflow.com/q/23740548 para entender como passar com segurança algo de PHP para JS! (Desculpe por ser um pouco fora de tópico: passar um var PHP para JS não fazia parte da pergunta.)
Tino
0

Para objetos, talvez você não consiga usar o operador de conversão. Em vez disso, eu uso o json_encode()método

Por exemplo, o seguinte produzirá conteúdo para o log de erros:

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

Tente esta abordagem um pouco estranha, mas funcional, para converter a parte textual de stdClass em tipo de string:

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

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

Eu uso variableToString . Ele lida com todos os tipos de PHP e é flexível (você pode estendê-lo, se quiser).

ling
fonte