2009-07-18 10 views
76

SOの最初の質問です。実際のRTM候補です。しかし、私は見てきたと約束し、それを見つけることができない。私が逃したシンプルなものであることが判明したら、私は喜んで#ヘッドパルムを行います。メンバー変数のPHP中括弧構文

のZend Frameworkを把握しようとすると、次の構文に出くわした:

$this->_session->{'user_id'} 

私は、メンバ変数と思われるものをアクセスするために使用される中括弧構文を見たことがありません。それはどのように

$this->_session->user_id 

とは異なっている私は_SESSIONが無関係であると仮定すると、それはないかもしれませんので、ご質問でそれを含めています。

は複合変数名のuser_idをラップしようとするだけで清潔大会中括弧はありますか?それとも特別なアクセサリーなのですか? TFMに

任意のポインタ私はRはアップ謙虚いただければ幸いできます。

多くのありがとうございます。優しくしてください。

+7

ありがとうございました。 このようにSOに穏やかに着手することで、もっと使いこなすことをお勧めします。うまくいけば、私は質問に答えるのを助けることができます。 乾杯。 –

+1

面白い話題:中文の構文でメソッドを呼び出すことができ、その結果はメソッドを直接呼び出すのと同じくらい速いです。 call_user_funcを使用する方が一般的ですが、$ obj - > {$ method}( "parm1、" parm2 ")の代わりにcall_user_func(array($ obj、$ method)、" parm1 "、" parm2 " ); – Rolf

+0

また、後者も読みやすくなります。少なくともIMOです。実際には、その場合、メソッド名に中括弧を省略することがよくあります: '$ obj - > $ method($ params)' –

答えて

46

中カッコは、変数名の終わりを明示的に指定するために使用されます。例:

echo "This square is {$square->width}00 centimeters broad."; 

したがって、あなたのケースは本当に2つの特別なケースの組み合わせです。

$class->{'variable_name'} // Same as $class->variable_name 
$class->{'variable' . '_name'} // Dynamic values are also allowed 

そして、あなたの場合には、あなただけの{}括弧構文とそれらを取り巻くしている:あなたはとても、中括弧などを使用して、クラス変数にアクセスすることを許可されています。

は、 "複雑な(カーリー)の構文。" PHP manualを参照してください。 variable variablesを使用した場合

+2

これは$ this - > _ session - > {'user_id'}が使用されている状況 – jimyi

+0

速い返事をいただきありがとうございますええ、私はheadpalmを取るでしょう。それはメンバ変数のコンテキストでです。さらに悪いことに、私の検索では、マニュアルのそのページにありましたが、メンバ変数のサンプルが表示されませんでした... 私が与えた例は、実際にはあいまいではなく、実際の描写は必要ありません。年齢。私の言いたいことを見て? –

+2

@jimyi、私は私の答えをさらに明確にしました。ありがとう。 @papayasoft、私はそれがあなたのケースではかなり不必要であることに同意します。私の推測では、自動生成されたコードであり、すべての基底をカバーするために複雑な中括弧構文を使用しています。 –

22

は、私はちょうど構文を知っている:あなたの質問で

$userProp = 'id'; 
$this->_session->{'user_'.$userProp}; 
+1

+1はTFMへの適切なリンクを持つ唯一の答えです。@jimyiは暗示しています。 O.P.は、文字列の複雑な(中括弧)構文ではありません。これは、変数変数のあいまいさを解決するための中括弧の使用についてです。 –

9

の2つの例では、同じことを行います。 PHPは、あなたはいくつかの方法でメンバーデータ/メソッドにアクセスすることができます...

object->{'name_of_member'}; 

object->name_of_member; 

$member = 'name_of_member'; 
object->$member; 
19

Theresのその構文のおそらく一つの大きな利点は、しかし、その一般毛深いもののドメインで、物事は、おそらく避けたいです。

は、それはあなたがそうでなければ許可されていない変数名の文字を使用することを許可します。

すなわち:あなたが与える例で

$this->object->{"hello world\0\n"} 
$this->object->{"function(){ this is a truely awful name for a variable }"} 
+6

あなたの例ほど極端である必要はありません。たとえば、データベースにセッションデータが保存されていて、 "user_id"ではなく "user-id"という名前の列があるとします。 – mercator

+2

また、古いバージョンのPHPでは文字列ISTRの前に\ 0ピボット変数にアクセスできます。今では少なくとも\ 0はあなたに "あなたはそのことを許せません"という致命的な例外を与えます。 –

+5

絶対に恐ろしい悪夢を誘発する変数名の+1。とにかく寝るつもりはありませんでした。 –

11

は、何ら実質的な違いはありません、それが明確だからIMO $this->_session->user_idを使用する必要があります。 $this->_session->{'user_id' . $index}のように、その名前の式を構築することにより、メンバ変数にアクセスしているため、{}括弧構文は、実際に良いもの