查看: 1267|回復: 0
打印 上一主題 下一主題

變量的使用

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-14 05:11:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
就像大部份的結構化程序,有所謂的全局變量與局部變量,PHP 在這方面也是有相同的處理方式。
在 PHP 的程序執行時,系統會在內存中保留一塊全局變量的區域。實際運用時,可以透過 $GLOBALS["變量名稱"] 將需要的變量取出。在用戶自定的函數或程序中,就可以用 $GLOBALS 數組取出需要的變量。當然別忘了 PHP 的變量有分大小寫,搞錯了大小寫可是叫一百年,變量也不會出來。

$GLOBALS 數組是 PHP 程序中比較特殊的變量,不必定義,系統會自動匹配相關的變量在裡面。在函數中,也不必管 $GLOBALS 數組是否已經做全局定義,就可以直接使用了。

和 $GLOBALS 變量類似的還有 $php_errormsg 字符串變量。若 PHP 的配置文件 (php.ini/php3.ini) 中的 track_errors 選項打開的話,會有全局變量 $php_errormsg 可以看到錯誤的資料。

在 PHP 中,全局變量的有效範圍 (scope) 僅限於主要程序中,不會影響到函數中同名的變量,也就是全局變量與局部變量互不侵犯。若要變量能通透到函數中,就要用到 $GLOBALS 數組或是使用 global 定義。

例如,在自行開發的函數中,要取得目前執行 PHP 程序頁面的文件名,就可以用 $GLOBALS["PHP_SELF"] 取出 $PHP_SELF 的值。

<?php
// 本程序使用 $GLOBALS 數組
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>


下面是錯誤的示範,請勿模仿,上面的才是正確的示範。

<?php
// 這是錯誤的示範
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>


但是這個錯誤的示範要是改成下例就沒問題了

<?php
// 本程序使用全局定義
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>


在變量前面加上 global 的名稱,就是定義該變量為全局變量。用這種方式,就不需使用 $GLOBALS 數組,也能讓變量進入自行開發的函數中。

接下來先看靜態變量的例子

<?php
// 靜態變量的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>


函數在執行時所產生的變量,在函數結束時就消失了,有時因為程序的需要,函數在循環中,當不希望變量在每次執行完函數就消失的話,靜態變量 (static variable) 就派上用場了。上例中,使用 $mystr 變量之前,先在變量前面加上 static,即表示變量 $mystr 是靜態變量,當每次執行 myfunc() 函數時,$mystr 的值會一直增加,每執行一次就多一個哈字。若將 static 的靜態變量定義拿掉,就沒辦法累加哈字了。

<?php
// 不是靜態變量的例子 (錯誤的)
function myfunc() {
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>


再看一個比較實際的例子,它是處理表格的顏色,讓隔行的顏色不同。

<?php
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "<table border=1>\n";
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "<tr><td bgcolor=".$ColorStr.">這是第".$i."行</td></tr>\n";
}
echo "</table>";
?>


PHP 的變量使用技巧上,最令人覺得不可思議的則是變量的變量 (variable variable)。這是充分利用 PHP 特性玩出的特殊技巧

<?php
$a = "Hello";
$$a = "world";
echo "$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>


mdean@kcnet.com 舉出一個更絕的例子 (24-Apr-1999),他稱為變量的函數 (variable function)

<?php
function myCallbackFunction()
{
print("Hello from callback");
}

function myFunction($callback)
{
$callback();
}
// call to myFunction passing callback
// function as parameter
myFunction("myCallbackFunction");
?>


至於用戶在 form 中輸入的資料,要怎麼處理呢?要是在 PHP 的配置文件中,track_vars 設為 On 時,直接使用變量名字就好了。如下例,next.php 在執行時,系統會自動產生兩個變量 $username 及 $sex,直接使用就好了,比起傳統的 CGI 要自己解析,PHP 實在是太神奇了。

<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性別: <input type=text name="sex"><br>
<input type=submit>
</form>

由於 PHP 許\多語法都是 C 語言的翻版,故 PHP 在使用變量時,隨時都可以使用新的變量,只要在使用前將變量初始化就好了,不必像 Pascal 語言那樣嚴謹,所有要使用的變量都要事先定義。這當然有好處與壞處:好處是使用方便、自由;壞處就是常常因這些自由而付出相當大的代價調試。在程序碼短的 PHP 程序當然不成問題,當程序在數百數千行,甚至 include 或 require 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2026-10-29 06:06 , Processed in 0.031482 second(s), 15 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表