2013-05-06 14 views
19
私がアクセスする必要が発生した

/などの変数を変更します。

$this->{$var} 

コンテキストは、CI DataMapperの取得ルールです。私はこのシンタックスが実際に何をしているのかはわからない。この文脈で{は何をしていますか?どうしてですか:

$this->var 

ありがとう!

答えて

36

これは可変変数です。これは$this->{value-of-$val}になります。です。

参照:例えばだから、http://php.net/manual/en/language.variables.variable.php

$this->a = "hello"; 
$this->b = "hi"; 
$this->val = "howdy"; 

$val = "a"; 
echo $this->{$val}; // outputs "hello" 

$val = "b"; 
echo $this->{$val}; // outputs "hi" 

echo $this->val; // outputs "howdy" 

echo $this->{"val"}; // also outputs "howdy" 

の作業例:もちろん

これは、クラスのコンテキスト内で作業しているhttp://3v4l.org/QNds9。あなたは同じように簡単にこのような局所的な文脈で変数変数を使用することができます。

$a = "hello"; 
$b = "hi"; 

$val = "a"; 
echo $$val; // outputs "hello" 

$val = "b"; 
echo $$val; // outputs "hi" 

を例作業:すべての$this->{$var}$this->varhttp://3v4l.org/n16sk

+6

hmm '$ object-> attr' =' $ object - > {"attr"} ':) –

+0

@DaveChenはこの例でも私の答えを更新しました – jszobody

+2

私が始めたときに私は' $ this-> $ val'となり、悲惨に失敗しました。この返事を見るにはニース。 –

8

まず、2つの非常に異なるものです。後者はクラス変数varを要求し、他方は$varの文字列に含まれる変数の名前を要求します。 $varが文字列'foo'の場合、$this->fooなどと要求します。

これは、動的プログラミング(実行時にのみ変数の名前がわかっている場合)に役立ちます。しかし、文字列コンテキストで古典{}表記はあなたが変な変数名を持っている場合は特に非常に強力です:

${'y - x'} = 'Ok'; 
$var = 'y - x'; 
echo ${$var}; 

変数名y - xがあるため、スペースと-文字で有効でない場合でもOkを印刷します。

+1

+1しました。私は変数名がその複雑なものであることは知らなかった。だから、配列/オブジェクトを変数名として置くことができますか? –

+1

@DaveChen、その文字列表現はyesです。私は変数名には長さ制限があると思いますが。私はそれが良い習慣とは考えられないと思うので、私はそれを避けるだろう。 – Shoe

関連する問題