.NET / JavaのtoString()に相当するPHP


556

PHP変数の値を文字列に変換するにはどうすればよいですか?

空の文字列と連結するよりも良いものを探していました:

$myText = $myVar . '';

ToString()Javaや.NETのメソッドと同じです。


6
これは正解のようです:stackoverflow.com/a/3559247/11236print_r(foo, true))!
ripper234 2013年

使用しますjson_encode($myText)。私は解決策を示唆していることがわかりましたprint_rし、(string)varスカラー値と単純なオブジェクトのためによく仕事を。完全な変数__toString()が定義されていない場合、複雑な変数、クラス、またはオブジェクトについては、前述のを優先しjson_encodeます。
Eric Kigathi

回答:


791

キャスト演算子を使用できます。

$myText = (string)$myVar;

PHPマニュアルの「文字列」セクションには、ブール値とnullの特別な処理を含む、文字列のキャストと変換の詳細があります。


11
Object of class Foo could not be converted to string。何か(配列+オブジェクト+何でも)を文字列に変換できる一般的なソリューションはありますか?
ripper234 2013年


2
注:これを配列で使用すると、PHPの通知が表示されます。
dave1010 2013

29
@MarkAmery彼は暗黙的に__toString()「魔法の方法」と呼ぶ答えを出しましたが、それについてはまったく触れませんでした。ユーザーはJava toString()メソッドのような答えを求め、PHPではそれが__toString()関数です。
Supuhstar 2013

2
@Supuhstarああそうだね、ようやくあなたがどこから来たのか理解した。以前に鈍感だった場合は申し訳ありません。これは関連する詳細であり、おそらく回答をヘッダー付きの「変換プリミティブ」セクションと「変換オブジェクト」セクションに分けて追加することは価値があることに同意します。
Mark Amery 2013

309

これは型キャストで行われます:

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

クラスでは、魔法の方法を使用して、何を出力するかを定義できます__toString。以下に例を示します。

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"

さらにいくつかの型キャストの例:

$i = 1;

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

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

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

126

print_rを使用します。

$myText = print_r($myVar,true);

次のように使用することもできます。

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

これは次の$myTextような文字列に設定されます:

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

var_exportを使用して、もう少し情報を取得します(変数のタイプなど...):

$myText = var_export($myVar,true);

1
「戻りパラメータがTRUEの場合、[print_r]は文字列を返します。」print_rはオブジェクト、配列(および数値/文字列)を印刷するための優れた方法であるため、オブジェクトを人間が読める文字列に変換するための良い方法です。
セドリック

1
FYI初心者、そのtrue部分は不可欠です!文字列変換を含むいくつかの方法を試してみprint_rましたが、それらすべてに失望しました。その後、trueパラメーターを発見しました(なぜ動作するかについてのドキュメントを読んでください)。
ripper234 2013年

57

型キャストを使用できます。

$var = (string)$varname;

またはStringValue:

$var = strval($varname);

またはSetType:

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

タイプジャグリングに関しては、すべて同じことで機能します。


strval($ varname)は、特に値が「バリアント」型として返され、文字列またはintに変換する必要がある場合に、私にとってトリックを実行します。
ミラノ

strval()で使用したかったので、私が探していたものarray_walkです。例$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
バトルブトクス14

33

PHP変数の値を文字列に変換するにはどうすればよいですか?

(string)キャストまたはstrval()関数を使用して、値を文字列に変換できます。(編集:トーマスも述べたように)。

また、文字列として使用すると、自動的にキャストされます。


28

strvalを探しています

string strval ( mixed $var )

変数の文字列値を取得します。文字列への変換の詳細については、文字列に関するドキュメントを参照してください。

この関数は、戻り値に対してフォーマットを実行しません。数値を文字列としてフォーマットする方法を探している場合は、sprintf()またはnumber_format()を参照してください。


3
カスタムコールバックを使用せずにすべての数値を文字列に変換したかったので、これは実際に非常に役立ちます。$strings = array_map('strval', $my_numbers);
peterchaula 2017年

これは、array_map一般的に文字列呼び出し可能オブジェクトで機能する唯一の答えです。
Danon

18

プリミティブの場合は(string)$var、この変数をすぐに使用または印刷します。PHPは動的に型付けされる言語であり、変数はその場で文字列にキャストされます。

オブジェクトを文字列に変換する場合__toString()は、文字列を返すメソッドを定義する必要があります。このメソッドは例外のスローを禁止されています。


15

二重引用符で囲むとうまくいくはずです。

$myText = "$myVar";

これは機能しますが、PHPで標準的な方法であるかどうかはわかりません。
Antoine Aubry

これはbash
Yauhen Yakimovich 2013年

このメソッドは、$ myVarが__toStringまたはスカラー型のクラスのオブジェクトである場合に機能します。その他の場合はエラーを生成します。
zennin

11

出力バッファリングを使用することで、変数内の任意の出力(print_r、などvar_dump)をキャッチできることに言及する価値があると思います。

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

おかげで: var_dumpの結果を文字列にキャプチャするにはどうすればよいですか?


1
print_rでそれが必要ないことは言及する価値があります。オーバーライドを使用して文字列として返すだけです。
ars265 2014年

1
より良い方法は、$result = var_export($someVar, true)obなしで使用することです。
Danon

8

もう1つのオプションは、組み込みのsettype関数を使用することです。

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

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

これは、型キャストとは異なり、実際には変数の変換を実行し、複数の型に変換する一般的な方法を持つことができます。


8

トーマスG.メイフィールドの回答に加えて、

文字列キャストマニュアルへのリンクをたどると、理解することが非常に重要である特別なケースがあります。

