Équivalent PHP de toString () de .NET / Java

556

Comment convertir la valeur d'une variable PHP en chaîne?

Je cherchais quelque chose de mieux que de concaténer avec une chaîne vide:

$myText = $myVar . '';

Comme la ToString()méthode en Java ou .NET.

Antoine Aubry
la source
6
Cela semble être la bonne réponse: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234
J'utiliserais json_encode($myText). J'ai trouvé que les solutions suggérées print_ret (string)varfonctionnent bien pour les valeurs scalaires et des objets simples. Pour les variables, classes ou objets complexes, si un complet __toString()n'est pas défini, je préfère ce qui précède json_encode.
Eric Kigathi

Réponses:

791

Vous pouvez utiliser les opérateurs de casting :

$myText = (string)$myVar;

Il y a plus de détails pour la conversion et la conversion de chaînes dans la section Chaînes du manuel PHP, y compris la gestion spéciale pour les booléens et les null.

Tom Mayfield
la source
11
Object of class Foo could not be converted to string. Existe-t-il une solution générale qui peut convertir n'importe quoi (tableaux + objets + quoi que ce soit) en chaîne?
ripper234
2
Remarque: cela donnera un avis PHP lorsqu'il est utilisé sur des tableaux.
dave1010
29
@MarkAmery Il a donné une réponse qui appelle implicitement la __toString()"méthode magique", mais ne l'a pas du tout mentionnée. L'utilisateur a demandé une réponse similaire à la toString()méthode Java , et en PHP, c'est la __toString()fonction.
Supuhstar
2
@Supuhstar Ah oui, je comprends enfin d'où tu viens. Désolé si j'étais obtus avant. Je suis d'accord pour dire qu'il s'agit d'un détail pertinent et qu'il serait utile de l'ajouter, en séparant peut-être la réponse en sections «Conversion de primitives» et «Conversion d'objets» avec des en-têtes.
Mark Amery
309

Cela se fait avec le transtypage:

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

Dans une classe, vous pouvez définir ce qui est produit en utilisant la méthode magique __toString. Un exemple est ci-dessous:

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"

Quelques autres exemples de casting de type:

$i = 1;

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

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

// string "1"
var_dump((string) 1);
Ross
la source
126

Utilisez print_r :

$myText = print_r($myVar,true);

Vous pouvez également l'utiliser comme:

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

Cela prendra $myTextune chaîne, comme:

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

Utilisez var_export pour obtenir un peu plus d'informations (avec les types de variables, ...):

$myText = var_export($myVar,true);
Cédric
la source
1
"lorsque le paramètre de retour est TRUE, [print_r] renverra une chaîne." Comme print_r est un bon moyen d'imprimer des objets, des tableaux (et aussi des nombres / chaînes), c'est un bon moyen de transformer un objet en une chaîne lisible par l'homme.
Cedric
1
Pour les nouveaux arrivants pour info, la truepièce est indispensable! J'ai essayé plusieurs méthodes de conversion de chaînes, y compris print_ret j'ai été déçu de toutes, puis j'ai découvert le trueparamètre (lire la documentation pour savoir pourquoi cela fonctionne).
ripper234
57

Vous pouvez soit utiliser le transtypage:

$var = (string)$varname;

ou StringValue:

$var = strval($varname);

ou SetType:

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

Ils travaillent tous pour la même chose en termes de jonglage de type.

Joel Larson
la source
strval ($ varname) fait l'affaire pour moi, surtout lorsque la valeur est renvoyée en tant que type "variant" et doit être convertie en chaîne ou en entier.
Milan
strval()est ce que je cherchais parce que je voulais l'utiliser avec array_walk. Par exemple$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
Buttle Butkus
33

Comment convertir la valeur d'une variable PHP en chaîne?

Une valeur peut être convertie en chaîne à l'aide de la conversion (chaîne) ou de la fonction strval () . (Edit: Comme Thomas l'a également déclaré).

Il doit également être automatiquement casté pour vous lorsque vous l'utilisez comme chaîne.

Chris
la source
28

Vous recherchez strval :

string strval ( mixed $var )

Obtenez la valeur de chaîne d'une variable. Consultez la documentation sur la chaîne pour plus d'informations sur la conversion en chaîne.

Cette fonction n'effectue aucun formatage sur la valeur retournée. Si vous cherchez un moyen de formater une valeur numérique sous forme de chaîne, veuillez consulter sprintf () ou number_format ().

