第二章 變 量
PHP支持下面類型的變量:
(一)、內部變量
主要有整數(interger),浮點數(float-point numbers),字符串(string),數組(array),對象(object)。
1 初始化變量
要在
PHP中初始化變量, 你只要簡單的給它賦值即可。對於大多數類型,這是最直接的。對於數組和對象,可以使用其它方法。
2 初始化數組
數組可以使用這兩種方法之一來賦值: 使用一系列連續數值,或使用array()函數構造 (見 Array functions 部分)。
要將連續的數值加進數組,你只需將要賦值賦給不帶下標的數組變量。該值會作為數組的最後元素加進數組中。
例:
$names[] = "Jill"; // $names[0] = "Jill"
$names[] = "Jack"; // $names[1] = "Jack"
與c、perl相似,數組下標也是從0開始。
3 初始化對象
要初始化一個對象,需用new語句建立該類型的變量。
class foo {
function do_foo() {
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
4 變量作用域
變量的作用域就是它的有效范圍。對於大多數PHP的變量只有一個作用域。在用戶自定義函數裡采用局部變量作用域。函數內使用的變量被缺省設置為局部變量。例如:
$a=1; /* global scope */
Function Test() {
echo $a; /* reference to local scope variable */
}
Test();
這段程序不會輸出任何的東西,因為echo語句要輸出局部變量 $a ,而函數內的 $a 從未被賦過值。你可能注意到這和C語言有點小小的區別,C中全局變量可以直接在函數內引用,除非它被一個局部變量所覆蓋。而這使得人們可能不注意修改了全局變量的值。在PHP中要在函數內部使用全局變量必須顯式的說明。
例如: $a=1;
$b=2;
Function Sum() {
global $a,$b;
$b = $a + $b;
}
Sum();
echo $b;
上面程序將輸出"3"。通過在函數內部聲明$a和$b是全局變量,所要變量都參考全局。一個函數可以操縱的全局變量的數量沒有限制。
作用域的另外一個值得注意的地方是static 變量。一個 static變量存在於局部函數中,但當程序離開這個函數時它的值不會丟失。考慮下面的例子:
Function Test() {
$a=0;
echo $a;
$a++;
}
這個函數是沒用的,因為每次調用時它都先把$a賦為 0 然後打出"0"。 對$a++的自加沒有任何效果因為函數調用結束後變量$a 就被釋放了。要使記數程序有效記數而不丟掉當前的記數結果,$a 要聲名為static變量:
Function Test() {
static $a=0;
echo $a;
$a++;
}
現在,每次調用Test()函數它都會打出$a的值並把增加它的值。
當使用遞歸函數時靜態變量是必不可少的。遞歸函數就是調用自己的函數。寫遞歸函數時一定要十分小心,因為它的循環次數不確定。你必須確保有足夠的條件結束遞歸過程。下面是一個簡單的遞歸函數記數到10:
Function Test() {
static $count=0;
$count++;
echo $count;
if($count < 10) {
Test();
}
}
(二) 動態變量
有時使用可變的變量名比較方便。就是說,一個能夠被動態賦值和使用的變量名。一個普通變量的賦值語句如:
$a = "hello";
一個動態變量引用該變量的值作為一個新變量的名字。在上面例中, hello,可以通過雙$用做變量名。例: 字串8
$$a = "world";
至此,兩個變量被定義並存貯在PHP符號樹中: $a 的內容是"hello",$hello 的內容是 "world"。 因此,語句: echo "$a ${$a}"; 的顯示結果完全等同於: echo "$a $hello";
(三)PHP外部變量
1、Html表單(GET和POST)
當一個表單提交給PHP script時,PHP會自動得到表單中的變量。例如:
<form action="foo.PHP" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>
當按下”submit”後,PHP會自動產生變量:$name,其中包含了用戶輸入的所有內容。
2、IMAGE SUBMIT 變量名
當提交一個表單時,可以通過下面標記用一副圖代替標准的提交按鈕:
<input type=image src="image.gif" name="sub">
當用戶點擊該圖時,兩個附加變量sub_x和sub_y就會伴隨表單一起送到server上。其中包含了用戶在圖上點擊處的坐標。有經驗的人可能注意到浏覽器實際送出的名字包含一個句號而不是下劃線,但PHP自動將句號轉換成了下劃線。
3、HTTP CookIEs
PHP支持HTTP cookies。CookIEs在客戶端浏覽器存儲數據,以此和用戶保持聯絡或驗證用戶身份。你可以使用setcookie() 函數來設置cookies。 CookIEs是HTTP請求頭的一部分,所以必須在任何輸出數據返回給用戶浏覽器前調用SetCookie()函數。它類似於 Header() 函數的限制。任何用戶端返回的cookIEs都將被自動轉換為標准的PHP變量,就象GET和POST方法的數據。
如果要在一個 cookie中設置多個值,要給這個cookIE的名字加上 [] ,例如:
SetCookie("MyCookIE[]","Testing", time()+3600);
注意:新的cookIE將覆蓋掉你的浏覽器中已有的同名cookIE,除非它們具有不同的路徑或域。
4、環境變量
PHP自動將環境變量轉換為普通的變量。
echo $HOME; /* Shows the HOME environment variable, if set. */
盡管來自GET,POST 及 CookIE結構的信息也會被自動轉化為PHP的變量, 但最好明確的從環境變量中讀取它們以確保獲得正確的值。為此可使用 getenv() 函數。也可以通過 putenv() 函數設置變量。
變量類型轉換
PHP中不需要(也不支持)在變量定義時做顯式的類型聲明;一個變量的類型取決於它的值的類型。也就是說,如果你給變量var 賦了一個字符串值,var 就成為字符串變量。如果你又賦了一個整型值給var, 它就變成了一個整型變量。
一個PHP自動類型轉換的例子是加法操作符 '+'。如果任何一個操作數是double型,則所有的操作數按 double類型來計算, 結果也是double型的。否則,所有的操作數按integer類型來計算, 結果也是integer型的。注意:操作數本身的類型不發生變化;類型變換僅在計算時做
$foo = "0"; // $foo is a string (ASCII 48)
$foo++; // $foo is the string "1" (ASCII 49)
$foo += 1; // $foo is now an integer (2)
$foo = $foo + 1.3; // $foo is now a double (3.3)
$foo = 5 + "10 Little PiggIEs"; // $foo is a double (15)
$foo = 5 + "10 Small Pigs"; // $foo is an integer (15)
要改變變量的類型,也可用settype() 函數。
1、強制類型轉換
PHP中的強制類型轉換和C中一樣: 在需要進行類型強制轉換的變量前的括號中寫出想要的類型名。
$foo = 10; // $foo is an integer
$bar = (double) $foo; // $bar is a double
允許的強制轉換是:
(int), (integer) - cast to integer
(real), (double), (float) - cast to double
(string) - cast to string
(array) - cast to array
(object) - cast to object
注意:括號中可以含有tab或空格,下面的函數將被計算:
$foo = (int) $bar;
$foo = ( int ) $bar;
2、字符串轉換
當字符串作為數值類型計算時,結果的值和類型按以下方式決定。
如果字符串中包含任何'.', 'e',及'E'字符,則被作為double類型計算。否則,就作為integer類型計算。
該值從字符串最開始算起。如果字符串是合法的數字,則使用該值,否則值為 0 。合法的數字是一個符號位(可選),後跟一位或幾位數字(也可含有一個十進制的小數點), 後跟一位可選的指數。指數是一個 'e' 或 'E'後跟一個或幾個數字。
$foo = 1 + "10.5"; // $foo is a double (11.5)
$foo = 1 + "-1.3e3"; // $foo is a double (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is a double (1)
$foo = 1 + "bob3"; // $foo is an integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is an integer (11)
$foo = 1 + "10 Little PiggIEs"; // $foo is a double (11); the string contains 'e'