變量名與 PHP 中其它的標簽一樣遵循相同的規則。一個有效的變量名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。按照正常的正則表達式,它將被表述為:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。
Note: $this 是一個特殊的變量,它不能被賦值。
變量默認總是傳值賦值。那也就是說,當將一個表達式的值賦予一個變量時,整個原始表達式的值被賦值到目標變量。這意味著,例如,當一個變量的值賦予另外一個變量時,改變其中一個變量的值,將不會影響到另外一個變量。有關這種類型的賦值操作,請參閱表達式一章。
PHP 也提供了另外一種方式給變量賦值:引用賦值。這意味著新的變量簡單的引用(換言之,“成為其別名” 或者 “指向”)了原始變量。改動新的變量將影響到原始變量,反之亦然。
使用引用賦值,簡單地將一個 & 符號加到將要賦值的變量前(源變量)。
有一點重要事項必須指出,那就是只有有名字的變量才可以引用賦值。
復制代碼 代碼如下:
<?php
$foo = 25;
$bar = &$foo; // 合法的賦值
$bar = &(24 * 7); // 非法; 引用沒有名字的表達式
function test()
{
return 25;
}
$bar = &test(); // 非法
?>
雖然在 PHP 中並不需要初始化變量,但對變量進行初始化是個好習慣。未初始化的變量具有其類型的默認值 - 布爾類型的變量默認值是 FALSE,整形和浮點型變量默認值是零,字符串型變量默認值是空字符串或者數組變量的默認值是空數組。
依賴未初始化變量的默認值在某些情況下會有問題,例如把一個文件包含到另一個之中時碰上相同的變量名。另外把 register_globals 打開是一個主要的安全隱患。使用未初始化的變量會發出E_NOTICE錯誤,但是在向一個未初始化的數組附加單元時不會。isset() 語言結構可以用來檢測一個變量是否已被初始化。
預定義變量
PHP 提供了大量的預定義變量。由於許多變量依賴於運行的服務器的版本和設置,及其它因素,所以並沒有詳細的說明文檔。一些預定義變量在 PHP 以命令行形式運行時並不生效。
從 PHP 4.1.0 開始,PHP 提供了一套附加的預定數組,這些數組變量包含了來自 web 服務器(如果可用),運行環境,和用戶輸入的數據。這些數組非常特別,它們在全局范圍內自動生效,例如,在任何范圍內自動生效。因此通常被稱為自動全局變量(autoglobals)或者超全局變量(superglobals)。(PHP 中沒有用戶自定義超全局變量的機制。)超全局變量羅列於下文中;但是為了得到它們的內容和關於 PHP 預定義變量的進一步的討論以及它們的本質,請參閱預定義變量。而且,你也將注意到舊的預定義數組($HTTP_*_VARS)仍舊存在。自 PHP 5.0.0 起, 用 register_long_arrays 設置選項可禁用 長類型的 PHP 預定義變量數組。
變量范圍
變量的范圍即它定義的上下文范圍(也就是它的生效范圍)。大部分的 PHP 變量只有一個單獨的范圍。這個單獨的范圍跨度同樣包含了 include 和 require 引入的文件。
PHP 的全局變量和 C 語言有一點點不同,在 C 語言中,全局變量在函數中自動生效,除非被局部變量覆蓋。而PHP中的局部變量不會被全局變量覆蓋,如果使用會是變量的缺省初始值。這可能引起一些問題,有些人可能不小心就改變了一個全局變量。PHP 中全局變量在函數中使用時必須申明為global。
使用靜態變量
變量范圍的另一個重要特性是靜態變量(static variable)。靜態變量僅在局部函數域中存在,但當程序執行離開此作用域時,其值並不丟失。