官术网_书友最值得收藏!

2.3 常量和變量

常量和變量是編程語言的最基本構成元素,代表了運算中所需要的各種值。通過變量和常量,程序才能對各種值進行訪問和運算。常量和變量的功能就是用來存儲數據的,但區別在于常量一旦初始化就不再發生變化,可以理解為符號化的常數。本節介紹PHP中的常量和變量。

2.3.1 PHP中的常量

常量是指在程序執行過程中無法修改的值。在程序中處理不需要修改的值時,常量非常有用,例如定義圓周率PI。常量一旦定義,在程序的任何地方都不可以修改,但是可以在程序的任何地方訪問。

在PHP中使用define()函數定義常量。該函數有3個參數,第1個參數表示常量名,第2個參數表示常量的值。

name:必選參數,常量名稱,即標識符。

value:必選參數,常量的值。

case_insensitive:可選參數,如果設置為True,則該常量不區分大小寫,不設置則默認是區分大小的。

常量在定義后,可以在運行腳本的任何地方使用。

例如,下面定義一個名為HOST的常量,如圖2-8所示。

圖2-8 定義常量

<?php

define("HOST","www.baidu.com"); //將值“www.baidu.com”賦予常量HOST

echo HOST; //輸出HOST常量的值

?>

如圖2-8所示。

常量說明如下。

常量默認區分大小寫,按照慣例,常量標識符總是大寫。常量名和其他任何PHP標記遵循相同的命名規則。合法的常量名以字母或下畫線開始,后面跟任何字母、數字或下畫線。

PHP的系統常量包括5個魔術常量和大量的預定義常量。

魔術常量會根據它們使用的位置而改變,PHP提供的5個魔術常量分別如下。

(1)_LINE_:表示文件中的當前行號。

(2)_FILE_:表示文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自PHP 4.0.2起,_FILE_總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。

(3)_FUNCTION_:表示函數名稱(PHP 4.3.0新加)。自PHP 5起,該常量返回該函數被定義時的名字(區分大小寫)。在PHP 4中,該值總是小寫字母的。

(4)_CLASS_:表示類的名稱(PHP 4.3.0新加)。自PHP 5起,該常量返回該類被定義時的名字(區分大小寫)。在PHP 4中,該值總是小寫字母的。

(5)_METHOD_:表示類的方法名(PHP 5.0.0新加)。返回該方法被定義時的名字(區分大小寫)。

預定義常量分為內核預定義常量和標準預定義常量兩種,內核預定義常量在PHP的內核、Zend引擎和SAPI模塊中定義,而標準預定義常量是PHP默認定義的,比如常用的E_ERROR、E_NOTICE、E_ALL等。

2.3.2 PHP中的變量

變量是指在程序的運行過程中隨時可以發生變化的量。在代碼中可以只使用一個變量,也可以使用多個變量。變量中可以存放單詞、數值、日期及屬性等。變量的值是臨時的,當程序運行的時候,該值是存在的;如果程序結束,變量的值就會丟失。雖然在前面的示例中也使用到了變量,但是沒有詳細說明,本小節將詳細介紹如何創建以及引用變量。

在PHP中,創建一個變量首先需要定義變量的名稱。變量名區分大小寫,總是以$符號開頭,然后是變量名。如果在聲明變量時忘記變量前面的$符號,那么該變量將無效。在PHP中設置變量的正確方法如下所示。

$var_name=value;

1.定義變量

在PHP中給變量賦值有兩種方式,分別為值賦值和引用賦值。

值賦值是直接把一個數值通過賦值表達式傳遞給變量,會把該變量原來的數值覆蓋,如果在聲明變量時沒有賦值,則其行為就形同NULL。在聲明變量時賦值是一種常用的變量的賦值方法,使用示例如下。

<?php

$name="baidu"; //有效變量

$Name="website"; //有效變量

echo"$name,$Name"; //輸出為“baidu,website”

$1website="www.baidu.com"; //無效變量,以數字開始

$_1website="www.baidu.com"; //有效變量

?>