opensas
la source
3
C'est en fait très utile car je voulais convertir tous les nombres en chaînes sans utiliser de rappel personnalisé. $strings = array_map('strval', $my_numbers);
peterchaula
C'est la seule réponse qui fonctionne avec les array_mapchaînes callables en général.
Danon
18

Pour les primitives, utilisez (string)$varou imprimez immédiatement cette variable. PHP est un langage typé dynamiquement et la variable sera convertie en chaîne à la volée.

Si vous souhaitez convertir des objets en chaînes, vous devrez définir une __toString()méthode qui renvoie une chaîne. Cette méthode est interdite de lever des exceptions.

Michał Rudnicki
la source
15

Le mettre entre guillemets devrait fonctionner:

$myText = "$myVar";
Mark Biek
la source
Cela fonctionne, mais je ne sais pas si c'est la façon standard de le faire en PHP.
Antoine Aubry
C'est une façon très standard de le faire en bash
Yauhen Yakimovich
Cette méthode fonctionnera si $ myVar est un objet de classe de type __toString ou scalaire. Dans d'autres cas, générez une erreur.
zennin
11

Je pense qu'il vaut la peine de mentionner que vous pouvez attraper n'importe quelle sortie (comme print_r, var_dump) dans une variable en utilisant la mise en mémoire tampon de sortie:

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

Merci à: Comment puis-je capturer le résultat de var_dump dans une chaîne?

Daan
la source
1
il convient de mentionner que vous n'avez pas besoin de cela avec print_r . Utilisez simplement le remplacement pour revenir en tant que chaîne.
ars265
1
Une meilleure façon serait d'utiliser $result = var_export($someVar, true)sans ob.
Danon
8

Une autre option consiste à utiliser la fonction settype intégrée:

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

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

Cela effectue en fait une conversion sur la variable contrairement au transtypage et vous permet d'avoir une manière générale de convertir en plusieurs types.

Justin Weeks
la source
8

En plus de la réponse donnée par Thomas G. Mayfield:

Si vous suivez le lien vers le manuel de coulée de cordes, il y a un cas spécial qui est assez important à comprendre:

(string) cast est préférable surtout si votre variable $ a est un objet, car PHP suivra le protocole de casting selon son modèle objet en appelant la méthode magique __toString () (si celle-ci est définie dans la classe dont $ a est instanciée à partir de ).

PHP fait quelque chose de similaire à

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

L' opération de conversion (chaîne) est une technique recommandée pour la programmation PHP5 +, ce qui rend le code plus orienté objet. IMO c'est un bel exemple de similitude de conception (différence) avec d'autres langages OOP comme Java / C # / etc., C'est-à-dire à sa manière PHP (à chaque fois pour le bien ou pour le prix).

Yauhen Yakimovich
la source
8

Comme d'autres l'ont mentionné, les objets ont besoin d'une __toStringméthode pour être convertis en chaîne. Un objet qui ne définit pas cette méthode peut toujours produire une représentation sous forme de chaîne à l'aide de la fonction spl_object_hash .

Cette fonction renvoie un identifiant unique pour l'objet. Cet identifiant peut être utilisé comme clé de hachage pour stocker des objets ou pour identifier un objet, tant que l'objet n'est pas détruit. Une fois l'objet détruit, son hachage peut être réutilisé pour d'autres objets.

J'ai une classe Object de base avec une __toStringméthode qui appelle md5(spl_object_hash($this))par défaut pour rendre la sortie clairement unique, car la sortie de spl_object_hash peut être très similaire entre les objets.

Cela est particulièrement utile pour le débogage de code où une variable s'initialise en tant qu'objet et plus tard dans le code, elle est soupçonnée d'avoir changé en un objet différent. Le simple écho des variables dans le journal peut révéler le changement par rapport au hachage d'objet (ou non).

jimp
la source
6

Certaines, sinon toutes, les méthodes des réponses précédentes échouent lorsque la variable de chaîne voulue a un zéro non significatif , par exemple, 077543 .

Une tentative de conversion d'une telle variable n'obtient pas la chaîne voulue, car la variable est convertie en base 8 (octal) .

