# **PHP簡(jiǎn)明手冊(cè)**
## **變量 和 常量**
> 1. 變量和常量是PHP中最基本的數(shù)據(jù)存儲(chǔ)單元,它們可以存儲(chǔ)不同類(lèi)型的數(shù)據(jù);
> 2. PHP的變量或常量的數(shù)據(jù)類(lèi)型由程序的上下問(wèn)決定,跟強(qiáng)類(lèi)型語(yǔ)言(如:C等)由很大不同!
--------------------------------------------------------------------------------
### 什么是變量桂躏?
1. 變量是用于臨時(shí)存儲(chǔ)值的容器惨篱;
2. 這些值可以是數(shù)字栓拜、文本姓建,或者復(fù)雜得多的排列組合缓溅;
3. 變量又是指在程序的運(yùn)行過(guò)程中隨時(shí)可以發(fā)生變化的量蛇损,是程序中數(shù)據(jù)臨時(shí)存放的場(chǎng)所;
4. 簡(jiǎn)而言之:變量是用于跟蹤幾乎所有類(lèi)型信息的簡(jiǎn)單工具坛怪!
5. PHP 中的變量是用一個(gè)美元符號(hào)($)后面跟變量名來(lái)表示淤齐,變量名是區(qū)分大小寫(xiě)的。
- 變量名與PHP中其它的標(biāo)簽一樣遵循相同的規(guī)則袜匿,一個(gè)有效的變量名由字母或下劃線開(kāi)頭更啄,后面跟上任意數(shù)量的字母、數(shù)字居灯、或者下劃線
- 按照正則表達(dá)式來(lái)表述php變量名 `[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*`
- $this 是一個(gè)特殊的變量祭务,它不能被賦值
- php 提供了大量的預(yù)定義變量
- 許多變量依賴(lài)于運(yùn)行的服務(wù)器的版本和設(shè)置内狗,及其它因素
--------------------------------------------------------------------------------
### 什么式常量?
1. 常量是用于一些數(shù)據(jù)計(jì)算中固定的數(shù)值义锥;
2. 常量是一個(gè)簡(jiǎn)單值的標(biāo)識(shí)符(名字)柳沙;
3. 常量申明的類(lèi)型只能是標(biāo)量數(shù)據(jù)(`boolean` `integer` `float` `string`);
4. 在程序執(zhí)行期間一個(gè)常量一旦被定義,就不能再改變或者取消定義(除了所謂的魔術(shù)常量拌倍,它們其實(shí)不是常量)赂鲤;
5. 常量默認(rèn)為大小寫(xiě)敏感。傳統(tǒng)上常量標(biāo)識(shí)符總是大寫(xiě)的贰拿。
- 按照正則表達(dá)式來(lái)表述php常量名 `[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*`
6. 常量的作用于是全局的(這是用它的主要原因)
- 可以在腳本的任何地方什么和訪問(wèn)到常量
7. PHP 中可以用 `define()` 函數(shù)來(lái)定義常量:
- php 5.3 以后可以使用const關(guān)鍵字在類(lèi)定義之外定義常量
- php 中常量不僅可以自定義蛤袒,而且php默認(rèn)提供了大量預(yù)定定義常量
- php 中也提供的一些比較實(shí)用的 魔術(shù)常量(它們其實(shí)不是常量)
--------------------------------------------------------------------------------
### 常量與變量有哪些區(qū)別?
1. 常量前面沒(méi)有美元符號(hào)($)膨更;
2. 常量只能使用 `define()` 函數(shù)定義妙真,而不能通過(guò)賦值語(yǔ)句;
3. 常量可以不用理會(huì)變量的作用域荚守,而在任何地方定義和訪問(wèn)珍德;
4. 常量一旦定義就不能被重新定義或取消定義;
5. 常量的值只能是標(biāo)量(`boolean` `integer` `float` `string`);
--------------------------------------------------------------------------------
### **變量的范圍**
> 1. 變量的范圍也就是它的生效范圍
> 2. 大部分的 php 變量只有一個(gè)單獨(dú)的使用范圍矗漾,包含了 `include` `require` 引入的文件锈候;
> 3. 當(dāng)一個(gè)變量執(zhí)行賦值動(dòng)作后,會(huì)隨著申明區(qū)域位置的差異而有不同的使用范圍敞贡;
> 4. 大致上來(lái)說(shuō):變量會(huì)依據(jù)申明的位置分為局部變量和全局變量?jī)煞N泵琳。
#### **局部變量**
1. 局部變量也稱(chēng)內(nèi)部變量,是在函數(shù)內(nèi)部申明的變量誊役;
- 作用域僅限于函數(shù)內(nèi)部获列,離開(kāi)該函數(shù)后再使用這種變量是非法的
2. 為申明函數(shù)設(shè)置的參數(shù)因?yàn)橹荒茉诒竞瘮?shù)的內(nèi)部使用,所以也是局部變量蛔垢;
- `func_test("參數(shù)1", "參數(shù)2");`
- 函數(shù)的參數(shù)具體數(shù)值從函數(shù)外部獲得(函數(shù)被調(diào)用傳入的值)击孩,作用域僅限于函數(shù)內(nèi)部
- 直接在函數(shù)中申明的變量只能在內(nèi)部被賦值,作用域僅限于函數(shù)內(nèi)部
3. 每次函數(shù)被調(diào)用時(shí)鹏漆,函數(shù)內(nèi)部的變量才被申明巩梢,執(zhí)行完畢后函數(shù)內(nèi)部的變量都被釋放。
#### **全局變量**
1. 全部變量也稱(chēng)外部變量艺玲,是在函數(shù)外部定義的括蝠;
- 作用域:從變量定義出開(kāi)始,到本程序文件的末尾
2. php中的全局變量與其它變成語(yǔ)言不同
- 在php中饭聚,由于函數(shù)可以視為單獨(dú)的程序片段忌警,所以局部變量會(huì)覆蓋全局變量的能見(jiàn)度,因此在函數(shù)中無(wú)法直接調(diào)用全局變量
3. 函數(shù)如何使用全局變量若治?
- 在函數(shù)內(nèi)部利用 `global` 關(guān)鍵字定義指定的全局變量:
```php
- `預(yù)定義變量` 又稱(chēng) `超全局變量` `超全局?jǐn)?shù)組`
> - 超全局?jǐn)?shù)組(變量)慨蓝,在PHP的腳本中,已經(jīng)申明完成的變量端幼,你可以直接就去使用即可礼烈!變量的名字已經(jīng)規(guī)定好的了
> - 對(duì)于全部腳本而言, PHP提供了大量的預(yù)定義變量婆跑。這些變量將所有的 `外部變量(包括來(lái)自 PHP 之外的變量,如表單提交 )` 表示成內(nèi)建環(huán)境變量此熬,并且將錯(cuò)誤信息表示成返回頭。
預(yù)定義變量名? ? ? | 預(yù)定義變量值? ? ? ? ? | 說(shuō)明
----------- | --------------- | --------------------------------------------------------------------------------------------------------------
`$GLOBALS`? | 引用全局作用域中可用的全部變量 | 一個(gè)包含了全部變量的全局組合數(shù)組滑进,變量的名字就是數(shù)組的鍵
`$_SERVER`? | 服務(wù)器和執(zhí)行環(huán)境信息? ? ? | 一個(gè)包含了諸如頭信息(header)犀忱、路徑(path)以及腳本位置等信息的數(shù)組
`$_GET`? ? | HTTP GET 變量? ? | 通過(guò) `URL` 參數(shù)傳遞給當(dāng)前腳本的變量的數(shù)組
`$_POST`? ? | HTTP POST 變量? ? | 當(dāng)HTTP POST請(qǐng)求的 `Content-Type` 是 `application/x-www-form-urlencoded` 或 `multipart/form-data` 時(shí),會(huì)將變量以關(guān)聯(lián)數(shù)組形式傳入當(dāng)前腳本
`$_FILES`? | HTTP 文件上傳變量? ? | 通過(guò) `HTTP POST` 方式上傳到當(dāng)前腳本的項(xiàng)目的數(shù)組
`$_COOKIE`? | HTTP Cookies? ? | 通過(guò) `HTTP Cookies` 方式傳遞給當(dāng)前腳本的變量的數(shù)組
`$_SESSION` | Session 變量? ? ? | 當(dāng)前腳本可用 `SESSION` 變量的數(shù)組
`$_REQUEST` | HTTP Request 變量 | 默認(rèn)情況下包含了 `$_GET` `$_POST` 和 `$_COOKIE`的數(shù)組
`$_ENV`? ? | 環(huán)境變量? ? ? ? ? ? | 通過(guò)環(huán)境方式傳遞給當(dāng)前腳本的變量數(shù)組
--------------------------------------------------------------------------------
### **PHP 中常見(jiàn)的預(yù)定義常量**
1. 在 PHP 中扶关,除了可以自己定義常量阴汇,還預(yù)定義了一系列系統(tǒng)常量,可以在程序中直接使用來(lái)完成一些特殊功能节槐;
2. 不過(guò)很多常量都是由不同的擴(kuò)展庫(kù)定義的搀庶,只有在加載了這些擴(kuò)展庫(kù)時(shí)才會(huì)出現(xiàn):
- 或者動(dòng)態(tài)加載后
- 或者在編譯 PHP 時(shí)已經(jīng)包括進(jìn)去了
- 這些分布在不同擴(kuò)展模塊中的預(yù)定義常量有多種不同的開(kāi)頭,決定了各種不同的類(lèi)型
const name? ? ? ? ? ? ? ? | const value? ? ? ? | const info
------------------------- | ------------------- | ---------------------
`__PHP_OS__`? ? ? ? ? ? ? | `UNIX` OR `WINNT`? | 執(zhí)行PHP解析的操作系統(tǒng)名稱(chēng)
`__PHP_VERSION__`? ? ? ? | 5.2.6? ? ? ? ? ? ? | 當(dāng)前 PHP 服務(wù)器的版本
`__TRUE__`? ? ? ? ? ? ? ? | TURE? ? ? ? ? ? ? ? | 代表布爾值铜异, 真
`__FALSE__`? ? ? ? ? ? ? | FALSE? ? ? ? ? ? ? | 代表布爾值哥倔, 假
`__NULL__`? ? ? ? ? ? ? ? | NULL? ? ? ? ? ? ? ? | 代表空值
`__DIRECTORY_SEPARATOR__` | `\` OR `/`? ? ? ? ? | 根據(jù)操作系統(tǒng)決定目錄的分隔符
`__PATH_SEPARATOR__`? ? ? | `;` OR `:`? ? ? ? ? | 根據(jù)操作系統(tǒng)決定環(huán)境變量的的目錄列表分隔符
`__E_ERROR__`? ? ? ? ? ? | 1? ? ? ? ? ? ? ? ? | 錯(cuò)誤,導(dǎo)致 PHP 腳本運(yùn)行終止
`__E_WARNING__`? ? ? ? ? | 2? ? ? ? ? ? ? ? ? | 警告揍庄,不會(huì)導(dǎo)致 PHP 腳本運(yùn)行終止
`__E_PARSE__`? ? ? ? ? ? | 4? ? ? ? ? ? ? ? ? | 解析錯(cuò)誤咆蒿,有程序解析器報(bào)告
`__E_NOTICE__`? ? ? ? ? ? | 8? ? ? ? ? ? ? ? ? | 非關(guān)鍵的錯(cuò)誤,例如變量未初始化
`__M_PI__`? ? ? ? ? ? ? ? | 3.141 592 653 589 8 | 數(shù)學(xué)中的 π
--------------------------------------------------------------------------------
### **PHP 中的魔術(shù)常量**
1. php 中還有幾個(gè)常量會(huì)根據(jù)它們使用的位置而改變蚂子,這樣的常量在 php 中被稱(chēng)為 `魔術(shù)常量` 沃测;
2. php `魔術(shù)常量` 不區(qū)分大小寫(xiě)
常量名? ? ? ? ? ? | 常量值? ? ? | 說(shuō)明
--------------- | --------- | ---------------------
`__FILE__`? ? ? | 當(dāng)前的文件名? ? | 在哪個(gè)文件中使用,就代表哪個(gè)文件名稱(chēng)
`__LINE__`? ? ? | 當(dāng)前的行數(shù)? ? | 在代碼的哪行使用缆镣,就代表哪行的行號(hào)
`__FUNCTION__`? | 當(dāng)前的函數(shù)名? ? | 在哪個(gè)函數(shù)中時(shí)間芽突,就代表哪個(gè)函數(shù)名
`__CLASS__`? ? | 當(dāng)前的類(lèi)名? ? | 在哪個(gè)類(lèi)中使用,就代表哪個(gè)類(lèi)的類(lèi)名
`__METHOD__`? ? | 類(lèi)下面的當(dāng)前方法名 | 在類(lèi)下面的哪個(gè)方法中使用董瞻,就代表這個(gè)方法名
`__DIR__`? ? ? | 當(dāng)前目錄名? ? | 在哪個(gè)文件下使用寞蚌,就代表哪個(gè)文件名
`__TRAIT__`? ? | 不常用? ? ? | 不常用
`__NAMESPACE__` | 當(dāng)前命名空間名? | 當(dāng)前命名空間的名稱(chēng)
--------------------------------------------------------------------------------