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

第3章 PHP的基本語法

學(xué)習(xí)目標(biāo)|Objective


上一章講述了PHP的環(huán)境搭建方法,本章將開始學(xué)習(xí)PHP的基本語法,主要包括PHP的標(biāo)識(shí)符、編碼規(guī)范、常量、變量、數(shù)據(jù)類型、運(yùn)算符和表達(dá)式等。通過本章的學(xué)習(xí),讀者可以掌握PHP的基本語法知識(shí)和相關(guān)技能。

內(nèi)容導(dǎo)航|Navigation


  • 了解PHP標(biāo)識(shí)符
  • 熟悉PHP的編碼規(guī)范
  • 掌握常量的使用方法
  • 掌握變量的使用方法
  • 掌握數(shù)據(jù)類型
  • 掌握運(yùn)算符的使用方法
  • 掌握表達(dá)式的使用方法
  • 掌握創(chuàng)建多維數(shù)組的方法

3.1 PHP 7的標(biāo)記風(fēng)格

目前,PHP 7是以<?php ?>標(biāo)識(shí)符為開始和結(jié)束標(biāo)記的。也有人把這種默認(rèn)風(fēng)格稱為PHP的XML風(fēng)格。PHP 7只支持這種標(biāo)記風(fēng)格,例如:

早期版本中還支持短風(fēng)格、腳本風(fēng)格和ASP風(fēng)格。

1. 短風(fēng)格

有時(shí)候,讀者會(huì)看到一些代碼中出現(xiàn)用<? ?>標(biāo)識(shí)符表示PHP代碼的情況。這就是所謂的“短風(fēng)格”(short style)表示法,例如:

     <? echo "這是PHP短風(fēng)格的表示方式。"?>

這種表示方法在正常情況下并不推薦,并且在php.ini文件中short_open_tags的默認(rèn)設(shè)置是關(guān)閉的。另外,以后提到的一些功能設(shè)置會(huì)與這種表示方法相沖突,比如與XML的默認(rèn)標(biāo)識(shí)符相沖突。

2. 腳本風(fēng)格

有的編輯器由于跟以前程序的定義表示要區(qū)分開,對(duì)PHP代碼完全采用另一種表示方式,即<script></script>的表示方式,例如:

這十分類似HTML頁面中JavaScript的表示方式。

3. ASP風(fēng)格

由于ASP的影響,為了照顧ASP使用者對(duì)PHP的使用,PHP還提供了ASP的表示風(fēng)格,例如:

需要特別注意的是,上述三種風(fēng)格只能在PHP 5或者更低的版本中使用,PHP 7已經(jīng)不再支持上述3種風(fēng)格。

3.2 編碼規(guī)范

由于現(xiàn)在的Web開發(fā)往往是多人一起合作完成的,因此使用相同的編碼規(guī)范顯得非常重要,特別是新的開發(fā)人員參與時(shí),通常需要知道前面開發(fā)代碼中變量或函數(shù)的作用等,這就需要統(tǒng)一的編碼規(guī)范。

3.2.1 什么是編碼規(guī)范

編碼規(guī)范是一套某種編程語言的導(dǎo)引手冊(cè),這種導(dǎo)引手冊(cè)規(guī)定了一系列語言的默認(rèn)編程風(fēng)格,以增強(qiáng)語言的可讀性、規(guī)范性和可維護(hù)性。一個(gè)語言的編碼規(guī)范主要包括文件組織、縮進(jìn)、注釋、聲明、空格處理、命名規(guī)則等。

遵守編碼規(guī)范有以下好處。

  • 編碼規(guī)范是團(tuán)隊(duì)開發(fā)中對(duì)每個(gè)成員的基本要求。編碼規(guī)范的好壞是一個(gè)程序員成熟程度的表現(xiàn)。
  • 提高程序的可讀性,有利于開發(fā)人員互相交流。
  • 良好一致的編程風(fēng)格,在團(tuán)隊(duì)開發(fā)中可以達(dá)到事半功倍的效果。
  • 有助于程序的維護(hù),降低軟件成本。

3.2.2 PHP中的編碼規(guī)范

PHP作為一種高級(jí)語言,十分強(qiáng)調(diào)編碼規(guī)范。

1. 表述

在PHP的正常表述中,每一句PHP語句都是以“;”結(jié)尾的,這個(gè)規(guī)范就告訴PHP要執(zhí)行此語句,例如:

2. 指令分隔符

在PHP代碼中,每個(gè)語句后需要用分號(hào)結(jié)束命令。一段PHP代碼中的結(jié)束標(biāo)記隱含表示了一個(gè)分號(hào),所以在PHP代碼段的最后一行可以不用分號(hào)結(jié)束,例如:

3. 空白符

PHP對(duì)空格、回車造成的新行、Tab等留下的空白的處理也遵循編碼規(guī)范。PHP對(duì)它們都進(jìn)行了忽略。這跟瀏覽器對(duì)HTML語言中的空白的處理是一樣的。

合理利用空白符可以增強(qiáng)代碼的可讀性和清晰性。

(1)下列情況應(yīng)該總是使用兩個(gè)空白行:

① 兩個(gè)類的聲明之間。

② 一個(gè)源文件的兩個(gè)代碼片段之間。

(2)下列情況應(yīng)該總是使用一個(gè)空白行:

① 兩個(gè)函數(shù)聲明之間。

② 函數(shù)內(nèi)的局部變量和函數(shù)的第一個(gè)語句之間。

③ 塊注釋或單行注釋之前。

