2013-05-06 117 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" 

工作例如:http://3v4l.org/n16sk

+6

hmm'$ object-> attr' ='$ object - > {「attr」}':) – 2013-05-06 22:08:13

+0

@DaveChen用這個例子更新了我的答案 – jszobody 2013-05-06 22:22:24

+2

我記得我剛開始的時候, $ this - > $ val'並失敗了。很高興看到這個答案。 – 2013-05-06 22:24:14

8

的所有$this->{$var}$this->var是兩個完全不同的事情首先。後者將請求var類變量,而另一個將請求包含在$var字符串中的變量的名稱。如果$var是字符串'foo'那麼它將請求$this->foo等。

這對於動態編程(只有在運行時才知道變量的名稱)很有用。

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

將打印Ok即使變量名y - x是因爲空間和-字符無效:但是,尤其是當你有奇怪的變量名的經典{}符號在字符串上下文中是非常強大的。

+1

+1!我從來不知道變量名稱可能很複雜。那麼,你可以把一個數組/對象作爲變量名嗎? – 2013-05-07 01:21:23

+1

@DaveChen,他們的字符串表示是。雖然我認爲變量名稱有一個長度限制。我認爲這不是一種好的做法,因此我會避免它。 – Shoe 2013-05-07 03:11:24

相關問題