1. php 什麼是可變變數
可變變數
有時候使用可變變數名是很方便的。就是說,一個變數的變數名可以動態的設置和使用。一個普通的變數通過聲明來設置,例如:
<?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() 或 SimpleXML)。
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 的函數和類的方法中,超全局變數不能用作可變變數。$this 變數也是一個特殊變數,不能被動態引用。
2. PHP里 switch case條件語句的問題
佩服樓主 很細心哪!
這個問題應該從PHP作為動態腳本語言說起:
動態語言的變數類型是隨存儲的變數而變化的,即變數類型是根據具體環境而進行變化的。
字元串"abc",從樓主的意思來看可能指確切字元串,但是對於PHP存儲的時候它是不能確定的,因為隨著語義的變化,其所起的作用也會變化
第一個case 0:,PHP腳本將常量0翻譯為確切的整數,與字元串比較大小時,需要將字元串轉換為整數。PHP腳本會將字元串abc,從十進制(默認)轉換為數字,但是abc很明顯不能代表十進制數,即轉換失敗,則PHP將結果置為0,如果將字元串表示為"0xabc",那麼PHP腳本能夠發現0x標識,將abc作為十六進制轉換,所以能夠得到abc標識的十六進制整數。
如果樓主學過C,可以做一個簡單比較:
C中的case必須是數字常量,而不能是字元串,就因為C是變數類型確定的,運行時不能將確定的變數按語義隨意轉換。而PHP可以,因為PHP語言是動態的,變數類型是動態的。
或者從PHP的例子中學習:
如果一個文件將111111字元串(不是數字)存儲到文件,然後從文件直接讀取到變數$a,如下語法就可以將$a作為整數計算:
0+$a
上述表達式得到的結果也可以作為動態語言的一個變現來看
3. 什麼是PHP變數
常量是一個簡單值的標識符(名字)。如同其名稱所暗示的,在腳本執行期間該值不能改變(除了所謂的魔術常量,它們其實不是常量)。常量默認為大小寫敏感。按照慣例常量標識符總是大寫的。(更多PHP知識相關推薦閱讀:什麼是PHP開發?PHP開發都用什麼工具?)
常量名和其它任何 PHP 標簽遵循同樣的命名規則。合法的常量名以字母或下劃線開始,後面跟著任何字母,數字或下劃線。用正則表達式是這樣表達的:[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*
注: 在這里,字母是 a-z,A-Z,以及從 127 到 255(0x7f-0xff)的 ASCII 字元。
和 superglobals 一樣,常量的范圍是全局的。不用管作用域就可以在腳本的任何地方訪問常量。有關作用得更多信息請閱讀手冊中的變數范圍。
語法
可以用 define() 函數來定義常量。一個常量一旦被定義,就不能再改變或者取消定義。
常量只能包含標量數據(boolean,integer,float 和 string)。
可以簡單的通過指定其名字來取得常量的值,不要在常量前面加上 $ 符號。如果常量名是動態的,也可以用函數 constant() 來讀取常量的值。用 get_defined_constants() 可以獲得所有已定義的常量列表。
注: 常量和(全局)變數在不同的名字空間中。這意味著例如 TRUE 和 $TRUE 是不同的。
如果使用了一個未定義的常量,PHP 假定你想要的是該常量本身的名字,如同你用字元串調用它一樣(CONSTANT 對應 "CONSTANT")。此時將發出一個 E_NOTICE 級的錯誤。參見手冊中為什麼 $foo[bar] 是錯誤的(除非你事先用 define() 將 bar 定義為一個常量)。如果你只想檢查是否定義了某常量,用 defined() 函數。
常量和變數不同:
常量前面沒有美元符號($);
常量只能用 define() 函數定義,而不能通過賦值語句;
常量可以不用理會變數范圍的規則而在任何地方定義和訪問;
常量一旦定義就不能被重新定義或者取消定義;
常量的值只能是標量。
以上來自上海優就業老師進行的總結,關於上海IT培訓PHP開發更多了解:網頁鏈接