④ 一個(gè)函數(shù)內(nèi)的兩個(gè)邏輯代碼段之間。

(3)合理利用空格縮進(jìn)可以提高代碼的可讀性。

① 空格通常用于關(guān)鍵字與括號(hào)之間,但是函數(shù)名稱與左括號(hào)之間不能使用空格分開。

② 函數(shù)參數(shù)列表中的逗號(hào)后面通常會(huì)插入空格。

③ for語句的表達(dá)式應(yīng)該用逗號(hào)分開,后面添加空格。

4. 注釋

為了增強(qiáng)可讀性,在很多情況下,程序員都需要在程序語句的后面添加文字說明。而PHP要把它們與程序語句區(qū)分開,就需要讓這些文字注釋符合編碼規(guī)范。

這些注釋的風(fēng)格包括C語言風(fēng)格、C++風(fēng)格和SHELL風(fēng)格。

(1)C語言風(fēng)格如下:

     /*這是C語言風(fēng)格的注釋內(nèi)容*/

這種方法還可以多行使用:

(2)C++風(fēng)格如下:

(3)SHELL風(fēng)格如下:

     #這是SHELL風(fēng)格的注釋內(nèi)容

C++風(fēng)格和SHELL風(fēng)格只能一句注釋占用一行,既可單獨(dú)一行,也可使用在PHP語句之后的同一行。

5. 與HTML語言混合搭配

凡是在一對(duì)PHP開始和結(jié)束標(biāo)記之外的內(nèi)容都會(huì)被PHP解析器忽略,這使得PHP文件可以具備混合內(nèi)容,使PHP嵌入HTML文檔中,例如:

3.3 常 量

在PHP中,常量是一旦聲明就無法改變的值。本節(jié)將講述如何聲明和使用常量。

3.3.1 聲明和使用常量

PHP通過define()命令來聲明常量,格式如下:

     define("常量名",常量值);

常量名是一個(gè)字符串,通常在PHP的編碼規(guī)范指導(dǎo)下使用大寫英文字母表示,比如CLASS_NAME 、MYAGE等。

常量值可以是很多種PHP的數(shù)據(jù)類型,可以是數(shù)組、對(duì)象,當(dāng)然也可以是字符和數(shù)字。

常量就像變量一樣存儲(chǔ)數(shù)值,但是與變量不同的是,常量的值只能設(shè)定一次,并且無論在代碼的任何位置,都不能被改動(dòng)。常量聲明后具有全局性,在函數(shù)內(nèi)外都可以訪問。

【例3.1】(實(shí)例文件:源文件\ch03\3.1.php)

本程序運(yùn)行結(jié)果如圖3-1所示。

圖3-1 運(yùn)行結(jié)果

【案例分析】

  • 用define函數(shù)聲明一個(gè)常量。常量的全局性體現(xiàn)為可在函數(shù)內(nèi)外進(jìn)行訪問。
  • 常量只能存儲(chǔ)布爾值、整型數(shù)據(jù)、浮點(diǎn)型數(shù)據(jù)和字符串?dāng)?shù)據(jù)。

3.3.2 內(nèi)置常量

PHP的內(nèi)置常量是指PHP在系統(tǒng)建立之初就定義好的一些常量。PHP中預(yù)定義了很多系統(tǒng)內(nèi)置常量,這些常量可以被隨時(shí)調(diào)用。下面列出一些常見的內(nèi)置常量。

(1)_FILE_:這個(gè)默認(rèn)常量是文件的完整路徑和文件名。若引用文件(include或require),則在引用文件內(nèi)的該常量為引用文件名,而不是引用它的文件名。

(2)_LINE_:這個(gè)默認(rèn)常量是PHP程序行數(shù)。若引用文件(include或require),則在引用文件內(nèi)的該常量為引用文件的行,而不是引用它的文件行。

(3)PHP_VERSION:這個(gè)內(nèi)置常量是PHP程序的版本,如3.0.8-dev。

(4)PHP_OS:這個(gè)內(nèi)置常量是指執(zhí)行PHP解析器的操作系統(tǒng)名稱,如Linux。

(5)TRUE:這個(gè)常量是真值(true)。

(6)FALSE:這個(gè)常量是偽值(false)。

(7)E_ERROR:這個(gè)常量指到最近的錯(cuò)誤處。

(8)E_WARNING:這個(gè)常量指到最近的警告處。

(9)E_PARSE:這個(gè)常量指到解析語法有潛在問題處。

(10)E_NOTICE:這個(gè)常量為發(fā)生不尋常,但不一定是錯(cuò)誤處,例如存取一個(gè)不存在的變量。

(11)_DIR_:這個(gè)常量為文件所在的目錄。該常量是在PHP 5.3.0版本中新增的。

(12)_ FUNCTION _:這個(gè)常量為函數(shù)的名稱。從PHP 5開始,此常量返回該函數(shù)被定義時(shí)的名字,并且區(qū)分大小寫。

(13)_ CLASS _:這個(gè)常量為類的名稱。從PHP 5開始,此常量返回該類被定義時(shí)的名字,并且區(qū)分大小寫。

下面舉例說明系統(tǒng)常量的使用方法。

【例3.2】(實(shí)例文件:源文件\ch03\3.2.php)

本程序的運(yùn)行結(jié)果如圖3-2所示。

圖3-2 程序運(yùn)行結(jié)果

【案例分析】

(1)echo "<br>"語句表示輸出換行。

