發新話題

[分享] 《PHP》『變數』

《PHP》『變數』

一、基礎

變數在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
$tyte = '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 Schwabenbru</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);
?>


TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。