基礎
PHP中的變數以一個美元符號後面跟著變數名稱來表示。變數名是區分大小寫的,並且出現中文可能也是合法的。
變數預設總是傳值賦值。 PHP也提供了另外一種方式來為變數賦值:引用賦值。這意味著新的變數簡單的引用(換言之,"成為其別名" 或 "指向")了原始變數。改動新的變數將影響到原始變量,反之亦然。使用引用賦值,簡單地將一個&符號加到將要賦值的變數前(來源變數)。請注意,只有有名字的變數才可以引用賦值。
預定義變數
PHP擁有大量預定義變量,許多變量依賴與伺服器,某些預定義變量以命令列形式運行時並不生效。
PHP提供了一套附加的預定數組,這些數組變數包含了來自web伺服器(如果可用),運行環境,和用戶輸入的數據,通常被稱為自動全局變量(autoglobals)或者超全局變量(superglobals) 。
變數範圍
這裡的變數範圍指的是,它定義的上下文背景,也就是它的生效範圍。變數的範圍包含了include和require引入的檔案。
PHP的全域變數和C語言有一點點不同,在C語言中,全域變數在函數中自動生效,除非被局部變數覆蓋。 PHP中全域變數在函數中使用時必須宣告為global。
<code><?php $a = 'hello'; function test() { var_dump($a); } // test(); include 'b.inc';</code>
b.inc
內容如下:
<code><?php echo 'hello'; ?></code>
程式能夠正常輸出hello
,但是被註解掉的test()
不能正常解析,因為變數$a是未定義的。
使用全域變數
若在某個函數中想使用全域變量,可以透過下面兩種方式。
<code>global $a, $b;</code>
在函數中宣告全域變數後,所有關於任一變數的參考都會指向其全域版本。
<code>$GLOBALS['b'] = $GLOBALS['a'] + $BLOBALS['b'];</code>
用法同global關鍵字相似。
靜態變數
靜態變數僅在局部函數域中存在,但當程式執行離開此作用域時,其值並不會遺失。並且,只在宣告時初始化一次,每次呼叫函數並不會覆寫靜態函數的值。
靜態變數在宣告中以表達式的結果對其賦值會導致解析錯誤,靜態宣告是在編譯時解析的。
<code><?php function test() { static $cnt = 0; echo $cnt; $cnt++; if($cnt < 10) { test(); } $cnt--; } test();</code>
和C語言的static相似,下面這段C程式碼也可以把0~9十個數字依序輸出。
<code>#include <stdio.h> void test(void) { static int cnt = 0; printf("%d ", cnt); cnt++; if(cnt < 10) { test(); } cnt--; } int main(void) { test(); return 0; }</code>
對於變數的static和global定義是以引用的方式實現的。
可變變數
可變變數是PHP語言中的一種特殊用法,不知其他語言存不存在。
簡而言之,可變變數就是,一個可變變數取得了一個普通變數的值作為這個可變變數的變數名稱。
<code><?php $a = 'hello'; $$a = 'world'; echo "$a $$a"; // hello $hello echo "$a ${$a}"; // hello world</code>
當可變變數用於數組時,可能會出現模棱兩可的問題。例如,寫下$$a[1]
,編譯器會報錯的,你想要表達的意思需要用下面兩種方式替換掉。
${$a[1]}
$a[1]作為一個變數
${$a}[1]
$$a作為一個變數並取出變數中索引為1的值。
表單變數
當表單提交給PHP腳本時,表單中的資訊會自動在腳本中可用,可以透過$_GET[]
、$_POST[]
和$_REQUEST[]
存取。
注意,變數名稱中的點和空格轉換成下劃線。例如<input name="a.b">
變成了$_REQUEST["a_b"]
,下面的範例中展示了表單中識別符的使用。
<code><form action="process.php" method="post"> <input name="my.text" type="text"> <input name="my text" type="text"> <input name="my_text" type="text"> <input type="submit"> </form></code>
表單處理文件process.php
。
<code><?php var_dump(isset($_POST['my.text'])); var_dump(isset($_POST['mytext'])); var_dump(isset($_POST['my_text'])); var_dump($_POST['my_text']);</code>
因為句點不是PHP變數名稱中的合法字符,輸出結果如下。
<code>boolean false boolean false boolean true string 'h3' (length=2)</code>
magic_quotes_gpc
配置指令影響到get/post/cooie的值,這個特性已經廢棄移除,輸入中的單引號、雙引號、反斜線和NULL字元都不會被轉義。若需要轉義可使用addslashes()
,若需要反引用一個引用的字串需要使用stripslashes()
。
PHP也懂得表單變量上下文中的數組,下面的例子使用了更複雜的表單變量,並將表單post給自己並在提交時顯示數據。
<code><?php if(isset($_POST['action'])) { var_dump($_POST); } else { $page = $_SERVER['PHP_SELF']; $s = <<<STR <form action="{$_SERVER['PHP_SELF']}" method="post"> <input type="text" name="personal[name]"> <input type="text" name="personal[detail]"> <select multiple name="option[]"> <option value="a">a</option> <option value="b">b</option> <option value="c">c</option> </select> <input type="hidden" name="action" value="submitted"> <input type="submit" name="submit"> </form> STR; echo $s; }</code>
在heredoc中含有複雜變數時要格外小心,上面這段程式碼$_SERVER['PHP_SELF']
不加花括號會在執行時報錯誤。
<code>array (size=4) 'personal' => array (size=2) 'name' => string 'hello' (length=5) 'detail' => string 'world' (length=5) 'option' => array (size=2) 0 => string 'a' (length=1) 1 => string 'c' (length=1) 'action' => string 'submitted' (length=9) 'submit' => string '提交查询内容' (length=12)</code>
IMAGE提交
當提交表單時,可以用一張圖片取代標準的提交按鈕。第一次使用,真的好神奇。
<code><?php if(isset($_POST['action'])) { var_dump($_POST); } else { $s = <<<STR <form action="{$_SERVER['PHP_SELF']}" method="post"> <input type="hidden" name="action" value="1"> <input type="image" src="go.jpg" name="sub"> </form> STR; echo $s; }</code>
對於上面這段程序,當使用者點擊圖片某處時,表單會傳送到伺服器,並加上兩個變數sub_x
和sub_y
,包含了使用者點擊圖片的座標。
<code>array (size=3) 'action' => string '1' (length=1) 'sub_x' => string '334' (length=3) 'sub_y' => string '282' (length=3)</code>
cookies
PHP可以用setcookie()
函數設定cookies,cookies是HTTP訊息頭的一部分,因此必須在傳送任何輸出之前呼叫瀏覽器。
cookie的相關使用如下所示。
<code><?php if(isset($_COOKIE['cnt'])) { $cnt = $_COOKIE['cnt'] + 1; echo $cnt; } else { $cnt = 1; } setcookie('cnt', $cnt, time() + 3600);</code>
cookie数据在相应的cookie数组中可用,如果将多个值赋给一个cookie变量,必须将其赋成数组。
(全文完)
以上就介绍了变量 - PHP手册笔记,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。