(2)echo(_FILE_)語句輸出文件的文件名,包括詳細(xì)的文件路徑。echo(_LINE_)語句輸出該語句所在的行數(shù)。echo(PHP_VERSION)語句輸出PHP程序的版本。echo(PHP_OS)語句輸出執(zhí)行PHP解析器的操作系統(tǒng)名稱。

3.4 變 量

變量像一個(gè)貼有名字標(biāo)簽的空盒子。不同的變量類型對(duì)應(yīng)不同種類的數(shù)據(jù),就像不同種類的東西要放入不同種類的盒子。

3.4.1 PHP中的變量聲明

PHP中的變量不同于C或Java語言,因?yàn)樗侨躅愋偷摹T贑或Java中,需要對(duì)每一個(gè)變量聲明類型,但是在PHP中不需要這樣做。

PHP中的變量一般以“$”作為前綴,然后以字母a~z的大小寫或者“_”下畫線開頭。這是變量的一般表示。

合法的變量名可以是:

非法的變量名如:

     $168
     $!like

PHP中不需要顯式地聲明變量,但是定義變量前進(jìn)行聲明并帶有注釋是一個(gè)好的程序員應(yīng)該養(yǎng)成的習(xí)慣。PHP的賦值有兩種,即傳值和引用,區(qū)別如下:

(1)傳值賦值:使用“=”直接將賦值表達(dá)式的值賦給另一個(gè)變量。

(2)引用賦值:將賦值表達(dá)式內(nèi)存空間的引用賦給另一個(gè)變量。需要在“=”左右的變量前面加上一個(gè)“&”符號(hào)。在使用引用賦值的時(shí)候,兩個(gè)變量將會(huì)指向內(nèi)存中同一個(gè)存儲(chǔ)空間,所以任意一個(gè)變量的變化都會(huì)引起另一個(gè)變量的變化。

【例3.3】(實(shí)例文件:源文件\ch03\3.3.php)

本程序運(yùn)行結(jié)果如圖3-3所示。

圖3-3 程序運(yùn)行結(jié)果

3.4.2 可變變量與變量的引用

一般的變量很容易理解,但是有兩個(gè)概念比較容易混淆,就是可變變量和變量的引用。

可變變量是一種特殊的變量,它允許動(dòng)態(tài)改變一個(gè)變量名稱。其工作原理是該變量的名稱由另一個(gè)變量的值來確定,實(shí)現(xiàn)過程就是在變量的前面再多加一個(gè)美元符號(hào)“$”。

在一個(gè)變量前加上“&”,然后賦值給另一個(gè)變量,這就是變量的引用賦值。

通過下面的例子對(duì)它們進(jìn)行說明。

【例3.4】(實(shí)例文件:源文件\ch03\3.4.php)

本程序運(yùn)行結(jié)果如圖3-4所示。

圖3-4 程序運(yùn)行結(jié)果

【案例分析】

(1)在代碼的第一部分,$aa被賦值bb。若$aa相當(dāng)bb,則$$aa相當(dāng)于$bb。所以當(dāng)$$aa被賦值為“征蓬出漢塞,歸雁入胡天。”時(shí),打印$bb就得到“征蓬出漢塞,歸雁入胡天。”。反之,當(dāng)$bb變量被賦值為“大漠孤煙直,長河落日?qǐng)A。”時(shí),打印$$aa同樣得到“大漠孤煙直,長河落日?qǐng)A。”。這就是可變變量。

(2)在代碼的第二部分里,$a被賦值100,然后通過“&”引用變量$a并賦值給$b。這一步的實(shí)質(zhì)是,給變量$a添加了一個(gè)別名$b。所以打印時(shí),$a和$b都得出原始賦值100。由于$b是別名,和$a指的是同一個(gè)變量,因此當(dāng)$b被賦值300后,$a和$b都得到新值300。

(3)可變變量其實(shí)是允許改變一個(gè)變量的變量名,允許使用一個(gè)變量的值作為另一個(gè)變量的名。

(4)變量引用相當(dāng)于給變量添加了一個(gè)別名,使用“&”來引用變量。其實(shí)兩個(gè)變量名指的是同一個(gè)變量。就像是給同一個(gè)盒子貼了兩個(gè)名字標(biāo)簽,兩個(gè)名字標(biāo)簽指的是同一個(gè)盒子。

3.4.3 變量作用域

所謂變量作用域(scope),是指特定變量在代碼中可以被訪問到的位置。在PHP中有6種基本的變量作用域法則。

(1)內(nèi)置超全局變量(built-in superglobal variables),在代碼中的任意位置都可以訪問到。

(2)常數(shù)(constants),一旦聲明,就是全局性的,可以在函數(shù)內(nèi)外使用。

(3)全局變量(global variables),在代碼間聲明,可在代碼間訪問,但是不能在函數(shù)內(nèi)訪問。

(4)在函數(shù)中聲明為全局變量的變量就是同名的全局變量。

(5)在函數(shù)中創(chuàng)建和聲明為靜態(tài)變量的變量在函數(shù)外是無法訪問的,但是這個(gè)靜態(tài)變量的值可以保留。

(6)在函數(shù)中創(chuàng)建和聲明的局部變量在函數(shù)外是無法訪問的,并且在本函數(shù)終止時(shí)失效。

1. 超全局變量

superglobal或autoglobal可以稱為“超全局變量”或“自動(dòng)全局變量”。這種變量的特性是,無論在程序的任何地方都可以訪問到,無論是函數(shù)內(nèi)還是函數(shù)外都可以訪問到。而這些“超全局變量”就是由PHP預(yù)先定義好以方便使用的。

