天天看點

PHP變量入門教程(1)基礎

基礎

PHP 中一個美元符号後面跟上一個變量名稱,即表示一個變量。變量的名稱是對大小寫敏感的。

變量名與 PHP 中其它的标簽一樣遵循相同的規則。一個有效的變量名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。按照正常的正規表達式,它将被表述為:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

注: 字母為 a-z,A-Z,ASCII 字元從 127 到 255(0x7f-0xff)。 

<?php
$var = "Bob";
$Var = "Joe";
echo "$var, $Var";      // outputs "Bob, Joe"

$4site = 'not yet';    // invalid; starts with a number
$_4site = 'not yet';    // valid; starts with an underscore
$t?yte = 'mansikka';    // valid; ? is (Extended) ASCII 228.
?>      

PHP 3 中,變量總是傳值指派。那也就是說,當你将一個表達式的值賦予一個變量時,整個原始表達式的值被指派到目标變量。這意味着,例如,當一個變量的值賦予另外一個變量時,改變其中一個變量的值,将不會影響到另外一個變量。有關這種類型的指派操作,請參閱表達式一章。

PHP 4 提供了另外一種方式給變量指派:傳位址指派。這意味着新的變量簡單的引用(換言之,“成為其别名” 或者 “指向”)了原始變量。改動新的變量将影響到原始變量,反之亦然。這同樣意味着其中沒有執行複制操作;因而,這種指派操作更加快速。盡管如此,任何提速的操作隻有在緊密循環或者大數組或者對象才可能被注意到。

使用傳位址指派,簡單地追加一個(&)符号到将要指派的變量前(源變量)。例如,下列代碼片斷兩次輸出‘My name is Bob’: 

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;              // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $bar;
echo $foo;                // $foo is altered too.
?>      

需要注意的是隻有命名變量才可以傳位址指派,這一點非常重要。

<?php
$foo = 25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 * 7);  // Invalid; references an unnamed expression.

function test()
{
	return 25;
}

$bar = &test();    // Invalid.      

預定義變量

PHP 提供了大量的預定義變量。由于許多變量依賴于運作的伺服器的版本和設定,及其它因素,是以并沒有詳細的說明文檔。一些預定義變量在 PHP 以指令行形式運作時并不生效。有關這些變量的詳細清單,請參閱“保留的預定義變量”一章。

警告

PHP 4.2.0 以及後續版本中,PHP 指令 register_globals 的預設值為 off。這是 PHP 的一個主要變化。讓 register_globals 的值為 off 将影響到預定義變量集在全局範圍内的有效性。例如,為了得到 DOCUMENT_ROOT 的值,你将必須使用 $_SERVER['DOCUMENT_ROOT'] 代替 $DOCUMENT_ROOT,又如,使用 $_GET['id'] 來代替 $id 從 URL http://www.example.com/test.php?id=3 中擷取 id 值,亦或使用 $_ENV['HOME'] 來代替 $HOME 擷取環境變量 HOME 的值。

更多相關資訊,請閱讀配置項目 register_globals,有關安全性的一章使用 Register Globals,以及 PHP 4.1.0 和 4.2.0 的發行通告.

請優先使用可用的 PHP 預定義變量,如 超級全局數組。 

從 PHP 4.1.0 開始,PHP 提供了一套附加的預定數組,這些數組變量包含了來自 Web 伺服器(如果可用),運作環境,和使用者輸入的資料。這些數組非常特别,它們在全局範圍内自動生效,例如,在任何範圍内自動生效。為此,它們常因是 "autoglobals" 或者 "superglobals" 而聞名。(PHP 中尚且沒有一種可使使用者自定義超級全局變量的機制)超級全局變量羅列于下文中;但是為了得到它們的内容和關于 PHP 預定義變量的進一步的讨論以及它們的本質,請參閱預定義變量。而且,你也将注意到舊的預定義數組($HTTP_*_VARS)仍舊存在。自 PHP 5.0.0 起,冗長的 PHP 預定義變量可以通過設定 register_long_arrays 來屏蔽。