一、基礎
變數在PHP語法中,是以錢的符號($)後面再加上變數名稱的方式來表示,變數的名稱是有區分大小寫的。有效的變數名稱是以字母或是底線( _ )為開頭,後面再接上任何的字母、數字或底線,以正規表達示來表達的話,可以表示成這個樣子'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。
Example:
<?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
$tyte = 'mansikka'; // valid; '' is ASCII 228.
?>
若要以參照的方式將值分配給變數,可在變數的前面加上&這個符號。如下面範例所示,會重複輸出二次'My name is Bob'。
Example:
<?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.
?>
有一點需要去注意的是,使用參照的方式只可以分配變數的名稱而己。如下面範例所示:
Example:
<?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也提供己定義的陣列,這些陣列的內容包含了網站伺服器的變數、環境變數、及用戶輸入的資料等等。這些陣列相當的特殊,因為這些陣列會自動地成為全域變數,也正因為如此,所以他們被稱為'autoglobals'或是'superglobals','superglobals'就是下列所列出來的這些。
PHP Superglobals
$GLOBALS
傳回目前在程式中,所有可以利用的全域變數,傳回的值是一個陣列,陣列的索引值是全域變數的名稱。
$_SERVER
這個變數的值是由網站伺服器或執行目前程式的環境所設定,和原先的$HTTP_SERVER_VARS一樣。
$_GET
這個變數的值是經由HTTP GET的方式所獲得,和原先的$HTTP_GET_VARS一樣。
$_POST
這個變數的值是經由HTTP POST的方式所獲得,和原先的$HTTP_POST_VARS一樣。
$_COOKIE
這個變數的值是經由HTTP cookies的方式所獲得,和原先的$HTTP_COOKIE_VARS一樣。
$_FILES
這個變數的值是經由HTTP使用POST上傳檔案的方式所獲得,和原先的$HTTP_POST_FILES一樣。
$_ENV
這個變數的值是經由環境變數所獲得,和原先的$HTTP_ENV_VARS一樣。
$_REQUEST
這個變數的值是經由用戶端輸入的資料所獲得,這個變數值的順序和組態檔裡面的variables_order這個指令的設定值有關。
$_SESSION
這個變數的值就是目前程式己經登記過的session,和原先的$HTTP_SESSION_VARS一樣。
三、變數的範圍
變數的範圍和它所定義的方式有關,大多數的PHP變數都只具有單一範圍,這個單一範圍可以橫跨included和required的檔案,例如:
<?php
$a = 1;
include "b.inc";
?>
如上面範例所示,變數$a可以用在b.inc的程式裡面。預設上是限制變數運用在使用者自定的函式裡面,所以下面這個範例不會輸出任何東西。
Example:
<?php
$a = 1; /* global scope */
function Test()
{
echo $a; /* reference to local scope variable */
}
Test();
?>
上面這個範例不會輸出任何東西,是因為預設上是限制變數運用在使用者自定的函式裡面,而且函式本身也沒有分配任何的值給變數$a。如果你要在函式裡面使用$a這個變數,可在函式內部將它宣告成全域變數,如下面範例所示:
Example:
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
另外一種方式,就是使用$GLOBALS,我們可將上面的範例改寫成這個樣子:
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b;
?>
$GOLBALS是個組合的陣列,$GLOBALS的索引值就是變數的名稱,而變數的值會成為陣列的元素,因為$GLOBALS是屬於superglobal,所以可以在任何範圍中去存取它的值。下面這個範例可以展現superglobal的功能。
Example:
<?php
function test_global()
{
// Most predefined variables aren't "super" and require
// 'global' to be available to the functions local scope.
global $HTTP_POST_VARS;
print $HTTP_POST_VARS['name'];
// Superglobals are available in any scope and do
// not require 'global'. Superglobals are available
// as of PHP 4.1.0
print $_POST['name'];
}
?>
變數還有另一種重要的特性,那就是靜態變數,靜態變數只可存在於使用者自定的函式裡面,請看下列範例這樣的寫法。
<?php
function Test ()
{
$a = 0;
echo $a;
$a++;
}
?>
如果將程式寫成上面這個樣子,一點可用的價值都沒有,因為只要一呼叫這個函式,它便會將變數$a設為0,並輸出0,所以在函式中,使用$a++一點用處都沒有。為了能讓函式保有變數$a目前的值,並能將目前的值往上增加,因此我們必需將變數$a宣告成靜態變數,所以上面的範例可以改寫成這樣:
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>
改寫之後,只要一呼叫函式Test( ),它便會輸出變數$a目前的值並且再將它的值往上增加。
四、可變的變數名稱
它能夠採用另一個變數的值來當作是變數名稱,也就是說變數的名稱可以動態地被設定,一般要設定變數的話,是使用下列這種語法:
<?php
$a = "hello";
?>
可變的變數名稱就是採用變數的值,來當作是變數的名稱。如果要使用這種方式來設定變數的名稱,可以在變數名稱的前面以二個$這個符號來表示,假設我們要採用上面範例中,變數$a的值來當作變數名稱,我們可以寫成這樣:
<?php
$$a = "world";
?>
五、外部的變數
HTML表單
當表單的資料被送往PHP程式處理時,表單內的資料會自動地轉換成變數,來讓處理的程式運用。要處理表單的資料有很多種方法,如下面範例所示:
Example:HTML表單
<form action="foo.php" method="post">
Name: <input type="text" name="username"><br>
Email: <input type="text" name="email"><br>
<input type="submit" name="submit" value="Submit me!">
</form>
每個人在處理表單資料的方式都不相同,要看你想要如何去運用這些表單的資料,下列這個範例可以簡易的處理表單內的資料。
Example:
<?php
// Available since PHP 4.1.0
print $_POST['username'];
print $_REQUEST['username'];
import_request_variables('p', 'p_');
print $p_username;
// Available since PHP 3.
print $HTTP_POST_VARS['username'];
// Available if the PHP directive register_globals = on. As of
// PHP 4.2.0 the default value of register_globals = off.
// Using/relying on this method is not preferred.
print $username;
?>
如果HTML的表單是使用GET方法(method="get"),那麼你就必需將上面範例改寫,這樣才能正確的存取表單內的資料,GET也適用於QUERY_STRING(就是URL問號後面的字串),例如http://www.example.com/test.php?id=3,使用$_GET['id']就可得到它的值。
如果表單的變數是使用陣列的方式來表達的話,PHP也看得懂這樣的表達方式,所以你可以將相關的變數歸類在同一群組,或是使用這個功能來從複選式的表單中獲得資料,如下面範例所示:
Example:
<?php
if ($HTTP_POST_VARS['action'] == 'submitted') {
print '<pre>';
print_r($HTTP_POST_VARS);
print '<a href="'. $HTTP_SERVER_VARS['PHP_SELF'] .'">Please try again</a>';
print '</pre>';
} else {
?>
<form action="<?php echo $HTTP_SERVER_VARS['PHP_SELF']; ?>" method="post">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbru</option>
</select><br>
<input type="hidden" name="action" value="submitted">
<input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?>
圖形傳送鍵的變數名稱
如果要將表單的送出鍵以圖檔來代替的話,可將HTML改寫成下列這樣子:
<input type="image" src="image.gif" name="sub">
當用戶按下這個圖形的任何地方後,表單會被送往伺服器端來作處理,而且會多出二個變數出來,分別是sub_x與sub_y,這二個變數值所代表的意思是,用戶按下的位置位於圖形上座標(x,y)這個位置。
HTTP Cookies
cookie是種儲存在用戶端的資料,它也是HTTP標頭檔的一部份,所以如果使用setcookie( )函式,就必需在任何的輸出送往用戶端之前就呼叫它。cookie可用來追蹤或識別用戶端所傳回來的資料,要設定cookies可以使用setcookie( )函式,要取出存在用戶端的cookies,可以使用$_COOKIE、$HTTP_COOKIE_VARS、$_REQUEST這些變數。
你也可以使用陣列的方式來設定cookie的值,例如:
<?php
setcookie("MyCookie[foo]", "Testing 1", time()+3600);
setcookie("MyCookie[bar]", "Testing 2", time()+3600);
?>