那么這些“超全局變量”或“自動(dòng)全局變量”都有哪些呢?

  • $GLOBALS:包含全局變量的數(shù)組。
  • $_GET:包含所有通過GET方法傳遞給代碼的變量的數(shù)組。
  • $_POST:包含所有通過POST方法傳遞給代碼的變量的數(shù)組。
  • $_FILES:包含文件上傳變量的數(shù)組。
  • $_COOKIE:包含cookie變量的數(shù)組。
  • $_SERVER:包含服務(wù)器環(huán)境變量的數(shù)組。
  • $_ENV:包含環(huán)境變量的數(shù)組。
  • $_REQUEST:包含用戶所有輸入內(nèi)容的數(shù)組(包括$_GET、$_POST和$_COOKIE)。
  • $_SESSION:包含會(huì)話變量的數(shù)組。
2. 全局變量

全局變量其實(shí)就是在函數(shù)外聲明的變量,在代碼間都可以訪問,但是在函數(shù)內(nèi)是不能訪問的。這是因?yàn)楹瘮?shù)默認(rèn)不能訪問在其外部的全局變量。

通過下面的實(shí)例介紹全局變量的使用方法和技巧。

【例3.5】(實(shí)例文件:源文件\ch03\3.5.php)

本程序運(yùn)行結(jié)果如圖3-5所示。

圖3-5 程序運(yùn)行結(jié)果

出現(xiàn)上述結(jié)果是因?yàn)楹瘮?shù)無法訪問外部全局變量,但是在代碼間可以訪問全局變量。

如果想讓函數(shù)訪問某個(gè)全局變量,可以在函數(shù)中通過global關(guān)鍵字來聲明,就是要告訴函數(shù),它要調(diào)用的變量是一個(gè)已經(jīng)存在或者即將創(chuàng)建的同名全局變量,而不是默認(rèn)的本地變量。

通過下面的實(shí)例介紹global關(guān)鍵字的使用方法和技巧。

【例3.6】(實(shí)例文件:源文件\ch03\3.6.php)

本程序運(yùn)行結(jié)果如圖3-6所示。

圖3-6 程序運(yùn)行結(jié)果

注意:在PHP 7中,global關(guān)鍵字現(xiàn)在只能引用簡(jiǎn)單變量,例如:

另外,讀者還可以通過“超全局變量”中的$GLOBALS數(shù)組進(jìn)行訪問。

下面通過實(shí)例介紹$GLOBALS數(shù)組。

【例3.7】(實(shí)例文件:源文件\ch03\3.7.php)

本程序運(yùn)行結(jié)果如圖3-7所示。

圖3-7 程序運(yùn)行結(jié)果

從結(jié)果可以看出,上述兩種方法都可以實(shí)現(xiàn)在函數(shù)內(nèi)訪問全局變量。

3. 靜態(tài)變量

靜態(tài)變量只是在函數(shù)內(nèi)存在,在函數(shù)外無法訪問。但是執(zhí)行后,其值保留,也就是說這一次執(zhí)行完畢后,靜態(tài)變量的值保留,下一次再執(zhí)行此函數(shù),這個(gè)值還可以調(diào)用。

通過下面的實(shí)例介紹靜態(tài)變量的使用方法和技巧。

【例3.8】(實(shí)例文件:源文件\ch03\3.8.php)

本程序運(yùn)行結(jié)果如圖3-8所示。

圖3-8 程序運(yùn)行結(jié)果

【案例分析】:

(1)其中函數(shù)外的echo語句無法調(diào)用函數(shù)內(nèi)的static $person,它調(diào)用的是$person = 20。

(2)showpeople()函數(shù)被執(zhí)行兩次,這個(gè)過程中static $person的運(yùn)算值得以保留,并且通過$person++進(jìn)行了累加。

3.4.4 變量的銷毀

當(dāng)用戶創(chuàng)建一個(gè)變量時(shí),相應(yīng)地在內(nèi)存中有一個(gè)空間專門用于存儲(chǔ)該變量,該空間引用計(jì)數(shù)加1。當(dāng)變量與該空間的聯(lián)系被斷開時(shí),空間引用計(jì)數(shù)減1,直到引用計(jì)數(shù)為0,則成為垃圾。

PHP有自動(dòng)回收垃圾的機(jī)制,用戶也可以手動(dòng)銷毀變量,通常使用unset()函數(shù)來實(shí)現(xiàn)。該函數(shù)的語法格式如下:

     void unset (變量)

其中,若變量類型為局部變量,則變量被銷毀;若變量類型為全局變量,則變量不會(huì)被銷毀。

【例3.9】(實(shí)例文件:源文件\ch03\3.9.php)

本程序運(yùn)行結(jié)果如圖3-9所示。

圖3-9 程序運(yùn)行結(jié)果

3.5 數(shù)據(jù)類型

從PHP 4開始,PHP中的變量不需要事先聲明,賦值即可聲明。在使用這些數(shù)據(jù)類型前,讀者需要了解它們的含義和特性。下面介紹整型、浮點(diǎn)型、布爾型、字符串型、數(shù)組型、對(duì)象型以及NULL和Resource兩個(gè)比較特殊的類型。

3.5.1 什么是類型

不同的數(shù)據(jù)類型其實(shí)就是所存儲(chǔ)數(shù)據(jù)的不同種類。PHP的不同數(shù)據(jù)類型主要包括:

  • 整型(integer),用來存儲(chǔ)整數(shù)。
  • 浮點(diǎn)型(float),用來存儲(chǔ)實(shí)數(shù)。
  • 字符串型(string),用來存儲(chǔ)字符串。
  • 布爾型(boolean),用來存儲(chǔ)真(true)或假(false)。
  • 數(shù)組型(array),用來存儲(chǔ)一組數(shù)據(jù)。
  • 對(duì)象型(object),用來存儲(chǔ)一個(gè)類的實(shí)例。

