初學者來看:在PHP關於變數的使用介紹

來源:互聯網
上載者:User

就像大部份的結構化程式,有所謂的全域變數與局部變數,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 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。