## 可變變量
有時候使用可變變量是很方便的。就是說,一個變量的變量名是可以動態的設置和使用。一個普通的變量 通過聲明來設置,例如:
```
<?php
$a = 'hello';
?>
```
一個可變變量獲取了一個普通變量的值作為這個可變變量的變量名。在上面的例子中hello使用了兩個美元符號($)以后,就可以作為一個可變變量的變量了。例如:
```
<?php
$$a = 'world';
?>
```
這時,兩個變量都被定義了:$a的內容是“hello”并且$hello的內容是'world'。因此,以下語句:
```
<?php
echo "$a ${$a}";
?>
```
與以下語句輸出完全相同的結果:
```
<?php
echo "$a $hello";
?>
```
它們都會輸出:hello world。
要將可變變量用于數組,必須解決一個模棱兩可的問題。這就是當寫下$$a[1]時,解析器需要知道是想要$a[1]作為一個變量呢,還是想要$$a作為一個變量并取出該變量中索引為[1]的值。解決此問題的語法是,對第一種情況用${$a[1]},對第二種情況用${$a}[1]。
類的屬性也可以通過可變屬性名來訪問。可變屬性名將在該調用所處的范圍內被解析。例如,對于$foo->$bar表達式,則會在本地范圍來解析$bar并且其值將被用于$foo的屬性名。對于$bar是數組單元時也是一樣。
也可也使用花括號來給屬性名清晰定界。。最有用是在屬性位于數組中,或者屬性名包含有多個部分或者屬性名包含有非法字符時(例如來自 [json\_decode()](http://php.net/manual/zh/function.json-decode.php) 或 [SimpleXML](http://php.net/manual/zh/book.simplexml.php))。
**Example #1可變屬性示例**
```
<?php
class?foo?{
????var?$bar?=?'I?am?bar.';
????var?$arr?=?array('I?am?A.',?'I?am?B.',?'I?am?C.');
????var?$r???=?'I?am?r.';
}
$foo?=?new?foo();
$bar?=?'bar';
$baz?=?array('foo',?'bar',?'baz',?'quux');
echo?$foo->$bar?.?"\n";
echo?$foo->$baz[1]?.?"\n";
$start?=?'b';
$end???=?'ar';
echo?$foo->{$start?.?$end}?.?"\n";
$arr?=?'arr';
echo?$foo->$arr[1]?.?"\n";
echo?$foo->{$arr}[1]?.?"\n";
?>
```
以上例程會輸出:
I am bar.
I am bar.
I am bar.
I am r.
I am B.
> **Warning**
> 注意,在 PHP 的函數和類的方法中,[超全局變量](http://php.net/manual/zh/language.variables.superglobals.php)不能用作可變變量。*$this* 變量也是一個特殊變量,不能被動態引用。
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)