作為弱類型語言,PHP也被稱為動(dòng)態(tài)類型語言。在強(qiáng)類型語言(例如C語言)中,一個(gè)變量只能存儲(chǔ)一種類型的數(shù)據(jù),并且這個(gè)變量在使用前必須聲明變量類型。而在PHP中,給變量賦什么類型的值,這個(gè)變量就是什么類型,例如以下幾個(gè)變量:

     $hello = "hello world";

由于hello world是字符串,因此變量$hello的數(shù)據(jù)類型就是字符串類型。

     $hello = 100;

同樣,由于100為整型,因此$hello也就是整型。

     $wholeprice = 100.0;

由于100.0為浮點(diǎn)型,因此$wholeprice就是浮點(diǎn)型。

由此可見,對(duì)于變量而言,如果沒有定義變量的類型,則它的類型由所賦值的類型決定。

3.5.2 整型

整型是數(shù)據(jù)類型中最為基本的類型。在現(xiàn)有的32位運(yùn)算器下,整型的取值是從-2147483648到+2147483647。整型可以表示為二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制。

要使用二進(jìn)制表達(dá),數(shù)字前必須加上0b,要使用八進(jìn)制表達(dá),數(shù)字前必須加上0,要使用十六進(jìn)制表達(dá),數(shù)字前必須加上0x。

例如:

提示

在PHP 7中,整型值的字長可以用常量PHP_INT_SIZE來表示,最大值可以用常量PHP_INT_MAX來表示,最小值可以用常量PHP_INT_MIN表示。整型數(shù)的字長和平臺(tái)有關(guān),32位平臺(tái)下的最大值是2147483647,64位平臺(tái)下的最大值通常大約是9223372036854775807。

3.5.3 浮點(diǎn)型

浮點(diǎn)型用于表示實(shí)數(shù)。在大多數(shù)運(yùn)行平臺(tái)下,這個(gè)數(shù)據(jù)類型的大小為8個(gè)字節(jié)。它的近似取值范圍是2.2E-308~1.8E+308(科學(xué)計(jì)數(shù)法)。

例如:

     -1.432
     1E+07
     0.0

3.5.4 布爾型

布爾型只有兩個(gè)值,就是true和false。布爾型是十分有用的數(shù)據(jù)類型,通過它,程序?qū)崿F(xiàn)了邏輯判斷的功能。

其他的數(shù)據(jù)類型基本都有布爾屬性:

  • 整型,為0時(shí),其布爾屬性為false,為非零值時(shí),其布爾屬性為true。
  • 浮點(diǎn)型,為0.0時(shí),其布爾屬性為false,為非零值時(shí),其布爾屬性為true。
  • 字符串型,為空字符串“”或者零字符串“0”時(shí),其布爾屬性為false,包含除此以外的字符串時(shí)其布爾屬性為true。
  • 數(shù)組型,若不含任何元素,其布爾屬性為false,只要包含元素,則其布爾屬性為true。
  • 對(duì)象型和資源型,其布爾屬性永遠(yuǎn)為true。
  • NULL型,其布爾屬性永遠(yuǎn)為false。

3.5.5 字符串型

字符串型的數(shù)據(jù)是表示在引號(hào)之間的。引號(hào)分為雙引號(hào)“"”和單引號(hào)“'”。這兩種引號(hào)可以表示字符串,但是這兩種表示方法也有一定區(qū)別。

雙引號(hào)幾乎可以包含所有的字符,但是在其中的變量顯示變量的值,而不是變量的變量名,有些特殊字符加上“\”符號(hào)就可以了;單引號(hào)內(nèi)的字符是被直接表示出來的。

下面通過一個(gè)案例來講述整型、浮點(diǎn)型、布爾型和字符串型數(shù)據(jù)的使用方法和技巧。

【例3.10】(實(shí)例文件:源文件\ch03\3.10.php)

本程序運(yùn)行結(jié)果如圖3-10所示。

圖3-10 程序運(yùn)行結(jié)果

3.5.6 數(shù)組型

數(shù)組是PHP變量的集合,是按照“鍵值”與“值”的對(duì)應(yīng)關(guān)系組織數(shù)據(jù)的。數(shù)組的鍵值既可以是整數(shù),也可以是字符串。另外,數(shù)組不特意表明鍵值的默認(rèn)情況下,數(shù)組元素的鍵值為從零開始的整數(shù)。

在PHP中,使用list()函數(shù)或array()函數(shù)來創(chuàng)建數(shù)組,也可以直接進(jìn)行賦值。

下面使用array()函數(shù)創(chuàng)建數(shù)組。

【例3.11】(實(shí)例文件:源文件\ch03\3.11.php)

本程序運(yùn)行結(jié)果如圖3-11所示。

圖3-11 程序運(yùn)行結(jié)果

【案例分析】

(1)程序中用“=>”為數(shù)組賦值,數(shù)組的下標(biāo)只是存儲(chǔ)的標(biāo)識(shí),沒有任何意義,數(shù)組元素的排列以加入的先后順序?yàn)闇?zhǔn)。

(2)本程序采用for循環(huán)語句輸出整個(gè)數(shù)組,其中count函數(shù)返回?cái)?shù)組的個(gè)數(shù),echo函數(shù)返回當(dāng)前數(shù)組指針的索引值對(duì),后面的章節(jié)將詳細(xì)講述echo函數(shù)的使用方法。