從上述代碼中可以看到,在PHP中不需要在設置變量之前聲明該變量的類型,而是根據變量設置的方式,系統自動把變量轉換為正確的數據類型。

在PHP中,標識符的命名必須符合下面的規定。

(1)標識符可以由一個或多個字符組成,但必須以字母或下畫線開頭。此外,標識符只能由字母、數字、下畫線字符和從127到255的其他ASCII字符組成。如my_a、Ss、_value這些標識符名稱都是合法的,而q^a、4tt這些變量的名稱是不合法的。

(2)標識符區分大小寫。因此,變量$recipe不同于變量$Recipe、$rEciPe不同于$recipE。

(3)標識符可以是任意長度。這很有優勢,因為這樣一來,程序員就能通過標識符名準確地描述標識符的用途。

(4)標識符名稱不能與任何PHP預定義關鍵字相同。

在PHP中,變量的命名規則有如下幾點。

(1)變量名必須以字母或下畫線“_”開頭。

(2)變量名只能包含字母、數字、字符及下畫線。

(3)變量名不能包含空格。如果變量名由多個單詞組成,那么應該使用下畫線進行分隔(例如$my_string),或者以大寫字母開頭(例如$myString)。

PHP還支持另一種賦值方式,稱為變量的引用賦值,例如下面的示例。

<?php

$wo=' baidu'; //為變量$wo賦值

$ba=&$wo; //變量$ba引用了變量$wo的值

$ba="Web site is$ba"; //修改變量$ba的值

echo$wo; //結果為“Web site is baidu”

echo$ba; //變量$ba的值也被修改,結果與$ba相同

?>

從這里可以看出,對一個變量值的修改將會導致對另外一個變量值的修改。從本質上講,變量的引用賦值導致兩個變量指向同一個內存地址。因此,不論對哪一個變量進行修改,修改的都是同一個內存地址中的數據,從而出現同時被修改的結果。

PHP提供了大量的預定義變量,這些變量在任何范圍內自動生效,因此通常也被稱為自動全局變量(Autoglobals)或者超全局變量(Superglobals)(PHP中沒有用戶自定義超全局變量的機制)。在PHP 4.1.0之前,如使用超全局變量,人們要么依賴register_globals,要么就是長長的預定義PHP數組($HTTP_?_VARS)。自PHP 5.0.0起,長格式的PHP預定義變量可以通過設置register_long_arrays來屏蔽。

常用的超全局變量如下。

(1)$GLOBALS:包含一個引用指向每個當前腳本的全局范圍內有效的變量。該數組的鍵名為全局變量的名稱。從PHP 3開始存在$GLOBALS數組。

(2)$_SERVER:變量由Web服務器設定或者直接與當前腳本的執行環境相關聯。類似于舊數組$HTTP_SERVER_VARS(依然有效,但反對使用)。

(3)$_GET:通過URL請求提交至腳本的變量。類似于舊數組$HTTP_GET_VARS(依然有效,但反對使用)。

(4)$_POST:通過HTTP POST方法提交至腳本的變量。類似于舊數組$HTTP_POST_VARS(依然有效,但反對使用)。

(5)$_COOKIE:通過HTTP Cookies方法提交至腳本的變量。類似于舊數組$HTTP_COOKIE_VARS(依然有效,但反對使用)。

(6)$_FILES:通過HTTP POST文件上傳而提交至腳本的變量。類似于舊數組$HTTP_POST_FILES(依然有效,但反對使用)。

(7)$_ENV:執行環境提交至腳本的變量。類似于舊數組$HTTP_ENV_VARS(依然有效,但反對使用)。

(8)$_REQUEST:通過GET、POST和COOKIE機制提交至腳本的變量,因此該數組并不值得信任。所有包含在該數組中的變量的存在與否以及變量的順序均按照php.ini中的variables_order配置指示來定義。此數組在PHP 4.1.0之前沒有直接對應的版本。

(9)$_SESSION:當前注冊給腳本會話的變量。類似于舊數組$HTTP_SESSION_VARS(依然有效,但反對使用)。

2.變量作用域