Tout cela aura $strune valeur de 32611 :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");
user1587439
la source
1
C'est PICNIC (problème sur chaise, pas sur ordinateur) car rien ne manque ici ! print 077543;sorties 32611, c'est donc la valeur de chaîne correcte de $no. Personne ne s'attend à ce que (string)+1renvoie la chaîne +1(elle renvoie correctement 1) ni à ce qui $no = 1+1; print (string)$no;s'affiche 1+1. Remarques: (1) Idem pour hex ( $no=0xff;) également. (2) Vous pouvez récupérer la valeur octale avec '0'.decoct($no);(3) $no="077543";conserve le 0début, "077543" + 1` donne 77544alors que 077543+1(correctement) donne 32612. (PS: pas de vote négatif, car cette erreur est courante)
Tino
4

Je pense que cette question est un peu trompeuse car, toString () en Java n'est pas seulement un moyen de lancer quelque chose sur une chaîne. C'est ce que fait le cast via (string) ou String.valueOf (), et cela fonctionne aussi bien en PHP.

// Java
String myText = (string) myVar;

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

Notez que cela peut être problématique car Java est de type sécurisé ( voir ici pour plus de détails ).

Mais comme je l'ai dit, c'est du casting et donc pas l'équivalent de toString () de Java.

toString en Java ne transforme pas simplement un objet en chaîne. Il vous donnera à la place la représentation String . Et c'est ce que fait __toString () en PHP.

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

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

Et de l'autre côté:

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

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

Qu'est-ce que je veux dire par "donner la représentation de la chaîne"? Imaginez une classe pour une bibliothèque avec des millions de livres.

  • Transformer cette classe en une chaîne convertirait (par défaut) les données, ici tous les livres, en une chaîne, de sorte que la chaîne serait très longue et la plupart du temps pas très utile non plus.
  • À la place, vous obtiendrez la représentation String, c'est-à-dire uniquement le nom de la bibliothèque. C'est plus court et vous donne donc moins d'informations, mais plus importantes.

Ce sont deux approches valides mais avec des objectifs très différents, aucune n'est une solution parfaite pour chaque cas et vous devez choisir judicieusement ce qui convient le mieux à vos besoins.

Bien sûr, il y a encore plus d'options:

$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

Toutes ces méthodes renverront une chaîne, certaines utilisant __toString en interne et d'autres échouant sur les objets. Jetez un œil à la documentation PHP pour plus de détails.

Xanlantos
la source
3

La documentation indique que vous pouvez également faire:

$str = "$foo";

C'est la même chose que le casting, mais je pense que cela semble plus joli.

La source:

DarthKotik
la source
1

Les guillemets doubles devraient également fonctionner ... cela devrait créer une chaîne, puis il devrait AJOUTER / INSÉRER la valeur de CHAINE castée de $ myVar entre 2 chaînes vides.

Flak DiNenno
la source
1

Vous pouvez toujours créer une méthode nommée .ToString ($ in) qui renvoie

$in . '';  
Joel Coehoorn
la source
1

Si vous convertissez autre chose que des types simples comme des entiers ou des booléens, vous devrez écrire votre propre fonction / méthode pour le type que vous essayez de convertir, sinon PHP affichera simplement le type (tel que tableau, GoogleSniffer ou Bidet).

Brian Warshaw
la source
1

PHP est typé dynamiquement, comme l'a dit Chris Fournier, "Si vous l'utilisez comme une chaîne, il devient une chaîne". Si vous cherchez plus de contrôle sur le format de la chaîne, alors printf est votre réponse.

Allain Lalonde
la source
1

Vous pouvez également utiliser la fonction PHP var_export .

Aby W
la source
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
la source
Voté, car je n'ai vraiment aucune idée de ce que vous voulez nous dire. L'utilisation strval()de chaînes n'est qu'une perte de temps complète.
Tino
mec, la chose est de supposer que vous avez reçu une valeur de chaîne = lorsque son repersente ce sera "la chaîne". Mais, lorsque vous vouliez afficher cela en javascript, vous devez le rendre 'stringx' '
Daniel Adenew
C'est extrêmement dangereux (pour ne pas dire: tout simplement faux). Veuillez jeter un œil à stackoverflow.com/q/168214 ou stackoverflow.com/q/23740548 pour comprendre comment passer en toute sécurité quelque chose de PHP à JS! (Désolé d'être un peu hors sujet: passer une var PHP à JS ne faisait pas partie de la question.)
Tino
0

Pour les objets, vous ne pourrez peut-être pas utiliser l'opérateur de transtypage. Au lieu de cela, j'utilise la json_encode()méthode.

Par exemple, les éléments suivants afficheront le contenu dans le journal des erreurs:

error_log(json_encode($args));
Archimedes Trajano
la source
0

Essayez cette petite approche étrange, mais qui fonctionne, pour convertir la partie textuelle de stdClass en type chaîne:

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

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

J'utilise variableToString . Il gère tous les types PHP et est flexible (vous pouvez l'étendre si vous le souhaitez).

lingue
la source