上面實(shí)例的語句可以簡(jiǎn)化如下。

【例3.12】(實(shí)例文件:源文件\ch03\3.12.php)

本程序運(yùn)行結(jié)果如圖3-12所示。從結(jié)果可以看出,這兩種寫法的運(yùn)行結(jié)果相同。

圖3-12 程序運(yùn)行結(jié)果

另外,讀者還可以對(duì)數(shù)組的元素一個(gè)一個(gè)地賦值,下面舉例說明。上面的語句可以簡(jiǎn)化如下。

【例3.13】(實(shí)例文件:源文件\ch03\3.13.php)

本程序運(yùn)行結(jié)果如圖3-13所示。從結(jié)果可以看出,一個(gè)一個(gè)賦值的方法和上面兩種寫法的運(yùn)行結(jié)果一樣。

圖3-13 程序運(yùn)行結(jié)果

3.5.7 對(duì)象型

對(duì)象就是類的實(shí)例。當(dāng)一個(gè)類被實(shí)例化以后,這個(gè)被生成的對(duì)象被傳遞給一個(gè)變量,這個(gè)變量就是對(duì)象型變量。對(duì)象型變量也屬于資源型變量。

3.5.8 NULL型

NULL類型是僅擁有NULL這個(gè)值的類型。這個(gè)類型用來標(biāo)記一個(gè)變量為空。一個(gè)空字符串與NULL是不同的。在數(shù)據(jù)庫存儲(chǔ)時(shí)會(huì)把空字符串和NULL區(qū)分開處理。NULL型在布爾判斷時(shí)永遠(yuǎn)為false。很多情況下,在聲明一個(gè)變量的時(shí)候可以直接先賦值為NULL型,如$value = NULL。

3.5.9 資源類型

資源(resource)類型是十分特殊的數(shù)據(jù)類型。它表示PHP的擴(kuò)展資源,可以是一個(gè)打開的文件,也可以是一個(gè)數(shù)據(jù)庫連接,甚至可以是其他的數(shù)據(jù)類型。但是在編程過程中,資源類型卻是幾乎永遠(yuǎn)接觸不到的。

3.5.10 數(shù)據(jù)類型之間的相互轉(zhuǎn)換

數(shù)據(jù)從一個(gè)類型轉(zhuǎn)換到另一個(gè)類型,就是數(shù)據(jù)類型轉(zhuǎn)換。在PHP語言中,有兩種常見的轉(zhuǎn)換方式:自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換和強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換。

1. 自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換

這種轉(zhuǎn)換方法最為常用。直接輸入數(shù)據(jù)的轉(zhuǎn)換類型即可。

【2.14】(實(shí)例文件:源文件\ch02\2.14.php)

程序運(yùn)行結(jié)果如圖2-14所示。

圖2-14 自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換

2. 強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換

在PHP語言中,可以使用settype函數(shù)強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型,基本語法如下。

     Bool settype(var,string type)

提示

type的可能值不能包含資源類型數(shù)據(jù)。如果轉(zhuǎn)型成功,就返回1,否則返回0。

【例3.15】(實(shí)例文件:源文件\ch03\3.15.php)

本程序運(yùn)行結(jié)果如圖3-15所示。這里返回結(jié)果為1,說明浮點(diǎn)數(shù)100.86轉(zhuǎn)型為整數(shù)100已經(jīng)成功了。

圖3-15 程序運(yùn)行結(jié)果

3.6 PHP 7的新變化1——整型處理機(jī)制的修改

PHP 7以前的版本里,如果向八進(jìn)制數(shù)傳遞了一個(gè)非法數(shù)字,例如8或9,則后面其余數(shù)字會(huì)被忽略。在PHP 7中,將會(huì)出現(xiàn)編譯錯(cuò)誤。

例如下面的代碼將會(huì)報(bào)錯(cuò):

     $a = 0792; // 9是無效的八進(jìn)制數(shù)字

在PHP 7中,如果位移負(fù)的位置,將會(huì)產(chǎn)生異常,例如:

在PHP 7中,左位移如果超出位數(shù),就會(huì)返回為0,例如:

而在PHP 7之前的版本中,運(yùn)行結(jié)果和CPU的架構(gòu)有關(guān)系,比如x86會(huì)返回1。

在PHP 7中,右位移如果超出位數(shù),就會(huì)返回0或者-1,例如:

3.7 PHP 7的新變化2——標(biāo)量類型的聲明

默認(rèn)情況下,所有的PHP文件都處于弱類型校驗(yàn)?zāi)J健HP 7加了標(biāo)量類型聲明的特性,標(biāo)量類型聲明有兩種模式:強(qiáng)制模式(默認(rèn))和嚴(yán)格模式。

標(biāo)量類型聲明的語法格式如下:

     declare(strict_types=1);

通過指定strict_types的值(1或者0)來表示校驗(yàn)?zāi)J剑?表示嚴(yán)格類型校驗(yàn)?zāi)J剑饔糜诤瘮?shù)調(diào)用和返回語句;0表示強(qiáng)制類型校驗(yàn)?zāi)J健?/p>

提示

可以聲明標(biāo)量類型的參數(shù)類型包括int、float、bool、string、interfaces、array和callable。

1. 強(qiáng)制模式

下面通過案例來學(xué)習(xí)強(qiáng)制模式的含義,代碼如下:

