2010-12-28 7 views
2

あなたはこのような何かを行うことができますしながら、私は何を意味することは、次のとおりです。オブジェクト変数が文字列で使用されている場合、なぜ "深い"オブジェクト変数にアクセスできないのですか?

$foo = "Yo dawg I herd you like $bar->baz"; 

この:次のエラーで

$foo = "Yo dawg I herd you like $bar->baz->qux"; 

結果:

"Object of class * could not be converted to string" 

その周りにクリーンな方法はそう

$baz = $bar->baz; 

$foo = "Yo dawg I herd you like $baz->qux"; 

なぜそれが機能しないのですが、より良い解決策がありますか?

NOTICE:

私は何人かの人々が彼らの文字列の外で変数を持っていることを好むが、これは、このような好みについて話をする場ではないと私は場合、私は感謝しますので、求めている問題に対処していません知っていますあなたはそのような主観的な感情を残しています。ありがとうございました。

+0

はいこれは、インスタンスの変数変数を使用する場合にも当てはまります: '$ inst1 - > $ inst2-> attribute'は動作しませんが、' $ i2_att = $ inst2->属性; $ inst1 - > $ i2_att;はうまく動作します – de3

答えて

13

単純な補間(http://php.net/manual/en/language.types.string.php - 「可変解析」の節の説明を参照)は、組み込みの「変数、配列値、またはオブジェクトプロパティーを文字列で補間する」ために設計されているためです。

"オブジェクトのプロパティ"を補間するように設計されていて、 "任意の式"ではありません。後者を実行するには、パーサは文字列を解析するときにはるかに多くの作業を行う必要があります。

任意の式の場合、上記の式を中括弧で囲むことで、PHP4で導入された複雑な(中括弧)構文を使用する必要があります。{$bar->baz->qux}

+1

なぜdownvote? – DVK

+4

真実を扱うことができない人もいるので – gillytech

5
$foo = "Yo dawg I herd you like {$bar->baz->qux}"; 

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

私はあなたを与えることができる理由のみは、設計者はこのようにそれを実装することを選んだということです。たとえば、関数の戻り値を中括弧に含めることはできません。これは単なる設計上の選択です。

+0

なぜかっこが必要なのは不思議です。また、私はこれが何で呼ばれているのかも分からないので、どこにドキュメントがあるかわからない。あなたがリンクを提供することができれば(またはこの答えでそれを引用する)それは良いだろう。ありがとう! –

+0

@Fake - ドキュメントのリンクと "理由"の両方の回答を参照してください – DVK

+0

私はドキュメントへのリンクを追加しました。 – webbiedave

関連する問題