## 來自PHP之外的變量
### HTML表單(GET和POST)
當一個表單提交給PHP腳本時,表單中的信息會自動在腳本中可用。有很多方法訪問此信息,例如:
**Example #1 一個簡單的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>
~~~
根據特定的設置和個人的喜好,有很多種方法訪問 HTML 表單中的數據。例如:
**Example #2 從一個簡單的 POST HTML 表單訪問數據**
~~~
<?php
// 自 PHP 4.1.0 起可用
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// 自 PHP 5.0.0 起,這些長格式的預定義變量
// 可用 register_long_arrays 指令關閉。
echo $HTTP_POST_VARS['username'];
// 如果 PHP 指令 register_globals = on 時可用。不過自
// PHP 4.2.0 起默認值為 register_globals = off。
// 不提倡使用/依賴此種方法。
echo $username;
?>
~~~
使用 GET 表單也類似,只不過要用適當的 GET 預定義變量。GET 也適用于 *QUERY\_STRING*(URL 中在“?”之后的信息)。因此,舉例說,*http://www.example.com/test.php?id=3* 包含有可用 [$\_GET\['id'\]](http://php.net/manual/zh/reserved.variables.get.php) 來訪問的 GET 數據。
> Note:超全局數組例如:$_POST和$_GET,自PHP4.1.0起可用。
> Note:變量名中的點和空格被轉換成下劃線。例如 ** 變成了 *$\_REQUEST\["a\_b"\]*。
如上所示,在 PHP 4.2.0 之前 [register\_globals](http://php.net/manual/zh/ini.core.php#ini.register-globals) 的默認值是 *on*。PHP 社區鼓勵大家不要依賴此指令,建議在編碼時假定其為 *off*。
**Example #3 更復雜的表單變量**
```
<?php
if?(isset($_POST['action'])?&&?$_POST['action']?==?'submitted')?{
????echo?'<pre>';
????print_r($_POST);
????echo?'<a?href="'.?$_SERVER['PHP_SELF']?.'">Please?try?again</a>';
????echo?'</pre>';
}?else?{
?>
<form?action="<?php?echo?$_SERVER['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</option>
????</select><br?/>
????<input?type="hidden"?name="action"?value="submitted"?/>
????<input?type="submit"?name="submit"?value="submit?me!"?/>
</form>
<?php
}
?>
```
#### IMAGE SUBMIT 變量名
當提交表單時,可以用一幅圖像代替標準的提交按鈕,用類似這樣的標記:
~~~
<input type="image" src="image.gif" name="sub" />
~~~
當用戶點擊到圖像中的某處時,相應的表單會被傳送到服務器,并加上兩個變量 sub\_x 和 sub\_y。它們包含了用戶點擊圖像的坐標。有經驗的用戶可能會注意到被瀏覽器發送的實際變量名包含的是一個點而不是下劃線(即 sub.x 和 sub.y),但 PHP 自動將點轉換成了下劃線。
### HTTP Cookies
PHP 透明地支持 [??RFC 6265](http://www.faqs.org/rfcs/rfc6265)定義中的 HTTP cookies。Cookies 是一種在遠端瀏覽器端存儲數據并能追蹤或識別再次訪問的用戶的機制。可以用 [setcookie()](http://php.net/manual/zh/function.setcookie.php) 函數設定 cookies。Cookies 是 HTTP 信息頭中的一部分,因此 SetCookie 函數必須在向瀏覽器發送任何輸出之前調用。對于 [header()](http://php.net/manual/zh/function.header.php) 函數也有同樣的限制。Cookie 數據會在相應的 cookie 數據數組中可用,例如 [$\_COOKIE](http://php.net/manual/zh/reserved.variables.cookies.php),$HTTP\_COOKIE\_VARS 和 [$\_REQUEST](http://php.net/manual/zh/reserved.variables.request.php)。更多細節和例子見 [setcookie()](http://php.net/manual/zh/function.setcookie.php) 手冊頁面。
如果要將多個值賦給一個 cookie 變量,必須將其賦成數組。例如:
```
<?php
setcookie("MyCookie[foo]",'Testing 1', time()+3600);
setcookie("MyCookie[bar]",'Testing 2', time()+3600);
?>
```
這將會建立兩個單獨的cookie,盡管MyCookie在腳本中是一個單一的數組。如果想在僅僅一個cookie中設定多個值,考慮先在值上使用[serialize()](http://php.net/manual/zh/function.serialize.php) 或 [explode()](http://php.net/manual/zh/function.explode.php)。
注意在瀏覽器中一個cookie會替換掉一個同名的cookie,除非路徑或者域不同。因此對于購物車程序可以保留一個計數器并一起傳遞,例如:
**Example #4 一個**[setcookie()](http://php.net/manual/zh/function.setcookie.php) 的示例****
```
<?php
if(isset($_COOKIE['count'])){
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count',$count,time()+3600);
setcookie("Cart[$count]",$item,time()+3600);
```
### 變量名中的點
通常,PHP不會改變傳遞給腳本中的變量名。然而應該注意到點(句號)不是PHP變量名中的合法字符。至于原因,看看:
```
<?php
$varname.ext; /* 非法變量名 */
?>
```
這時,解析器看到是一個名為$varname的變量,后面跟著一個字符串連接運算符,后面跟著一個裸字符串(即沒有加引號的字符串,且不匹配任何已知的鍵名或保留字)'ext'。很明顯這不是想要的結果。
出于此原因,要注意PHP將會自動將變量名中的點替換成下劃線。
### 確定變量類型
因為PHP會判斷變量類型并在需要時進行轉換(通常情況下),因此在某一時刻給定的變量是何種類型并不明顯。PHP包含幾個函數可以判斷變量的類型,例如:[gettype()](http://php.net/manual/zh/function.gettype.php),[is\_array()](http://php.net/manual/zh/function.is-array.php),[is\_float()](http://php.net/manual/zh/function.is-float.php),[is\_int()](http://php.net/manual/zh/function.is-int.php),[is\_object()](http://php.net/manual/zh/function.is-object.php) 和 [is\_string()](http://php.net/manual/zh/function.is-string.php)。參見[類型](http://php.net/manual/zh/language.types.php)一章。
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)