聲明變量的位置決定了變量的作用域,變量的作用域決定了程序的哪些部分可以訪問該變量,哪些部分不可以訪問該變量。在PHP中,變量的作用域范圍可以分為4類:局部變量、函數參數、全局變量和靜態變量,這里介紹一下變量的這幾種作用域范圍。

(1)局部變量。在一個函數中聲明的變量是這個函數的局部變量,也就是說,該變量只能被函數內部成員訪問,函數外部成員不能訪問該變量,并且不可見。默認情況下,函數內部成員不能訪問函數外定義的變量(平常所說的全局變量)。有時局部變量很有用,因為局部變量能夠消除出現意外副作用的可能性,否則這些副作用將導致可全局訪問的變量被有意或無意地修改。下面是一個使用局部變量的示例。

執行結果如下所示:

200

10

由輸出結果可知,該段代碼輸出了兩個不同的值,這是因為函數AddCount()中的變量為局部變量,修改局部變量的值不會影響函數外部的任何值,函數中的變量在程序結束時被拋棄,所以全局變量值還是10。

(2)函數參數。在PHP中,函數可以接收相應的參數。雖然這些參數接收函數外部的值,但退出函數后就無法訪問這些參數。在函數執行結束后,參數的值就會消失,和函數的執行有很大的關系。函數參數在函數后面的括號內聲明,運用函數參數的示例如下。

執行該段代碼,執行結果如下所示:

年齡是:21

班級是:計算機技術與科學系17級2班

函數參數也可以稱為是局部變量,意味著這些參數只在函數內部起作用,在函數的外部不能訪問這些變量。同樣,當函數執行結束時,變量同樣也會撤銷。

(3)全局變量。全局變量可以在整個PHP程序中的任何地方訪問,但是如果要修改一個全局變量,必須在修改該變量的函數中顯式聲明為全局變量。在函數中顯式聲明全局變量很簡單,只需使用global關鍵字聲明就可以。下面是一個使用全局變量的示例。

執行結果如下所示:

200

如果不在$num前加global,則該變量會被認為是局部變量,此時頁面上顯示的值為0;添加global后,就可以修改全局變量了。聲明全局變量還有另外一種方法,那就是使用PHP的$GLOBALS數組,使用該數組和使用global的效果一樣。下面是一個使用$GLOBALS數組的示例:

執行結果如下所示:

值是:200

在使用全局變量時一定要注意,因為使用全局變量很容易發生意外。

(4)靜態變量。靜態變量在兩次調用函數之間其值不變,靜態變量僅在局部函數域中聲明。用關鍵字static可以聲明一個靜態變量。靜態變量在函數退出時不會丟失值,并且再次調用此函數時還能保留值。下面是一個使用靜態變量的示例。

執行結果如下所示:

變量num的值是:10

靜態變量的值是:1

靜態變量的值是:2

由于在函數中指明了變量為靜態變量,因此在執行函數時保留了前面的值。

2.3.3 PHP數據類型

數據是程序運行的基礎,所有的程序都是在處理各種數據。例如,財務統計系統所要處理的員工工資額,論壇程序所要處理的用戶名、密碼、用戶發帖數等,所有這些都是數據。在編程語言中,為了方便對數據的處理及節省有限的內容資源,需要對數據進行分類。PHP支持7種原始類型,分別如下。

(1)boolean(布爾型True/False)。

(2)integer(整數類型)。

(3)float(浮點型,也稱為double,可用來表示實數)。

(4)string(字符串類型)。

(5)array(數組同一變量保存同類型的多條數據)。

(6)object(對象)。

(7)特殊類型(resource資源和NULL未設定)。

下面介紹常用的數據類型。

1.布爾型boolean

布爾型是最簡單的類型,它表達了真值,可以為True或False。要指定一個布爾值,可使用關鍵字True或False,并且True或False不區分大小寫。例如:

$pay=true;//給變量$pay賦值為True

某些運算通常返回布爾值,并將其傳遞給控制流程。例如用比較運算符(==)來比較兩個運算數,如果相等,則返回True,否則返回False,代碼如下:

對于如下的代碼:

可以使用下面的代碼代替:

