web-dev-qa-db-ja.com

PHPメンバー変数の波括弧構文

SOそしてそれは本当のRTM候補です。しかし、私はあなたが見たことがあり、それを見つけることができないように見えると約束します。私が見逃した単純なことが判明したときに#headpalmを実行します。

Zend Frameworkを理解しようとして、次の構文に遭遇しました。

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

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

$this->_session->user_id

_sessionは無関係であると想定していますが、_sessionはそうでない可能性があるため、質問に含めます。

中括弧は、複合変数名user_idをラップしようとする単なるクリーンな規則ですか?それとも、ある種の特別なアクセサーですか?

Rを上げるためのTFMへのポインタはありがたいことに感謝します。

どうもありがとう。優しくしてください。

79
David Weinraub

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

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マニュアル 、「複雑な(中)構文」を参照してください。

51
James Skidmore

変数変数 を使用するときの構文を知っています。

$userProp = 'id';
$this->_session->{'user_'.$userProp};
23
Gumbo

ただし、おそらくその構文には1つの大きな利点があります。一般的には、毛むくじゃらのものの領域であり、おそらく避けたいことです。

これにより、他の方法では許可されない文字を変数名に使用できます。

すなわち:

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

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

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
11
Donnie DeBoer

あなたが与える例では、実際の違いはありません。IMO$this->_session->user_idはより明確なので使用する必要があります。

中括弧構文が実際に適しているのは、$this->_session->{'user_id' . $index}などの名前の式を作成してメンバー変数にアクセスすることです。

11
chaos