上面程序的輸出結(jié)果為9。代碼中的'3'轉(zhuǎn)化為3,4.1先轉(zhuǎn)換為整數(shù)4,再進(jìn)行相加操作。

2. 嚴(yán)格模式

下面通過案例來學(xué)習(xí)嚴(yán)格模式的含義,代碼如下:

以上程序由于采用了嚴(yán)格模式,因此如果參數(shù)中出現(xiàn)的不是整數(shù)類型,程序執(zhí)行時(shí)就會(huì)報(bào)錯(cuò),如圖3-16所示。

圖3-16 錯(cuò)誤提示信息

3.8 運(yùn)算符

PHP包含多種類型的運(yùn)算符,常見的有算術(shù)運(yùn)算符、字符串運(yùn)算符、賦值運(yùn)算符、比較運(yùn)算符和邏輯運(yùn)算符等。

3.8.1 算術(shù)運(yùn)算符

算術(shù)運(yùn)算符是最簡(jiǎn)單、最常用的運(yùn)算符。常見的算術(shù)運(yùn)算符如表3-1所示。

表3-1 常見的算術(shù)運(yùn)算符

算術(shù)運(yùn)算符的用法如下面的實(shí)例所示。

【例3.16】(實(shí)例文件:源文件\ch03\3.16.php)

本程序運(yùn)行結(jié)果如圖3-16所示。

圖3-16 程序運(yùn)行結(jié)果

提示

除了數(shù)值可以進(jìn)行自增運(yùn)算外,字符也可以進(jìn)行自增運(yùn)算操作。例如,b++的結(jié)果將等于c。

3.8.2 字符串運(yùn)算符

字符串運(yùn)算符是把兩個(gè)字符串連接起來變成一個(gè)字符串的運(yùn)算符,使用“.”來完成。如果變量是整型或浮點(diǎn)型,PHP也會(huì)自動(dòng)把它們轉(zhuǎn)換為字符串輸出,如下面的實(shí)例所示。

【例3.17】(實(shí)例文件:源文件\ch03\3.17.php)

本程序運(yùn)行結(jié)果如圖3-17所示。

圖3-17 程序運(yùn)行結(jié)果

3.8.3 賦值運(yùn)算符

賦值運(yùn)算符的作用是把一定的數(shù)據(jù)值加載給特定變量。

賦值運(yùn)算符的具體含義如表3-2所示。

表3-2 賦值運(yùn)算符的含義

例如,$a-=$b等價(jià)于$a=$a-$b,其他賦值運(yùn)算符與之類似。從表3-2可以看出,賦值運(yùn)算符可以使程序更加簡(jiǎn)練,從而提高執(zhí)行效率。

3.8.4 比較運(yùn)算符

比較運(yùn)算符用來比較兩端數(shù)據(jù)值的大小。比較運(yùn)算符的具體含義如表3-3所示。

表3-3 比較運(yùn)算符的含義

其中,“===”和“!==”需要特別注意一下。$b===$c表示$b和$c不只是數(shù)值上相等,而且兩者的類型也一樣;$b!==$c表示$b和$c有可能是數(shù)值不等,也可能是類型不同。

【例3.18】(實(shí)例文件:源文件\ch03\3.18.php)

本程序運(yùn)行結(jié)果如圖3-18所示。

圖3-18 程序運(yùn)行結(jié)果

3.8.5 邏輯運(yùn)算符

編程語言最重要的功能之一就是進(jìn)行邏輯判斷和運(yùn)算。邏輯和、邏輯或、邏輯否都是邏輯運(yùn)算符。邏輯運(yùn)算符的含義如表3-4所示。

表3-4 邏輯運(yùn)算的含義

【例3.19】(實(shí)例文件:源文件\ch03\3.19.php)

本程序運(yùn)行結(jié)果如圖3-19所示。

圖3-19 程序運(yùn)行結(jié)果

3.8.6 按位運(yùn)算符

按位運(yùn)算符是把整數(shù)按照“位”的單位來進(jìn)行處理。按位運(yùn)算符的含義如表3-5所示。

表3-5 按位運(yùn)算符的含義

【例3.20】(實(shí)例文件:源文件\ch03\3.20.php)

本程序運(yùn)行結(jié)果如圖3-20所示。

圖3-20 程序運(yùn)行結(jié)果

3.8.7 否定控制運(yùn)算符

否定控制運(yùn)算符用在“操作數(shù)”之前,用于對(duì)操作數(shù)值進(jìn)行真假的判斷。它包含一個(gè)邏輯否定運(yùn)算符和一個(gè)按位否定運(yùn)算符。否定控制運(yùn)算符的含義如表3-6所示。

表3-6 否定控制運(yùn)算符的含義

3.8.8 錯(cuò)誤控制運(yùn)算符

錯(cuò)誤控制運(yùn)算符用“@”來表示。在一個(gè)操作數(shù)之前使用,用來屏蔽錯(cuò)誤信息的生成。

【例3.21】(實(shí)例文件:源文件\ch03\3.21.php)

     <?php
     $err = @(20 / 0) ;  // 如果不想顯示這個(gè)錯(cuò)誤,在表達(dá)式前加上“@”
     ?>

本程序運(yùn)行結(jié)果如圖3-21所示。

圖3-21 程序運(yùn)行結(jié)果

3.8.9 三元運(yùn)算符

三元運(yùn)算符作用在三個(gè)操作數(shù)之間。這樣的操作符在PHP中只有一個(gè),即“?:”,語法形式如下:

     (expr1)?(expr2):(expr3)