轉換成布爾型可用bool或者boolean來強制轉換。但是很多情況下不需要用強制轉換,因為當運算符、函數或者流程控制需要一個布爾參數時,該值會被自動轉換。

當轉換為布爾型時,以下值被認為是False。

(1)布爾值False。

(2)整型值0(零)。

(3)浮點型值0.0(零)。

(4)空白字符串和字符串“0”。

(5)沒有成員變量的數組。

(6)沒有單元的對象(僅適用于PHP 4)。

(7)特殊類型NULL(包括尚未設定的變量)。

所有其他值都被認為是True(包括任何資源)。

2.整型integer

一個整型值是集合Z={…,-2,-1,0,1,2,…}中的一個數。整型值可以用十進制、十六進制或八進制表示,前面可以加上可選的符號(-或者+)。如果用八進制,則數字前必須加上0(零);用十六進制,數字前必須加上0x。整型值的字長和平臺有關,大約是二十億(32位有符號)。PHP不支持無符號整數。如果給定的一個數超出了整型的范圍,將會被解釋為浮點型。同樣,如果執行的運算結果超出了整型范圍,也會返回浮點型。

要將一個值轉換為整型,可用int或integer強制轉換。不過大多數情況下都不需要強制轉換,因為當運算符、函數或流程控制需要一個整型參數時,值會自動轉換。還可以通過函數intval()來將一個值轉換成整型。

從布爾型轉換成整型,False將產生0,True將產生1。當從浮點數轉換成整型時,數字將被取整(丟棄小數位)。如果浮點數超出了整型范圍,則結果不確定,因為沒有足夠的精度使浮點數給出一個確切的整型結果。

3.浮點型float

浮點數也叫雙精度數或實數,可以用以下任何語法定義。

浮點數的字長和平臺相關,通常最大值是1.8e308,并具有14位十進制數字的精度。

4.字符串string

字符串是由引號括起來的一些字符,常用來表示文件名、顯示消息、輸入提示符等。字符串是一系列字符,字符串的大小沒有限制。字符串可以用單引號、雙引號或定界符3種方法定義,下面分別介紹這3種方法。