(文字列)キャストは、変数$ aがオブジェクトの場合に特に推奨されます。PHPは、__ toString()マジックメソッドを呼び出すことにより、そのオブジェクトモデルに従ってキャストプロトコルに従います $ aがインスタンス化されるクラスで定義されている場合)。

PHPは次のよ​​うなことをします

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

(文字列)操作をキャストは、コードよりオブジェクト指向プログラミング製造PHP5 +の推奨技術です。IMOこれは、Java / C#/ etcのような他のOOP言語との設計の類似性(違い)の良い例です。つまり、独自の特別なPHPの方法で(価値があるかどうかにかかわらず)。


8

他の人が述べたように、オブジェクトは__toStringメソッドを文字列にキャストする必要があります。そのメソッドを定義していないオブジェクトでも、spl_object_hash関数を使用して文字列表現を生成できます。

この関数は、オブジェクトの一意の識別子を返します。このIDは、オブジェクトが破棄されない限り、オブジェクトを格納したり、オブジェクトを識別したりするためのハッシュキーとして使用できます。オブジェクトが破棄されると、そのハッシュは他のオブジェクトに再利用できます。

spl_object_hashからの出力はオブジェクト間で非常に類似している可能性があるため、出力を明確に一意にするために__toStringデフォルトで呼び出すメソッドを持つ基本Objectクラスがありmd5(spl_object_hash($this))ます。

これは、変数がオブジェクトとして初期化され、後でコード内で別のオブジェクトに変更された疑いがあるコードのデバッグに特に役立ちます。変数をログにエコーするだけで、オブジェクトハッシュからの変更を明らかにできます(またはそうではありません)。


6

意図した文字列変数が077543のように先行ゼロを持つ場合、以前の回答のすべてではないにしてもいくつかのメソッドが失敗します。

このような変数を変換しようとすると、変数が8進数(8進数)に変換されるため、目的の文字列を取得できません。

これらすべての$str値は32611になります。

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

1
ここで何も失敗しないので、これはPICNIC(コンピュータではなく椅子の問題)ですprint 077543;出力な32611ので、これはの正しい文字列値です$no(string)+1文字列を返すとは誰も期待していませ+1ん(正しく返されます)1)ことも$no = 1+1; print (string)$no;出力されるません1+1。注:(1)16進数($no=0xff;)についても同様です。(2)あなたがして8進数を取り戻すことができます'0'.decoct($no);(3)$no="077543";リードを保ち0、「077543」+ 1 'は、与え77544ながら077543+1(正確に)提供します32612。(PS:このエラーは一般的であるため、反対票は投じられません)
Tino

4

JavaのtoString()は何かを文字列にキャストする方法ではないので、この質問は少し誤解を招くと思います。これは、(string)またはString.valueOf()を介したキャストが行うことであり、PHPでも同様に機能します。

// Java
String myText = (string) myVar;

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

Javaはタイプセーフであるため、これは問題になる可能性があることに注意してください(詳細については、こちらを参照してください)。

しかし、すでに述べたように、これはキャストであるため、JavaのtoString()と同等ではありません。

JavaのtoStringは、オブジェクトをStringにキャストするだけではありません。代わりに、文字列表現を提供します。そして、それがPHPの__toString()が行うことです。

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

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

そして反対側から:

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

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

「文字列表現を与える」とはどういう意味ですか?何百万もの本がある図書館のクラスを想像してみてください。

  • そのクラスを文字列にキャストすると、(デフォルトでは)データ(ここではすべての本)が文字列に変換されるため、文字列は非常に長くなり、ほとんどの場合あまり役に立ちません。
  • 代わりに、文字列にすると、文字列表現、つまり、ライブラリの名前のみが提供されます。これは短いため、提供される情報は少なくなりますが、より重要です。

これらはどちらも有効なアプローチですが、目的が大きく異なるため、すべてのケースに最適なソリューションではありません。ニーズに合った方法を賢く選択する必要があります。

もちろん、さらに多くのオプションがあります。

$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

これらのメソッドはすべてStringを返します。一部は内部で__toStringを使用し、一部はObjectで失敗します。詳細については、PHPのドキュメントをご覧ください。


3

ドキュメントには次のこともできると書かれています:

$str = "$foo";

キャストと同じですが、見た目はきれいだと思います。

ソース:


1

二重引用符も機能するはずです...文字列を作成し、2つの空の文字列の間に$ myVarのキャストされたSTRING値を追加/挿入する必要があります。



1

整数やブール値などの単純な型以外のものを変換する場合は、変換しようとしている型に独自の関数/メソッドを記述する必要があります。そうでない場合、PHPは型(配列、GoogleSnifferなど)を出力するだけです。 、またはビデ)。


1

PHPは動的に型付けされるため、Chris Fournierが言ったように、「文字列のように使用すると、文字列になります」。文字列のフォーマットをより詳細に制御したい場合は、printf最適です。



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

あなたが私たちに何を伝えたいのか本当にわからないので、反対票を投じました。strval()文字列での使用は、時間の無駄です。
ティノ

文字通りの値を受け取ったことを前提としています。それが繰り返されると、「文字列」になります。しかし、それをJavaScriptで表示したい場合は、「stringx」にする必要があります
Daniel Adenew

これは非常に危険です(言うまでもありませんが、明らかに間違っています)。PHPからJSに何かを安全に渡す方法を理解するには、stackoverflow.com / q / 168214またはstackoverflow.com/q/23740548をご覧ください。(少し話題から外れて申し訳ありません。JSにPHP変数を渡すことは質問の一部ではありませんでした。)
Tino

0

オブジェクトの場合、キャスト演算子を使用できない場合があります。代わりに、私はjson_encode()メソッドます。

たとえば、以下はエラーログに内容を出力します。

error_log(json_encode($args));

0

stdClassのテキスト部分を文字列型に変換する、少し奇妙ですが機能するアプローチを試してください。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.