PHP中的變量用一個美圓符號後面跟變量名來表示。變量名是區分大小寫的,而且出現中文可能也是合法的。php
變量默認老是傳值賦值。PHP也提供了另一種方式給變量賦值:引用賦值。這意味着新的變量簡單的引用(換言之,"成爲其別名" 或者 "指向")了原始變量。改動新的變量將影響到原始變量,反之亦然。使用引用賦值,簡單地將一個&符號加到將要賦值的變量前(源變量)。注意,只有有名字的變量才能夠引用賦值。html
PHP擁有大量預約義變量,許多變量依賴與服務器,某些預約義變量以命令行形式運行時並不生效。web
PHP提供了一套附加的預約數組,這些數組變量包含了來自web服務器(若是可用),運行環境,和用戶輸入的數據,一般被稱爲自動全局變量(autoglobals)或者超全局變量(superglobals)。數組
這裏的變量範圍指的是,它定義的上下文背景,也就是它的生效範圍。變量的範圍包含了include和require引入的文件。瀏覽器
PHP的全局變量和C語言有一點點不一樣,在C語言中,全局變量在函數中自動生效,除非被局部變量覆蓋。PHP中全局變量在函數中使用時必須聲明爲global。服務器
<?php $a = 'hello'; function test() { var_dump($a); } // test(); include 'b.inc';
b.inc
內容以下:cookie
<?php echo 'hello'; ?>
該程序可以正常輸出hello
,可是被註釋掉的test()
不能正常解析,由於變量$a是未定義的。函數
若在某個函數中想使用全局變量,能夠經過下面兩種方式。post
global關鍵字ui
global $a, $b;
在函數中聲明全局變量後,對任一變量的全部引用都會指向其全局版本。
$GLOBALS超全局變量數組
$GLOBALS['b'] = $GLOBALS['a'] + $BLOBALS['b'];
用法同global關鍵字類似。
靜態變量僅在局部函數域中存在,但當程序執行離開此做用域時,其值並不丟失。而且,只在聲明時初始化一次,每次調用函數並不會覆蓋靜態函數的值。
靜態變量在聲明中用表達式的結果對其賦值會致使解析錯誤,靜態聲明是在編譯時解析的。
<?php function test() { static $cnt = 0; echo $cnt; $cnt++; if($cnt < 10) { test(); } $cnt--; } test();
和C語言的static類似,下面這段C代碼也能夠把0~9十個數字依次輸出。
#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; }
對於變量的static和global定義是以引用的方式實現的。
可變變量是PHP語言中的一種特殊用法,不知其餘語言存不存在。
簡而言之,可變變量就是,一個可變變量獲取了一個普通變量的值做爲這個可變變量的變量名。
<?php $a = 'hello'; $$a = 'world'; echo "$a $$a"; // hello $hello echo "$a ${$a}"; // hello world
當可變變量用於數組時,可能會出現模棱兩可的問題。好比,寫下$$a[1]
,編譯器會報錯的,你想要表達的意思須要用下面兩種方式替換掉。
${$a[1]}
$a[1]做爲一個變量
${$a}[1]
$$a做爲一個變量並取出變量中索引爲1的值。
當表單提交給PHP腳本時,表單中的信息自動在腳本中可用,能夠經過$_GET[]
、$_POST[]
和$_REQUEST[]
訪問。
注意,變量名中的點和空格被轉換成下劃線。例如<input name="a.b">
變成了$_REQUEST["a_b"]
,下面的示例中展現了表單中標識符的使用。
<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>
表單處理文件process.php
。
<?php var_dump(isset($_POST['my.text'])); var_dump(isset($_POST['mytext'])); var_dump(isset($_POST['my_text'])); var_dump($_POST['my_text']);
由於句點不是PHP變量名中的合法字符,輸出結果以下所示。
boolean false boolean false boolean true string 'h3' (length=2)
magic_quotes_gpc
配置指令影響到get/post/cooie的值,這個特性已經廢棄移除,輸入中的單引號、雙引號、反斜槓和NULL字符都不會被轉義。若須要轉義可以使用addslashes()
,若須要反引用一個引用的字符串須要使用stripslashes()
。
PHP也懂得表單變量上下文中的數組,下面的例子使用了更復雜的表單變量,並將表單post給本身並在提交時顯示數據。
<?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; }
在heredoc中含有複雜變量時要格外當心,上面這段代碼$_SERVER['PHP_SELF']
不加花括號會在運行時報錯。
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)
當提交表單時,能夠用一張圖片代替標準的提交按鈕。第一次使用,真的好神奇。
<?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; }
對於上面這段程序,當用戶點擊圖片某處時,表單會傳送到服務器,並加上兩個變量sub_x
和sub_y
,包含了用戶點擊圖片的座標。
array (size=3) 'action' => string '1' (length=1) 'sub_x' => string '334' (length=3) 'sub_y' => string '282' (length=3)
PHP能夠用setcookie()
函數設定cookies,cookies是HTTP信息頭的一部分,所以必須在向瀏覽器發送任何輸出以前調用。
cookie的相關使用以下所示。
<?php if(isset($_COOKIE['cnt'])) { $cnt = $_COOKIE['cnt'] + 1; echo $cnt; } else { $cnt = 1; } setcookie('cnt', $cnt, time() + 3600);
cookie數據在相應的cookie數組中可用,若是將多個值賦給一個cookie變量,必須將其賦成數組。
常量在腳本執行期間其值不能改變。常量大小寫敏感,傳統上常量標識符老是大寫。常量一旦定義就不能被從新定義或取消定義,常量的值只能是標量。
能夠用define()
函數來定義常量,也可使用const關鍵字在類定義以外定義常量。自定義常量不要以雙下劃線開頭,可能會與魔術常量衝突。
define('FOO', 'something'); const FOO = 'something';
使用const關鍵字定義常量必須處於最頂端的做用區域,由於用此方法是在編譯時定義的。常量的範圍是全局的,不用管做用區域,就能夠在腳本的任何地方訪問常量。
魔術常量值能變,但它其實不是常量。
__LINE__ // 文件中的當前行號 __FILE__ // 文件的完整路徑和文件名,絕對路徑 __DIR__ // 文件所在的目錄,除非根目錄,不然不包括末尾斜槓,等價於dirname(__FILE__) __FUNCTION__ // 函數名稱,區分大小寫 __CLASS__ // 類的名稱,包括其被聲明的做用區域 __TRAIT__ // Trait的名字,包括其被聲明的做用區域 __METHOD__ // 類的方法名 __NAMESPACE__ // 當前命名空間的名稱
PHP向它運行的任何腳本提供了大量的預約義常量,上面8個魔術常量的值隨着它們在代碼中的位置改變而改變。
(全文完)