(1)單引號。指定一個簡單字符串的最簡單的方法是用單引號(')括起來。例如:

如果字符串中有單引號,要表示這樣一個單引號,和很多其他語言一樣,需要用反斜線(\)轉義。例如:

如果在單引號之前或字符串結尾需要出現一個反斜線(\),則需要用兩個反斜線(\\)表示。例如:

對于單引號(')括起的字符串,PHP只懂得單引號和反斜線的轉義序列。如果試圖轉義任何其他字符,則反斜線本身也會被顯示出來。另外,還有不同于雙引號和定界符的很重要的一點就是,單引號字符串中出現的變量不會被解析。

(2)雙引號。如果用雙引號(")括起字符串,則PHP懂得更多特殊字符的轉義序列(如表2-1所示)。

表2-1 轉義字符

如果試圖轉義任何其他字符,則反斜線本身也會顯示出來。雙引號字符串最重要的一點是能夠解析其中的變量。

(3)定界符。另一種給字符串定界的方法使用定界符語法(<<<)。應該在<<<之后提供一個標識符,接著是字符串,最后是同樣的標識符結束字符串。例如:

在此段代碼中,標識符命名為abc。結束標識符必須從行的第一列開始。標識符所遵循的命名規則是:只能包含字母、數字、下畫線,而且必須以下畫線或非數字字符開始。

定界符文本表現的就和雙引號字符串一樣,只是沒有雙引號。這意味著在定界符文本中不需要轉義引號,不過仍然可以用以上列出的轉義代碼,變量也會被解析。

在以上的3種定義字符串的方法中,若使用雙引號或者定界符定義字符串,則其中的變量會被解析。

5.數組array

PHP中的數組實際上是一個有序圖,圖是一種把值(value)映射到鍵(key)的類型。新建一個數組可使用array()語言結構,它接收一定數量用逗號分隔的鍵-值對。

語法如下:

array([key=>]value,...)

其中,鍵key可以是整型或者字符串,值value可以是任何類型,如果值又是一個數組,則可以形成多維數組的數據結構。例如:

此段代碼的輸出為:

列名是id、username、password

如果省略了鍵key,則會自動產生從0開始的整數索引。上面的代碼可以改寫為:

此段代碼的輸出仍為:

列名是id、username、password

如果key是整數,則下一個產生的key將是目前最大的整數索引加1。如果指定的鍵已經有了值,則新值會覆蓋舊值。再次改寫上面的代碼為:

此段代碼的輸出仍為:

列名是id、username、password

定義數組的另一種方法是使用方括號的語法,通過在方括號內指定鍵名來給數組賦值來實現。也可以省略鍵,在這種情況下需給變量名加上一對空的方括號([])。

語法如下:

$arrayName[key]=value;

$arrayName[]=value;

其中,鍵key可以是整型或者字符串,值value可以是任何類型。例如:

此段代碼的輸出仍為:

列名是id、username、password

如果給出方括號但沒有指定鍵,則取當前最大整數索引值,新的鍵將是該值加1。如果當前還沒有整數索引,則鍵將為0。如果指定的鍵已經有值了,則該值將被覆蓋。

對于任何類型——布爾、整型、浮點、字符串和資源,如果將一個值轉換為數組,則將得到一個僅有一個元素的數組(其下標為0),該元素即為此標量的值。如果將一個對象轉換成一個數組,則所得到的數組的元素為該對象的屬性(成員變量),其鍵為成員變量名。如果將一個NULL值轉換成數組,則將得到一個空數組。

6.對象object

使用class定義一個類,然后使用new類名(構造函數參數)來初始化類的對象。該數據類型將在后面的實例中具體應用時進行解析。

7.其他數據類型

除了以上介紹的6種數據類型,還有資源和NULL兩種特殊類型。下面簡單介紹一下資源和NULL兩種特殊類型。

(1)資源。資源是通過專門函數來建立和使用的一個特殊變量,保存了外部資源的一個引用。可以保存打開文件、數據庫連接、圖形畫布區域等的特殊句柄,無法將其他類型的值轉換為資源。資源大部分可以被系統自動回收。

(2)NULL。NULL類型只有一個值,就是大寫的關鍵字NULL。特殊的NULL值表示一個變量沒有值。

例如:

結果是什么?

在3種情況下,變量被認為是空值:

●變量沒有被賦值;

●變量被賦值為NULL、0、False或者空字符串;

●變量在非空值的情況下被unset()函數釋放。

2.3.4 數據類型轉換

在PHP中,若要進行數據類型的轉換,就要在轉換的變量之前加上用括號括起來的目標類型。在變量定義中不需要顯式的類型定義,變量類型是根據使用該變量的上下文決定的。

例如通過類型轉換,可將變量或其所附帶的值轉換成另外一種類型,如圖2-9所示。

圖2-9 數據類型轉換

<?php

$num=123;//當前是整數類型

$float=(float)$num;//$num“臨時性”地轉換成了浮點型,$float變量所攜帶的數據類型就為浮點型

echo gettype($num)."<br/>";//使用gettype(mixed var)函數來獲取變量類型

echo gettype($float)

?>

運行的結果是:

Integer

double

提示:

如要將一變量徹底轉換成另一種類型得使用settypemixed varstring type函數

允許的強制轉換有如下幾種。

●int、integer:轉換成整型。

●bool、boolean:轉換成布爾型。

●float、double、real:轉換成浮點型。

●string:轉換成字符串。

●array:轉換成數組。

●object:轉換成對象。

主站蜘蛛池模板: 襄樊市| 陆河县| 巴南区| 日喀则市| 石景山区| 镇沅| 隆子县| 黎川县| 陕西省| 申扎县| 白城市| 水富县| 奎屯市| 天柱县| 澄江县| 延长县| 江西省| 承德市| 沙田区| 东方市| 宜章县| 鱼台县| 通江县| 九龙坡区| 温宿县| 凌海市| 犍为县| 靖宇县| 丘北县| 普定县| 开平市| 弥渡县| 武义县| 马龙县| 山西省| 湖南省| 涟水县| 鄢陵县| 彭阳县| 镇安县| 广德县|