如果expr1成立,就執(zhí)行expr2,否則執(zhí)行expr3。

【例3.22】(實(shí)例文件:源文件\ch03\3.22.php)

本程序運(yùn)行結(jié)果如圖3-22所示。

圖3-22 程序運(yùn)行結(jié)果

3.8.10 運(yùn)算符的優(yōu)先級(jí)和結(jié)合規(guī)則

運(yùn)算符的優(yōu)先級(jí)和結(jié)合其實(shí)與正常的數(shù)學(xué)運(yùn)算符的規(guī)則十分相似。

  • 加減乘除的先后順序與數(shù)學(xué)運(yùn)算中的完全一致。
  • 對(duì)于括號(hào),先括號(hào)內(nèi)再括號(hào)外。
  • 對(duì)于賦值,由右向左運(yùn)行,即依次從右邊向左邊的變量進(jìn)行賦值。

3.9 PHP 7的新變化3——合并運(yùn)算符和組合運(yùn)算符

PHP 7新增加的合并運(yùn)算符“??”用于判斷變量是否存在且值不為NULL,如果是,它就會(huì)返回自身的值,否則返回它的第二個(gè)操作數(shù)。

語法格式如下:

     (expr1) ? ? (expr2)

如果表達(dá)式expr1為真,就返回expr1的值;如果表達(dá)式expr1為假,就返回expr2。

【例3.23】(實(shí)例文件:源文件\ch03\3.23.php)

代碼運(yùn)行結(jié)果如圖3-23所示。

圖3-23 合并運(yùn)算符

PHP 7新增加的組合運(yùn)算符用于比較兩個(gè)表達(dá)式$a和$b,$a小于、等于或大于$b分別返回-1、0或1。

代碼運(yùn)行結(jié)果如圖3-24所示。

圖3-24 組合運(yùn)算符

3.10 表達(dá)式

表達(dá)式是在特定語言中表達(dá)一個(gè)特定的操作或動(dòng)作的語句。PHP的表達(dá)式也有同樣的作用。

一個(gè)表達(dá)式包含“操作數(shù)”和“操作符”。操作數(shù)可以是變量,也可以是常量。操作符則體現(xiàn)了要表達(dá)的各個(gè)行為,如邏輯判斷、賦值、運(yùn)算等。

例如,$a=5就是表達(dá)式,而$a=5;則為語句。另外,表達(dá)式也有值,例如$a=1表達(dá)式的值為1。

提示

在PHP代碼中,使用“;”號(hào)來區(qū)分表達(dá)式,即一個(gè)表達(dá)式和一個(gè)分號(hào)組成了一條PHP語句。在編寫程序代碼時(shí),應(yīng)該特別注意表達(dá)式后面的“;”,不要漏寫或?qū)戝e(cuò),否則會(huì)提示語法錯(cuò)誤。

3.11 實(shí)戰(zhàn)演練——?jiǎng)?chuàng)建二維數(shù)組

前面講述了如何創(chuàng)建一維數(shù)組,本節(jié)講述如何創(chuàng)建多維數(shù)組。多維數(shù)組和一維數(shù)組的區(qū)別是多維數(shù)組有兩個(gè)或多個(gè)下標(biāo),它們的用法基本相似。

下面以創(chuàng)建二維數(shù)組為例進(jìn)行講解。

【例3.24】(實(shí)例文件:源文件\ch03\3.24.php)

本程序運(yùn)行結(jié)果如圖3-25所示。

圖3-25 程序運(yùn)行結(jié)果

3.12 高手甜點(diǎn)

甜點(diǎn)1:如何靈活運(yùn)用命名空間(namespace)?

命名空間作為一個(gè)比較寬泛的概念,可以理解為用來封裝各個(gè)項(xiàng)目的方法。有點(diǎn)像是在文件系統(tǒng)中不同文件夾路徑和文件夾當(dāng)中的文件。兩個(gè)文件的文件名可以完全相同,但是在不同的文件夾路徑下,就是兩個(gè)完全不同的文件。

PHP的命名空間也是這樣的一個(gè)概念。它主要用于在“類的命名”“函數(shù)命名”及“常量命名”中避免代碼沖突和在命名空間下管理變量名和常量名。

命名空間是使用namespace關(guān)鍵字在文件頭部定義的,例如:

命名空間還可以擁有子空間,就像文件夾的路徑一樣。可以通過內(nèi)置變量_NAMESPACE_來使用命名空間及其子空間。

甜點(diǎn)2:如何快速區(qū)分常量與變量?

常量和變量的明顯區(qū)別如下:

  • 常量前面沒有美元符號(hào)($)。
  • 常量只能用define()函數(shù)定義,而不能通過賦值語句定義。
  • 常量可以不用理會(huì)變量范圍的規(guī)則而在任何地方定義和訪問。
  • 常量一旦定義就不能被重新定義或者取消定義。
  • 常量的值只能是標(biāo)量。
主站蜘蛛池模板: 新干县| 长丰县| 泸州市| 宁远县| 富阳市| 沁阳市| 常宁市| 文水县| 巴林左旗| 东莞市| 灵宝市| 桓仁| 宜兰市| 田东县| 邳州市| 惠来县| 大洼县| 固安县| 贡山| 台安县| 南澳县| 东宁县| 仁化县| 五大连池市| 阜新市| 泉州市| 阳曲县| 阳山县| 隆回县| 泰来县| 乌恰县| 开鲁县| 淳化县| 扎囊县| 江阴市| 科技| 哈巴河县| 巧家县| 额尔古纳市| 嘉定区| 临朐县|