- PHP+MySQL+Dreamweaver動態網站開發從入門到精通(第3版)
- 環博文化
- 6661字
- 2019-10-29 10:45:43
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
提示:
如要將一變量徹底轉換成另一種類型,得使用settype(mixed var,string type)函數。
允許的強制轉換有如下幾種。
●int、integer:轉換成整型。
●bool、boolean:轉換成布爾型。
●float、double、real:轉換成浮點型。
●string:轉換成字符串。
●array:轉換成數組。
●object:轉換成對象。
- 大學計算機基礎實驗教程
- arc42 by Example
- Practical Game Design
- Elasticsearch for Hadoop
- iOS編程基礎:Swift、Xcode和Cocoa入門指南
- 可解釋機器學習:模型、方法與實踐
- Mastering JBoss Enterprise Application Platform 7
- C語言程序設計
- Laravel Application Development Blueprints
- OpenCV with Python Blueprints
- JavaScript從入門到精通(視頻實戰版)
- Python編程基礎教程
- Test-Driven iOS Development with Swift
- Cinder:Begin Creative Coding
- PHP程序設計高級教程