




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PHP和MySQLWeb開(kāi)發(fā)第4版注:原文檔電子版(非掃描),需要的請(qǐng)下載本文檔后留言謝謝。目錄\h第一篇使用PHP\h第1章PHP快速入門(mén)\h1.1開(kāi)始之前:了解PHP\h1.2創(chuàng)建一個(gè)示例應(yīng)用:Bob的汽車(chē)零部件商店\h1.3在HTML中嵌入PHP\h1.4添加動(dòng)態(tài)內(nèi)容\h1.5訪問(wèn)表單變量\h1.6理解標(biāo)識(shí)符\h1.7檢查變量類(lèi)型\h1.8聲明和使用常量\h1.9理解變量的作用域\h1.10使用操作符\h1.11計(jì)算表單總金額\h1.12理解操作符的優(yōu)先級(jí)和結(jié)合性\h1.13使用可變函數(shù)\h1.14根據(jù)條件進(jìn)行決策\(yùn)h1.15通過(guò)迭代實(shí)現(xiàn)重復(fù)動(dòng)作\h1.16從控制結(jié)構(gòu)或腳本中跳出\h1.17使用可替換的控制結(jié)構(gòu)語(yǔ)法\h1.18使用declare\h1.19下一章\h第2章數(shù)據(jù)的存儲(chǔ)與檢索\h2.1保存數(shù)據(jù)以便后期使用\h2.2存儲(chǔ)和檢索Bob的訂單\h2.3文件處理\h2.4打開(kāi)文件\h2.5寫(xiě)文件\h2.6關(guān)閉文件\h2.7讀文件\h2.8使用其他有用的文件函數(shù)\h2.9文件鎖定\h2.10更好的方式:數(shù)據(jù)庫(kù)管理系統(tǒng)\h2.11進(jìn)一步學(xué)習(xí)\h2.12下一章\h第3章使用數(shù)組\h3.1什么是數(shù)組\h3.2數(shù)字索引數(shù)組\h3.3使用不同索引的數(shù)組\h3.4數(shù)組操作符\h3.5多維數(shù)組\h3.6數(shù)組排序\h3.7多維數(shù)組的排序\h3.8對(duì)數(shù)組進(jìn)行重新排序\h3.9從文件載入數(shù)組\h3.10執(zhí)行其他數(shù)組操作\h3.11進(jìn)一步學(xué)習(xí)\h3.12下一章\h第4章字符串操作與正則表達(dá)式\h4.1創(chuàng)建一個(gè)示例應(yīng)用程序:智能表單郵件\h4.2字符串的格式化\h4.3用字符串函數(shù)連接和分割字符串\h4.4字符串的比較\h4.5使用字符串函數(shù)匹配和替換子字符串\h4.6正則表達(dá)式的介紹\h4.7用正則表達(dá)式查找子字符串\h4.8用正則表達(dá)式替換子字符串\h4.9使用正則表達(dá)式分割字符串\h4.10進(jìn)一步學(xué)習(xí)\h4.11下一章\h第5章代碼重用與函數(shù)編寫(xiě)\h5.1代碼重用的好處\h5.2使用require()和include()函數(shù)\h5.3在PHP中使用函數(shù)\h5.4理解為什么要定義自己的函數(shù)\h5.5了解基本的函數(shù)結(jié)構(gòu)\h5.6使用參數(shù)\h5.7理解作用域\h5.8參數(shù)的引用傳遞和值傳遞\h5.9使用Return關(guān)鍵字\h5.10實(shí)現(xiàn)遞歸\h5.11進(jìn)一步學(xué)習(xí)\h5.12下一章\h第6章面向?qū)ο蟮腜HP\h6.1理解面向?qū)ο蟮母拍頫h6.2在PHP中創(chuàng)建類(lèi)、屬性和操作\h6.3類(lèi)的實(shí)例化\h6.4使用類(lèi)的屬性\h6.5使用private和public關(guān)鍵字控制訪問(wèn)\h6.6類(lèi)操作的調(diào)用\h6.7在PHP中實(shí)現(xiàn)繼承\(zhòng)h6.8類(lèi)的設(shè)計(jì)\h6.9編寫(xiě)類(lèi)代碼\h6.10理解PHP面向?qū)ο蟮母呒?jí)功能\h6.11下一章\h第7章錯(cuò)誤和異常處理\h7.1異常處理的概念\h7.2Exception類(lèi)\h7.3用戶(hù)自定義異常\h7.4Bob的汽車(chē)零部件商店應(yīng)用程序的異常\h7.5異常和PHP的其他錯(cuò)誤處理機(jī)制\h7.6進(jìn)一步學(xué)習(xí)\h7.7下一章\h第二篇使用MySQL\h第8章設(shè)計(jì)Web數(shù)據(jù)庫(kù)\h8.1關(guān)系數(shù)據(jù)庫(kù)的概念\h8.2設(shè)計(jì)Web數(shù)據(jù)庫(kù)\h8.3Web數(shù)據(jù)庫(kù)架構(gòu)\h8.4進(jìn)一步學(xué)習(xí)\h8.5下一章\h第9章創(chuàng)建Web數(shù)據(jù)庫(kù)\h9.1使用MySQL監(jiān)視程序\h9.2登錄到MySQL\h9.3創(chuàng)建數(shù)據(jù)庫(kù)和用戶(hù)\h9.4設(shè)置用戶(hù)與權(quán)限\h9.5MySQL權(quán)限系統(tǒng)的介紹\h9.6創(chuàng)建一個(gè)Web用戶(hù)\h9.7使用正確的數(shù)據(jù)庫(kù)\h9.8創(chuàng)建數(shù)據(jù)庫(kù)表\h9.9理解MySQL的標(biāo)識(shí)符\h9.10選擇列數(shù)據(jù)類(lèi)型\h9.11進(jìn)一步學(xué)習(xí)\h9.12下一章\h第10章使用MySQL數(shù)據(jù)庫(kù)\h10.1SQL是什么\h10.2在數(shù)據(jù)庫(kù)中插入數(shù)據(jù)\h10.3從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)\h10.4更新數(shù)據(jù)庫(kù)記錄\h10.5創(chuàng)建后修改表\h10.6刪除數(shù)據(jù)庫(kù)中的記錄\h10.7表的刪除\h10.8刪除整個(gè)數(shù)據(jù)庫(kù)\h10.9進(jìn)一步學(xué)習(xí)\h10.10下一章\h第11章使用PHP從Web訪問(wèn)MySQL數(shù)據(jù)庫(kù)\h11.1Web數(shù)據(jù)庫(kù)架構(gòu)的工作原理\h11.2從Web查詢(xún)數(shù)據(jù)庫(kù)的基本步驟\h11.3將新信息放入數(shù)據(jù)庫(kù)\h11.4使用Prepared語(yǔ)句\h11.5使用PHP與數(shù)據(jù)庫(kù)交互的其他接口\h11.6進(jìn)一步學(xué)習(xí)\h11.7下一章\h第12章MySQL高級(jí)管理\h12.1深入理解權(quán)限系統(tǒng)\h12.2提高M(jìn)ySQL數(shù)據(jù)庫(kù)的安全性\h12.3獲取更多關(guān)于數(shù)據(jù)庫(kù)的信息\h12.4數(shù)據(jù)庫(kù)的優(yōu)化\h12.5備份MySQL數(shù)據(jù)庫(kù)\h12.6恢復(fù)MySQL數(shù)據(jù)庫(kù)\h12.7實(shí)現(xiàn)復(fù)制\h12.8進(jìn)一步學(xué)習(xí)\h12.9下一章\h第13章MySQL高級(jí)編程\h13.1LOADDATAINFILE語(yǔ)句\h13.2存儲(chǔ)引擎\h13.3事務(wù)\h13.4外鍵\h13.5存儲(chǔ)過(guò)程\h13.6進(jìn)一步學(xué)習(xí)\h13.7下一章\h第三篇電子商務(wù)與安全性\h第14章運(yùn)營(yíng)一個(gè)電子商務(wù)網(wǎng)站\h14.1我們要實(shí)現(xiàn)什么目標(biāo)\h14.2考慮電子商務(wù)網(wǎng)站的類(lèi)型\h14.3理解風(fēng)險(xiǎn)和威脅\h14.4選擇一個(gè)策略\h14.5下一章\h第15章電子商務(wù)的安全問(wèn)題\h15.1信息的重要程度\h15.2安全威脅\h15.3易用性、性能、成本和安全性\h15.4建立一套安全政策\(yùn)h15.5身份驗(yàn)證原則\h15.6加密技術(shù)基礎(chǔ)\h15.7數(shù)字證書(shū)\h15.8安全的Web服務(wù)器\h15.9審計(jì)與日志記錄\h15.10防火墻\h15.11備份數(shù)據(jù)\h15.12自然環(huán)境的安全性\h15.13下一章\h第16章Web應(yīng)用的安全\h16.1處理安全性問(wèn)題的策略\h16.2識(shí)別所面臨的威脅\h16.3了解與我們“打交道”的用戶(hù)\h16.4代碼的安全性\h16.5Web服務(wù)器和PHP的安全性\h16.6數(shù)據(jù)庫(kù)服務(wù)器的安全性\h16.7保護(hù)網(wǎng)絡(luò)\h16.8計(jì)算機(jī)和操作系統(tǒng)的安全性\h16.9災(zāi)難計(jì)劃\h16.10下一章\h第17章使用PHP和MySQL實(shí)現(xiàn)身份驗(yàn)證\h17.1識(shí)別訪問(wèn)者\(yùn)h17.2實(shí)現(xiàn)訪問(wèn)控制\h17.3使用基本身份驗(yàn)證\h17.4在PHP中使用基本身份驗(yàn)證\h17.5在Apache的.htaccess文件中使用基本身份驗(yàn)證\h17.6使用mod_auth_mysql身份驗(yàn)證\h17.7創(chuàng)建自定義身份驗(yàn)證\h17.8進(jìn)一步學(xué)習(xí)\h17.9下一章\h第18章使用PHP和MySQL實(shí)現(xiàn)安全事務(wù)\h18.1提供安全的事務(wù)處理\h18.2使用加密套接字層(SSL)\h18.3屏蔽用戶(hù)的輸入\h18.4提供安全存儲(chǔ)\h18.5存儲(chǔ)信用卡號(hào)碼\h18.6在PHP中使用加密技術(shù)\h18.7進(jìn)一步學(xué)習(xí)\h18.8下一章\h第四篇PHP的高級(jí)技術(shù)\h第19章與文件系統(tǒng)和服務(wù)器的交互\h19.1文件上傳\h19.2使用目錄函數(shù)\h19.3與文件系統(tǒng)的交互\h19.4使用程序執(zhí)行函數(shù)\h19.5與環(huán)境變量交互:getenv()和putenv()\h19.6進(jìn)一步學(xué)習(xí)\h19.7下一章\h第20章使用網(wǎng)絡(luò)函數(shù)和協(xié)議函數(shù)\h20.1了解可供使用的協(xié)議\h20.2發(fā)送和讀取電子郵件\h20.3使用其他Web站點(diǎn)的數(shù)據(jù)\h20.4使用網(wǎng)絡(luò)查找函數(shù)\h20.5備份或鏡像一個(gè)文件\h20.6進(jìn)一步學(xué)習(xí)\h20.7下一章\h第21章日期和時(shí)間的管理\h21.1在PHP中獲取日期和時(shí)間\h21.2在PHP日期格式和MySQL日期格式之間進(jìn)行轉(zhuǎn)換\h21.3在PHP中計(jì)算日期\h21.4在MySQL中計(jì)算日期\h21.5使用微秒\h21.6使用日歷函數(shù)\h21.7進(jìn)一步學(xué)習(xí)\h21.8下一章\h第22章創(chuàng)建圖像\h22.1在PHP中設(shè)置圖像支持\h22.2理解圖像格式\h22.3創(chuàng)建圖像\h22.4在其他頁(yè)面中使用自動(dòng)生成的圖像\h22.5使用文本和字體創(chuàng)建圖像\h22.6繪制圖像與用圖表描繪數(shù)據(jù)\h22.7使用其他圖像函數(shù)\h22.8進(jìn)一步學(xué)習(xí)\h22.9下一章\h第23章在PHP中使用會(huì)話控制\h23.1什么是會(huì)話控制\h23.2理解基本的會(huì)話功能\h23.3實(shí)現(xiàn)簡(jiǎn)單的會(huì)話\h23.4創(chuàng)建一個(gè)簡(jiǎn)單的會(huì)話例子\h23.5配置會(huì)話控制\h23.6通過(guò)會(huì)話控制實(shí)現(xiàn)身份驗(yàn)證\h23.7進(jìn)一步學(xué)習(xí)\h23.8下一章\h第24章其他有用的特性\h24.1使用eval()函數(shù)對(duì)字符串求值\h24.2終止執(zhí)行:die()和exit()\h24.3序列化變量和對(duì)象\h24.4獲取PHP環(huán)境信息\h24.5暫時(shí)改變運(yùn)行時(shí)環(huán)境\h24.6源代碼加亮\h24.7在命令行中使用PHP\h24.8下一章\h第五篇?jiǎng)?chuàng)建實(shí)用的PHP和MySQL項(xiàng)目\h第25章在大型項(xiàng)目中使用PHP和MySQL\h25.1在Web開(kāi)發(fā)中應(yīng)用軟件工程\h25.2規(guī)劃和運(yùn)行Web應(yīng)用程序項(xiàng)目\h25.3重用代碼\h25.4編寫(xiě)可維護(hù)代碼\h25.5實(shí)現(xiàn)版本控制\h25.6選擇一個(gè)開(kāi)發(fā)環(huán)境\h25.7項(xiàng)目的文檔化\h25.8建立原型\h25.9將邏輯和內(nèi)容分離\h25.10優(yōu)化代碼\h25.11測(cè)試\h25.12進(jìn)一步學(xué)習(xí)\h25.13下一章\h第26章調(diào)試\h26.1編程錯(cuò)誤\h26.2使用變量幫助調(diào)試\h26.3錯(cuò)誤報(bào)告級(jí)別\h26.4改變錯(cuò)誤報(bào)告設(shè)置\h26.5觸發(fā)自定義錯(cuò)誤\h26.6巧妙地處理錯(cuò)誤\h26.7下一章\h第27章建立用戶(hù)身份驗(yàn)證機(jī)制和個(gè)性化設(shè)置\h27.1解決方案的組成\h27.2解決方案概述\h27.3實(shí)現(xiàn)數(shù)據(jù)庫(kù)\h27.4實(shí)現(xiàn)基本的網(wǎng)站\h27.5實(shí)現(xiàn)用戶(hù)身份驗(yàn)證\h27.6實(shí)現(xiàn)書(shū)簽的存儲(chǔ)和檢索\h27.7實(shí)現(xiàn)書(shū)簽推薦\h27.8考慮可能的擴(kuò)展\h27.9下一章\h第28章創(chuàng)建一個(gè)購(gòu)物車(chē)\h28.1解決方案的組成\h28.2解決方案概述\h28.3實(shí)現(xiàn)數(shù)據(jù)庫(kù)\h28.4實(shí)現(xiàn)在線目錄\h28.5實(shí)現(xiàn)購(gòu)物車(chē)\h28.6實(shí)現(xiàn)付款\h28.7實(shí)現(xiàn)一個(gè)管理界面\h28.8擴(kuò)展該項(xiàng)目\h28.9使用一個(gè)已有系統(tǒng)\h28.10下一章\h第29章創(chuàng)建一個(gè)基于Web的電子郵件服務(wù)系統(tǒng)\h29.1解決方案的組成\h29.2解決方案概述\h29.3建立數(shù)據(jù)庫(kù)\h29.4了解腳本架構(gòu)\h29.5登錄與登出\h29.6建立賬戶(hù)\h29.7閱讀郵件\h29.8發(fā)送郵件\h29.9擴(kuò)展這個(gè)項(xiàng)目\h29.10下一章\h第30章創(chuàng)建一個(gè)郵件列表管理器\h30.1解決方案的組成\h30.2解決方案概述\h30.3建立數(shù)據(jù)庫(kù)\h30.4定義腳本架構(gòu)\h30.5實(shí)現(xiàn)登錄\h30.6用戶(hù)函數(shù)的實(shí)現(xiàn)\h30.7管理功能的實(shí)現(xiàn)\h30.8擴(kuò)展這個(gè)項(xiàng)目\h30.9下一章\h第31章創(chuàng)建一個(gè)Web論壇\h31.1理解流程\h31.3解決方案概述\h31.4數(shù)據(jù)庫(kù)的設(shè)計(jì)\h31.5查看文章的樹(shù)形結(jié)構(gòu)\h31.7添加新文章\h31.8添加擴(kuò)充\h31.9使用一個(gè)已有的系統(tǒng)\h31.10下一章\h第32章生成PDF格式的個(gè)性化文檔\h32.1項(xiàng)目概述\h32.2解決方案的組成\h32.3解決方案概述\h32.4處理標(biāo)題的問(wèn)題\h32.5擴(kuò)展該項(xiàng)目\h32.6下一章\h第33章使用XML和SOAP來(lái)連接Web服務(wù)\h33.1項(xiàng)目概述:使用XML和Web服務(wù)\h33.2解決方案的組成\h33.3解決方案概述\h33.4安裝項(xiàng)目代碼\h33.5擴(kuò)展這個(gè)項(xiàng)目\h33.6進(jìn)一步學(xué)習(xí)\h第34章使用Ajax構(gòu)建Web2.0應(yīng)用\h34.1Ajax是什么\h34.2Ajax基礎(chǔ)\h34.3在以前的項(xiàng)目添加Ajax元素\h34.4進(jìn)一步學(xué)習(xí)\h附錄\h附錄A安裝PHP及MySQL\hA.1在UNIX環(huán)境下安裝Apache、PHP和MySQL\hA.2在Windows下安裝Apache、PHP和MySQL\hA.3PEAR安裝\hA.4設(shè)置其他配置\h附錄BWeb資源\hB.1PHP資源\hB.2MySQL和SQL的特定資源\hB.3Apache資源\hB.4Web開(kāi)發(fā)\h光盤(pán)內(nèi)容第一篇使用PHP第1章PHP快速入門(mén)本章簡(jiǎn)單介紹PHP的語(yǔ)法和語(yǔ)言結(jié)構(gòu)。如果讀者已經(jīng)是PHP程序員,本章可能會(huì)彌補(bǔ)已有知識(shí)的一些不足。如果讀者具有使用C、Perl、ASP或其他編程語(yǔ)言的背景,本章將幫助讀者快速地掌握PHP語(yǔ)言。在本書(shū)中,讀者將通過(guò)取材于我們構(gòu)建真實(shí)商業(yè)站點(diǎn)的實(shí)例來(lái)學(xué)習(xí)如何使用PHP。通常,一般的編程語(yǔ)言教科書(shū)只是通過(guò)非常簡(jiǎn)單的例子來(lái)介紹基本語(yǔ)法。我們決定不這么做。我們意識(shí)到讀者最希望做的是運(yùn)行這些例子,了解如何使用該語(yǔ)言,而不是逐個(gè)地學(xué)習(xí)類(lèi)似于聯(lián)機(jī)手冊(cè)的語(yǔ)法和函數(shù)引用。嘗試運(yùn)行這些例子。手工輸入或從隨書(shū)附帶的文件載入這些例子,對(duì)它們進(jìn)行修改或者分解它們,然后學(xué)習(xí)如何對(duì)它們進(jìn)行修復(fù)。在本章中,我們將以一個(gè)在線產(chǎn)品訂單的例子為開(kāi)始,學(xué)習(xí)在PHP中如何使用變量、操作符和表達(dá)式,其中還涵蓋了變量類(lèi)型和操作符優(yōu)先級(jí)。讀者還將學(xué)習(xí)如何訪問(wèn)訂單中的表單變量,以及如何操作這些變量,從而計(jì)算出一個(gè)客戶(hù)訂單的總金額和稅金。接著,我們將使用PHP腳本開(kāi)發(fā)一個(gè)能夠驗(yàn)證客戶(hù)輸入數(shù)據(jù)的在線訂單示例。我們還將學(xué)習(xí)布爾值的概念,以及使用if、else、?:操作符以及switch語(yǔ)句的例子。最后,我們將學(xué)習(xí)循環(huán)語(yǔ)句,并使用這些語(yǔ)句編寫(xiě)一些可以生成HTML表格的PHP腳本。在本章中,我們將主要介紹以下內(nèi)容:■在HTML中嵌入PHP■添加動(dòng)態(tài)內(nèi)容■訪問(wèn)表單變量■理解標(biāo)識(shí)符■創(chuàng)建用戶(hù)聲明的變量■檢查變量類(lèi)型■給變量賦值■聲明和使用常量■理解變量的作用域■理解操作符和優(yōu)先級(jí)■表達(dá)式■使用可變函數(shù)■使用if、else和switch語(yǔ)句進(jìn)行條件判斷■使用while、do和for迭代語(yǔ)句1.1開(kāi)始之前:了解PHP為了使用本章和本書(shū)所有例子,讀者必須能夠訪問(wèn)一個(gè)安裝了PHP的Web服務(wù)器。要掌握這些例子和實(shí)例研究,必須運(yùn)行它們,并且嘗試對(duì)其進(jìn)行修改。此外,還將需要一個(gè)可以進(jìn)行實(shí)驗(yàn)的測(cè)試平臺(tái)。如果機(jī)器還沒(méi)有安裝PHP,必須先安裝PHP,或者讓系統(tǒng)管理員為你安裝。可以在附錄A中找到安裝指南。1.2創(chuàng)建一個(gè)示例應(yīng)用:Bob的汽車(chē)零部件商店任何服務(wù)器端腳本語(yǔ)言最常見(jiàn)的應(yīng)用之一就是處理HTML表單。我們將為Bob汽車(chē)零部件商店(一個(gè)虛擬的汽車(chē)零部件公司)實(shí)現(xiàn)一個(gè)訂單表單,從而開(kāi)始PHP的學(xué)習(xí)。1.2.1創(chuàng)建訂單表單Bob的HTML程序員已經(jīng)設(shè)置好Bob汽車(chē)零部件商店所銷(xiāo)售的零部件訂單。該訂單如圖1-1所示。這是一個(gè)相對(duì)比較簡(jiǎn)單的訂單,類(lèi)似于讀者在Internet上看到的訂單。圖1-1Bob最初的訂單只能記錄商品和數(shù)量Bob希望能夠知道他的客戶(hù)訂購(gòu)了什么商品,訂單的總金額以及該訂單的稅金。程序清單1-1給出了該HTML頁(yè)面的部分代碼。程序清單1-1orderform.html——Bob基本訂單表單的HTML代碼<formaction="processorder.php"method="post"><tableborder="0"><trbgcolor="#cccccc"><tdwidth="150">Item</td><tdwidth="15">Quantity</td></tr><tr><td>Tires</td><tdalign="center"><inputtype="text"name="tireqty"size="3"maxlength="3"/></td></tr><tr><td>Oil</td><tdalign="center"><inputtype="text"name="oilqty"size="3"maxlength="3"/></td></tr><tr><td>SparkPlugs</td><tdalign="center"><inputtype="text"name="sparkqty"size="3"maxlength="3"/></td></tr><tr><tdcolspan="2"align="center"><inputtype="submit"value="SubmitOrder"/></td></tr></table></form>請(qǐng)注意,該表單的動(dòng)作被設(shè)置為能夠處理客戶(hù)訂單的PHP腳本名稱(chēng)(在稍后內(nèi)容中,我們將編寫(xiě)該腳本)。一般地說(shuō),action屬性值就是用戶(hù)點(diǎn)擊“Submit(提交)”按鈕時(shí)將要載入的URL。用戶(hù)在表單中輸入的數(shù)據(jù)將按照method屬性中指定的方法發(fā)送到這個(gè)URL,該方法可以是get(附加在URL的結(jié)尾)或post(以單獨(dú)消息的形式發(fā)送)。此外,還需要注意的是,表單域的名稱(chēng)——tireqty、oilqty和sparkqty。在這個(gè)PHP腳本中,我們還將使用這些名稱(chēng)。正是由于這一點(diǎn),給表單域定義有意義的名稱(chēng)是非常重要的,因?yàn)楫?dāng)你編寫(xiě)PHP腳本時(shí),我們就很容易記住這些名稱(chēng)。在默認(rèn)的情況下,有些HTML編輯器將生成類(lèi)似于field23的表單域名稱(chēng)。要記住這些名稱(chēng)是很困難的。如果表單域名稱(chēng)能夠反映輸入到該域的數(shù)據(jù),PHP編程工作就會(huì)變得更加輕松。讀者可能會(huì)考慮對(duì)表單域名稱(chēng)的命名采用一種統(tǒng)一的編碼標(biāo)準(zhǔn),這樣站點(diǎn)中的所有表單域名稱(chēng)就可以使用相同的格式。這樣,無(wú)論在域名稱(chēng)中使用了詞的縮寫(xiě)還是下畫(huà)線,都可以輕松地記住它們。1.2.2表單處理處理這個(gè)表單,我們需要?jiǎng)?chuàng)建在form標(biāo)記的action屬性中指定的腳本,該腳本為processorder.php。打開(kāi)文本編輯器并創(chuàng)建該文件。輸入如下所示的代碼:<html><head><title>Bob'sAutoParts-OrderResults</title></head><body><h1>Bob'sAutoParts</h1><h2>OrderResults</h2></body></html>請(qǐng)注意,到目前為止,我們所輸入的內(nèi)容還只是純HTML。現(xiàn)在,我們可以開(kāi)始在這些腳本中添加一些簡(jiǎn)單的PHP代碼。1.3在HTML中嵌入PHP在以上代碼的<h2>標(biāo)記處,添加如下代碼:<?phpecho'<p>Orderprocessed.</p>';?>保存并在瀏覽器中載入該文件,填寫(xiě)該表單,點(diǎn)擊"SubmitOrder"(提交表單)按鈕。你將看到類(lèi)似于圖1-2所示的輸出結(jié)果。圖1-2傳遞給PHPecho語(yǔ)句中的文本顯示在瀏覽器中請(qǐng)注意,我們所編寫(xiě)的PHP代碼是如何嵌入到一個(gè)常見(jiàn)的HTML文件中的。通過(guò)瀏覽器,查看該HTML的源代碼。讀者將看到如下所示的代碼:<html><head><title>Bob'sAutoParts-OrderResults</title></head><body><h1>Bob'sAutoParts</h1><h2>OrderResults</h2><p>Orderprocessed.</p></body></html>以上代碼并沒(méi)有顯示原始的PHP語(yǔ)句。這是因?yàn)镻HP解釋器已經(jīng)運(yùn)行了該腳本,并且用該腳本的輸出代替了腳本本身。這就意味著,通過(guò)PHP,我們可以生成能在任何瀏覽器中查看的純HTML——換句話說(shuō),用戶(hù)的瀏覽器并不需要理解PHP。這個(gè)例子簡(jiǎn)要地說(shuō)明了服務(wù)器端腳本的概念。PHP腳本在Web服務(wù)器上被解釋和執(zhí)行,這與在用戶(hù)機(jī)器上的Web瀏覽器中解釋并執(zhí)行的JavaScript及其他客戶(hù)端技術(shù)是不同的。現(xiàn)在,這個(gè)文件中的代碼由如下4部分組成:■HTML■PHP標(biāo)記■PHP語(yǔ)句■空格我們也可以添加注釋。在這個(gè)例子中的大多數(shù)語(yǔ)句行都只是純HTML。1.3.1PHP標(biāo)記上例中的PHP代碼是以"<?php"為開(kāi)始,“?>”為結(jié)束。這類(lèi)似于所有HTML標(biāo)記,因?yàn)樗鼈兌际且孕∮谔?hào)(<)為開(kāi)始,大于號(hào)為結(jié)束(>)。這些符號(hào)(<?php和?>)叫做PHP標(biāo)記,可以告訴Web服務(wù)器PHP代碼的開(kāi)始和結(jié)束。這兩個(gè)標(biāo)記之間的任何文本都會(huì)被解釋成為PHP。而此標(biāo)記之外的任何文本都會(huì)被認(rèn)為是常規(guī)的HTML。PHP標(biāo)記可以隔離PHP代碼和HTML。你也可以選擇不同風(fēng)格的PHP標(biāo)記,如下內(nèi)容將詳細(xì)介紹。PHP標(biāo)記有4種不同的風(fēng)格可供我們使用。如下所示的4段代碼都是等價(jià)的。■XML風(fēng)格<?phpecho'<p>Orderprocessed.</p>';?>這是本書(shū)中將使用的標(biāo)記風(fēng)格。它是PHP推薦使用的標(biāo)記風(fēng)格。服務(wù)器管理員不能禁用這種風(fēng)格的標(biāo)記,因此可以保證在所有服務(wù)器上使用這種風(fēng)格的標(biāo)記,特別是編寫(xiě)用于不同服務(wù)器環(huán)境的應(yīng)用程序時(shí),這種標(biāo)記風(fēng)格尤為重要。這種風(fēng)格的標(biāo)記可以在XML(可擴(kuò)展標(biāo)記語(yǔ)言)文檔中使用。通常,我們建議你使用這種風(fēng)格。■簡(jiǎn)短風(fēng)格<?echo'<p>Orderprocessed.</p>';?>這種標(biāo)記風(fēng)格是最簡(jiǎn)單的,它遵循SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)處理說(shuō)明的風(fēng)格。要使用這種標(biāo)記風(fēng)格(輸入字符最少)你必須在配置文件中啟用short_open_tag選項(xiàng),或者啟用短標(biāo)記選項(xiàng)編譯PHP。在附錄A,你可以找到關(guān)于如何使用這種標(biāo)記風(fēng)格的更多信息。不推薦使用這種風(fēng)格的標(biāo)記,因?yàn)檫@種風(fēng)格在許多環(huán)境的默認(rèn)設(shè)置中已經(jīng)是不支持的。■SCRIPT風(fēng)格<scriptlanguage='php'>echo'<p>Orderprocessed.</p>';</script>這種標(biāo)記風(fēng)格是最長(zhǎng)的,如果讀者使用過(guò)JavaScript或VBScript,就會(huì)熟悉這種風(fēng)格。如果讀者所使用的HTML編輯器無(wú)法支持其他標(biāo)記風(fēng)格,可以使用它。■ASP風(fēng)格<%echo'<p>Orderprocessed.</p>';%>這種標(biāo)記風(fēng)格與ActiveServerPages(ASP)或ASP.NET的標(biāo)記風(fēng)格相同。如果在配置設(shè)定中啟用了asp_tags選項(xiàng),就可以使用它。如果讀者所使用的編輯器不是專(zhuān)門(mén)為ASP或ASP.NET而設(shè)計(jì)的,就請(qǐng)不要使用它。但是請(qǐng)注意,在默認(rèn)情況下,該標(biāo)記風(fēng)格是禁用的。1.3.2PHP語(yǔ)句通過(guò)將PHP語(yǔ)句放置在PHP的開(kāi)始和結(jié)束標(biāo)記之間,我們可以告訴PHP解釋器進(jìn)行何種操作。在這個(gè)例子中,我們只使用了一種類(lèi)型的語(yǔ)句:echo'<p>Orderprocessed.</p>';正如讀者可能已經(jīng)猜到的那樣,使用echo語(yǔ)句具有一個(gè)非常簡(jiǎn)單的結(jié)果;它將傳遞給其自身的字符串打印(或者回顯)到瀏覽器。在圖1-2中,可以看到該語(yǔ)句的結(jié)果,也就是"Orderprocessed."文本出現(xiàn)在瀏覽器窗口中。請(qǐng)注意,在echo語(yǔ)句的結(jié)束處出現(xiàn)了一個(gè)分號(hào)。在PHP中,分號(hào)是用來(lái)分隔語(yǔ)句的,就像英文的點(diǎn)號(hào)用來(lái)分隔句子一樣。如果讀者以前使用過(guò)C或Java,將會(huì)習(xí)慣使用分號(hào)來(lái)分隔語(yǔ)句。丟失這個(gè)分號(hào)是最容易出現(xiàn)的語(yǔ)法錯(cuò)誤。但是,這也是最容易發(fā)現(xiàn)和修改的錯(cuò)誤。1.3.3空格間隔字符,例如換行(回車(chē))、空格和Tab(制表符),都被認(rèn)為是空格。正如讀者可能已經(jīng)知道的,瀏覽器將會(huì)忽略HTML的空格字符。PHP引擎同樣會(huì)忽略這些空格字符。分析如下兩段HTML代碼:<h1>W(wǎng)elcometoBob'sAutoParts!</h1><p>W(wǎng)hatwouldyouliketoordertoday?</p>和<h1>W(wǎng)elcometoBob'sAutoParts!</h1><p>W(wǎng)hatwouldyouliketoordertoday?</p>這兩段HTML代碼將產(chǎn)生相同的輸出,因?yàn)樗鼈儗?duì)瀏覽器來(lái)說(shuō)都是相同的。但是,我們推薦在HTML的合適位置使用空格,因?yàn)檫@將提高HTML代碼的可讀性。這同樣適用于PHP。雖然PHP語(yǔ)句之間完全沒(méi)有必要添加任何空格字符,但是如果每一行放置一條單獨(dú)的語(yǔ)句,將便于我們閱讀代碼。例如,echo'hello';echo'world';和echo'hello';echo'world';是等價(jià)的,但是第一種代碼更容易閱讀。1.3.4注釋對(duì)于閱讀代碼的人來(lái)說(shuō),注釋其實(shí)就相當(dāng)于代碼的解釋和說(shuō)明。注釋可以用來(lái)解釋腳本的用途、腳本編寫(xiě)人、為什么要按如此的方法編寫(xiě)代碼、上一次修改的時(shí)間等。通常,讀者將在所有腳本中發(fā)現(xiàn)注釋?zhuān)詈?jiǎn)單的PHP腳本除外。PHP解釋器將忽略注釋中的任何文本。事實(shí)上,PHP分析器將跳過(guò)等同于空格字符的注釋。PHP支持C、C++和Shell腳本風(fēng)格的注釋。如下所示的是一個(gè)C風(fēng)格的注釋?zhuān)嘈凶⑨尶梢猿霈F(xiàn)在PHP腳本的開(kāi)始處:/*Author:BobSmithLastmodified:April10Thisscriptprocessesthecustomerorders.*/多行注釋?xiě)?yīng)該以/*為開(kāi)始,*/為結(jié)束。與C語(yǔ)言中相同,多行注釋是無(wú)法嵌套的。你也可以使用C++風(fēng)格的單行注釋?zhuān)篹cho'<p>Orderprocessed.</p>';//Startprintingorder或者Shell腳本風(fēng)格:echo'<p>Orderprocessed.</p>';#Startprintingorder無(wú)論何種風(fēng)格的注釋?zhuān)谧⑨尫?hào)(#或//)之后行結(jié)束之前,或PHP結(jié)束標(biāo)記之前的所有內(nèi)容都是注釋。在如下所示的代碼行中,關(guān)閉標(biāo)記之前的文本,"hereisacomment"是注釋的一部分。而關(guān)閉標(biāo)記之后文本,"hereisnot"將被當(dāng)作是HTML,因?yàn)樗挥陉P(guān)閉標(biāo)記之外。//hereisacomment?>hereisnot1.4添加動(dòng)態(tài)內(nèi)容到這里,我們還沒(méi)有使用PHP實(shí)現(xiàn)純HTML不能實(shí)現(xiàn)的功能。使用服務(wù)器端腳本語(yǔ)言的主要原因就是能夠?yàn)檎军c(diǎn)用戶(hù)提供動(dòng)態(tài)內(nèi)容。這是一個(gè)非常重要的應(yīng)用,因?yàn)楦鶕?jù)用戶(hù)需求或隨著時(shí)間的推進(jìn)而變化的內(nèi)容可以使得用戶(hù)不斷地訪問(wèn)這個(gè)站點(diǎn)。PHP就可以方便地實(shí)現(xiàn)這一功能。舉一個(gè)簡(jiǎn)單的例子。使用如下所示的代碼替換processorder.php腳本中的PHP代碼:<?phpecho"<p>Orderprocessedat";echodate('H:i,jSFY');echo"</p>";?>你也可以使用連接操作符(.)將其編寫(xiě)在一行代碼中。<?phpecho"<p>Orderprocessedat".date('H:i,jSFY')."</p>";?>在這段代碼中,我們使用PHP的內(nèi)置date()函數(shù)來(lái)告訴客戶(hù)其訂單被處理的日期和時(shí)間。當(dāng)該腳本每一次運(yùn)行時(shí),將會(huì)顯示不同的時(shí)間。該腳本的運(yùn)行輸出如圖1-3所示。圖1-3PHP的date()函數(shù)返回一個(gè)格式化的日期字符串1.4.1調(diào)用函數(shù)現(xiàn)在,看看date()函數(shù)的調(diào)用。這是函數(shù)調(diào)用的常見(jiàn)格式。PHP具有一個(gè)可供開(kāi)發(fā)Web應(yīng)用程序時(shí)使用的可擴(kuò)展函數(shù)庫(kù)。函數(shù)庫(kù)中的大多數(shù)函數(shù)都需要傳入的數(shù)據(jù),并且返回一些數(shù)據(jù)。看看如下所示的函數(shù)調(diào)用:date('H:i,jSF')請(qǐng)注意,我們將一個(gè)封閉在圓括號(hào)內(nèi)的字符串(文本數(shù)據(jù))傳遞給該函數(shù)。這個(gè)字符串就是函數(shù)的自變量或參數(shù)。這些自變量是輸入的,而且函數(shù)本身使用這些自變量來(lái)輸出某些特定結(jié)果。1.4.2使用date()函數(shù)date()函數(shù)需要一個(gè)傳遞給它的變量是格式化字符串,這個(gè)字符串表示所需要的輸出格式。字符串的每一個(gè)字母都表示日期和時(shí)間的一部分。H是24小時(shí)格式的小時(shí),i是分鐘,如果小時(shí)數(shù)和分鐘數(shù)是個(gè)位數(shù),需要在前面補(bǔ)0,j是該月的日期,不需要前面的補(bǔ)0,而s表示順序后綴(在這個(gè)例子中,是"th"),F(xiàn)是月份的全稱(chēng)。關(guān)于date()函數(shù)所支持的完整格式列表,請(qǐng)參閱第21章。1.5訪問(wèn)表單變量使用訂單的目的是為了收集客戶(hù)訂單。在PHP中,獲得客戶(hù)輸入的具體數(shù)據(jù)是非常簡(jiǎn)單的,但是具體的方法還依賴(lài)于你所使用的PHP版本,以及php.ini文件的設(shè)置。1.5.1簡(jiǎn)短、中等以及冗長(zhǎng)風(fēng)格的表單變量在PHP腳本中,可以用PHP變量的形式訪問(wèn)每一個(gè)表單域,其中PHP變量名稱(chēng)必須與表單域的名稱(chēng)一致。你可以很容易識(shí)別PHP的變量名稱(chēng),因?yàn)樗鼈兌际且?符號(hào)開(kāi)始的。(漏掉這個(gè)$符號(hào)是一個(gè)常見(jiàn)的編程錯(cuò)誤。)根據(jù)PHP版本和設(shè)置的不同,通過(guò)變量,可以有3種方法來(lái)訪問(wèn)表單數(shù)據(jù)。這些方法并沒(méi)有正式的名稱(chēng),因此我們給它們定義了3個(gè)昵稱(chēng),分別是簡(jiǎn)短風(fēng)格、中等風(fēng)格和冗長(zhǎng)風(fēng)格。在任何情況下,一個(gè)頁(yè)面上提交給PHP腳本的每一個(gè)表單域在PHP腳本中都是可以使用的。你可以按如下所示的方法訪問(wèn)tireqty域的內(nèi)容:$tireqty//shortstyle$_POST['tireqty']//mediumstyle$HTTP_POST_VARS['tireqty']//longstyle在這個(gè)例子以及整本書(shū)中,我們將使用中等風(fēng)格(也就是,$_POST['tireqty'])來(lái)引用表單變量,但是為了便于使用,我們創(chuàng)建了簡(jiǎn)短風(fēng)格的變量。然而,在代碼中,我們采用這種風(fēng)格而不是自動(dòng)選擇的風(fēng)格來(lái)引用變量,是因?yàn)樽詣?dòng)選擇風(fēng)格可能會(huì)帶來(lái)安全性的問(wèn)題。對(duì)于讀者自己的代碼,讀者可能會(huì)決定使用不同的方法,但是必須做出正確的選擇。接下來(lái)我們將介紹上述不同的方法。■簡(jiǎn)短風(fēng)格($tireqty)非常方便,但是需要將register_globals配置選項(xiàng)設(shè)置為on。由于安全性的原因,在默認(rèn)情況下,該選項(xiàng)的默認(rèn)設(shè)定值為off。這種風(fēng)格的標(biāo)記容易導(dǎo)致產(chǎn)生安全性問(wèn)題的錯(cuò)誤,也就是為什么不推薦的原因。在PHP6中,這個(gè)配置選項(xiàng)可能會(huì)被棄用,因此在新代碼中使用這種風(fēng)格的變量名稱(chēng)并不是好的想法。■中等風(fēng)格($_POST['tireqty'])是如今所推薦的。如果基于中等風(fēng)格,創(chuàng)建簡(jiǎn)短版本的變量名稱(chēng)(我們將在整本書(shū)中使用這種方式)將不會(huì)產(chǎn)生安全性問(wèn)題,只是便于使用的問(wèn)題。■冗長(zhǎng)風(fēng)格($HTTP_POST_VARS['tireqty'])是最詳細(xì)的,但是請(qǐng)注意,它已經(jīng)被棄用,因此從長(zhǎng)遠(yuǎn)看,這種風(fēng)格可能會(huì)被刪除。這種風(fēng)格過(guò)去曾是最容易移植的,但是如今可以通過(guò)register_long_arrays配置指令禁用它,這樣可以改進(jìn)性能。因此,同樣地,如果不需要將你的代碼安裝在舊版本的服務(wù)器上,就沒(méi)有必要在新代碼中使用這種風(fēng)格。當(dāng)使用簡(jiǎn)短風(fēng)格時(shí),腳本中的變量名稱(chēng)應(yīng)該與HTML表單中的表單域名稱(chēng)相同。在腳本中,不需要聲明變量或者創(chuàng)建這些變量。就如同向一個(gè)函數(shù)傳遞參數(shù),這些變量將被傳遞到腳本中。如果讀者使用這種風(fēng)格,就可以使用類(lèi)似于$tireqty的變量。表單中的tireqty域?qū)⒃诒韱翁幚砟_本中創(chuàng)建$tireqty變量。對(duì)變量如此方便的訪問(wèn)是非常受歡迎的,但是在將該選項(xiàng)設(shè)置為on之前,讀者應(yīng)該想想為什么PHP開(kāi)發(fā)小組將該選項(xiàng)設(shè)置為off。像這樣對(duì)變量的直接訪問(wèn)是非常方便的,但是這可能會(huì)使讀者遇到破壞腳本安全性的編程錯(cuò)誤。由于表單變量會(huì)自動(dòng)轉(zhuǎn)換成全局變量,因此在你所創(chuàng)建的變量與直接來(lái)自用戶(hù)的不可信任的變量之間沒(méi)有明顯的區(qū)別。如果沒(méi)有對(duì)自己的變量賦給一個(gè)初始值,腳本用戶(hù)就可以像表單變量一樣傳遞變量和值,這樣就可能造成混亂。如果選擇使用方便的簡(jiǎn)短風(fēng)格來(lái)訪問(wèn)變量,必須注意對(duì)你自己的變量賦予一個(gè)初始值。中等風(fēng)格涉及了從$_POST、$_GET或$_REQUEST數(shù)組之一檢索變量。$_GET或$_POST數(shù)組之一都可以保存表單變量的細(xì)節(jié)。使用哪一個(gè)數(shù)組取決于提交表單時(shí)使用的方法是POST還是GET。此外,通過(guò)POST或GET方法及其組合方式提交的所有數(shù)據(jù)都可以通過(guò)$_REQUEST數(shù)組獲得。如果表單是通過(guò)POST方法提交的,tireqty文本輸入框中的數(shù)據(jù)將保存在$_POST['tireqty']中。如果表單是通過(guò)GET方法提交的,數(shù)據(jù)將保存在$_GET['tireqty']。在任何一種情況下,數(shù)據(jù)都可以通過(guò)$_REQUEST['tireqty']獲得。這些數(shù)組被稱(chēng)作是超級(jí)全局(superglobal)變量。在我們介紹變量的作用域時(shí),我們還將在稍后的內(nèi)容詳細(xì)介紹這些超級(jí)全局變量。下面,讓我們看一個(gè)創(chuàng)建便于使用的變量副本的例子。要將一個(gè)變量的值復(fù)制給另一個(gè)變量,你可以使用賦值操作符。在PHP中,賦值操作符是等于號(hào)(=)。如下代碼將創(chuàng)建一個(gè)名為$tireqty的新變量,并且將$POST['tireqty']的內(nèi)容復(fù)制給這個(gè)新變量:$tireqty=$_POST['tireqty'];將如下代碼塊放置在訂單處理腳本的開(kāi)始處。在本書(shū)中,處理表單數(shù)據(jù)的所有腳本的開(kāi)始處都將包含與這個(gè)相似的代碼塊。由于這段代碼不會(huì)產(chǎn)生任何輸出,因此無(wú)論將這段代碼放置在開(kāi)始一個(gè)HTML頁(yè)面的<html>和其他HTML標(biāo)記之前還是之后,都不會(huì)有任何差異。通常,我們將這段代碼放置在腳本的最開(kāi)始處,這樣容易查找。<?php//createshortvariablenames$tireqty=$_POST['tireqty'];$oilqty=$_POST['oilqty'];$sparkqty=$_POST['sparkqty'];?>這段代碼將創(chuàng)建3個(gè)新變量:$tireqty、$oilqty和$sparkqty,并且將通過(guò)POST方法從表單中傳送過(guò)來(lái)的數(shù)據(jù)分別賦值給這3個(gè)變量。要使該腳本能夠完成一些可見(jiàn)的操作,可以在PHP腳本結(jié)束處添加如下所示的代碼:echo'<p>Yourorderisasfollows:</p>';echo$tireqty.'tires<br/>';echo$oilqty.'bottlesofoil<br/>';echo$sparkqty.'sparkplugs<br/>';在這里,還沒(méi)有檢查變量?jī)?nèi)容,因此也無(wú)法確認(rèn)一些重要數(shù)據(jù)已經(jīng)進(jìn)入了每一個(gè)表單域。嘗試輸入一些錯(cuò)誤數(shù)據(jù)并且觀察發(fā)生的事情。閱讀本章的剩余部分后,讀者可能希望嘗試在該腳本中添加一些數(shù)據(jù)校驗(yàn)的邏輯。像上例中,從用戶(hù)輸入直接獲得輸入并輸出到瀏覽器是一個(gè)有風(fēng)險(xiǎn)的操作,它可能帶來(lái)安全隱患。你應(yīng)該對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。在第4章,我們將介紹輸入過(guò)濾。在第16章將深入介紹安全性問(wèn)題。如果現(xiàn)在于瀏覽器中載入這個(gè)文件,該腳本輸出結(jié)果將類(lèi)似于圖1-4。當(dāng)然,具體的數(shù)值還取決于在表單中輸入的數(shù)據(jù)。圖1-4在processorder.php中很容易訪問(wèn)用戶(hù)輸入的表單變量在接下來(lái)的內(nèi)容中,我們將介紹這個(gè)例子中幾個(gè)有趣的方面。1.5.2字符串的連接在這個(gè)示例腳本中,我們使用echo語(yǔ)句來(lái)打印用戶(hù)在每一個(gè)表單域所輸入的值,而這些值是跟隨在一段說(shuō)明性文本之后的。如果仔細(xì)查看echo語(yǔ)句,讀者將發(fā)現(xiàn)在變量名稱(chēng)和后續(xù)文本之間存在一個(gè)點(diǎn)號(hào)(.),例如:echo$tireqty.'tires<br/>';這個(gè)點(diǎn)號(hào)是字符串連接符,它可以將幾段文本連接成一個(gè)字符串。通常,當(dāng)使用echo命令向?yàn)g覽器發(fā)送輸出時(shí),將使用這個(gè)連接符。這可以用來(lái)避免編寫(xiě)多個(gè)echo命令。對(duì)于任何簡(jiǎn)單類(lèi)型的變量,都可以將變量寫(xiě)入到一個(gè)由雙引號(hào)引起來(lái)的字符串中(數(shù)組變量要復(fù)雜一點(diǎn),在第4章中將詳細(xì)介紹數(shù)組和字符串的組合)。分析如下所示的例子:echo"$tireqtytires<br/>";這個(gè)語(yǔ)句等價(jià)于本節(jié)介紹的第一個(gè)語(yǔ)句。這兩種格式都是有效的,而且使用任何一種格式都只是個(gè)人愛(ài)好問(wèn)題。用一個(gè)字符串的內(nèi)容來(lái)代替一個(gè)變量的操作就是插值(interpolation)。請(qǐng)注意,插值操作只是雙引號(hào)引用的字符串特性之一。不能像這樣將一個(gè)變量名稱(chēng)放置在一個(gè)由單引號(hào)引用的字符串中。運(yùn)行如下所示的代碼:echo'$tireqtytires<br/>';該代碼將"$tireqtytires<br/>"發(fā)送給瀏覽器。在雙引號(hào)中,變量名稱(chēng)將被變量值所替代。而在單引號(hào)中,變量名稱(chēng),或者任何其他文本都會(huì)不經(jīng)修改而發(fā)送給瀏覽器。1.5.3變量和文本在示例腳本中,每一個(gè)echo語(yǔ)句中連接在一起的變量和字符串是完全不同的。變量是表示數(shù)據(jù)的符號(hào)。字符串是數(shù)據(jù)本身。當(dāng)我們?cè)谙襁@個(gè)腳本一樣的程序中使用原始數(shù)據(jù)時(shí),我們將其稱(chēng)之為文本,用來(lái)區(qū)分變量。$tireqty是一個(gè)變量,它是一個(gè)表示客戶(hù)輸入數(shù)據(jù)的符號(hào)。相反,'tires<br/>'則是文本,它的值來(lái)自其字面值。記住了上一節(jié)中的第二個(gè)示例嗎?PHP將用保存在變量中的值來(lái)代替字符串中的變量名稱(chēng)$tireqty。請(qǐng)記住,已經(jīng)介紹的兩種字符串類(lèi)型——一種是具有雙引號(hào)的,而另一種是具有單引號(hào)的。PHP將試著計(jì)算雙引號(hào)字符串,這樣就導(dǎo)致了我們前面所看到的操作發(fā)生。而單引號(hào)字符串將被當(dāng)作是真正的文本。此外還有第3種指定字符串的方法:heredoc語(yǔ)法(<<<),Perl用戶(hù)一定會(huì)熟悉這個(gè)語(yǔ)法。通過(guò)指定一個(gè)用來(lái)結(jié)束字符串的結(jié)束標(biāo)記,Heredoc語(yǔ)法允許指定長(zhǎng)字符串。如下所示的代碼創(chuàng)建了一個(gè)3行的字符串并且回顯它們:echo<<<theEndline1line2line3theEndtheEnd標(biāo)記是非常模糊的,它只需要保證不會(huì)出現(xiàn)在文本中。要關(guān)閉一個(gè)heredoc字符串,可以在每一行的開(kāi)始處放置一個(gè)關(guān)閉標(biāo)記。Heredoc字符串是插補(bǔ)的,就像雙引號(hào)字符串。1.6理解標(biāo)識(shí)符標(biāo)識(shí)符是變量的名稱(chēng)。(函數(shù)和類(lèi)的名稱(chēng)也是標(biāo)識(shí)符——我們將在第5章和第6章中詳細(xì)介紹函數(shù)和類(lèi)。)關(guān)于標(biāo)識(shí)符,PHP定義了一些簡(jiǎn)單的規(guī)則:■標(biāo)識(shí)符可以是任何長(zhǎng)度,而且可以由任何字母、數(shù)字、下畫(huà)線組成。■標(biāo)識(shí)符不能以數(shù)字開(kāi)始。■在PHP中,標(biāo)識(shí)符是區(qū)分大小寫(xiě)的。$tireqty與$TireQty是不同的。交替地使用這些標(biāo)識(shí)符是常見(jiàn)的編程錯(cuò)誤。對(duì)于這個(gè)規(guī)則,函數(shù)名稱(chēng)是個(gè)例外——函數(shù)名稱(chēng)可以是任意大小寫(xiě)的。■一個(gè)變量名稱(chēng)可以與一個(gè)函數(shù)名稱(chēng)相同。這一點(diǎn)容易造成混淆,雖然是允許的,應(yīng)該盡量避免。此外,不能創(chuàng)建一個(gè)具有與已有函數(shù)同名的函數(shù)。除了從HTML表單中傳入的變量外,還可以聲明并使用你自己的變量。PHP的特性之一就是它不要求在使用變量之前聲明變量。當(dāng)?shù)谝淮谓o一個(gè)變量賦值時(shí),你才創(chuàng)建了這個(gè)變量——在下一節(jié)詳細(xì)介紹。就像我們將一個(gè)變量值復(fù)制給另一個(gè)變量一樣,可以使用賦值操作符(=)給一個(gè)變量賦值。在Bob的站點(diǎn)上,我們希望計(jì)算出客戶(hù)訂購(gòu)商品的總數(shù)和總金額。我們可以創(chuàng)建兩個(gè)變量來(lái)保存這些數(shù)字。要?jiǎng)?chuàng)建兩個(gè)變量,需要將每一個(gè)變量初始化為0。在PHP腳本結(jié)束處中,添加如下所示的代碼:$totalqty=0;$totalamount=0.00;每一行代碼都將創(chuàng)建一個(gè)變量并且賦給一個(gè)數(shù)值。你也可以將變量值賦值給一個(gè)變量,例如:$totalqty=0;$totalamount=$totalqty;1.7檢查變量類(lèi)型變量類(lèi)型是指能夠保存在該變量中的數(shù)據(jù)類(lèi)型。PHP提供了一個(gè)完整的數(shù)據(jù)類(lèi)型集。不同的數(shù)據(jù)可以保存在不同的數(shù)據(jù)類(lèi)型中。1.7.1PHP的數(shù)據(jù)類(lèi)型PHP支持如下所示的基本數(shù)據(jù)類(lèi)型:■Integer(整數(shù))——用來(lái)表示整數(shù)■Float(浮點(diǎn)數(shù),也叫Double,雙精度值)——用來(lái)表示所有實(shí)數(shù)■String(字符串)——用來(lái)表示字符串■Boolean(布爾值)——用來(lái)表示true或者false■Array(數(shù)組)——用來(lái)保存具有相同類(lèi)型的多個(gè)數(shù)據(jù)項(xiàng)(參閱第3章)■Object(對(duì)象)——用來(lái)保存類(lèi)的實(shí)例(參閱第6章)此外還有兩個(gè)特殊的類(lèi)型:NULL(空)和resource(資源)。沒(méi)有被賦值、已經(jīng)被重置或者被賦值為特殊值NULL的變量就是NULL類(lèi)型的變量。特定的內(nèi)置函數(shù)(例如數(shù)據(jù)庫(kù)函數(shù))將返回resource類(lèi)型的變量。它們都代表外部資源(例如數(shù)據(jù)庫(kù)連接)。基本上不能直接操作一個(gè)resource變量,但是通常它們都將被函數(shù)返回,而且必須作為參數(shù)傳遞給其他函數(shù)。1.7.2類(lèi)型強(qiáng)度PHP是一種非常弱的類(lèi)型語(yǔ)言,或者動(dòng)態(tài)類(lèi)型語(yǔ)言。在大多數(shù)編程語(yǔ)言中,變量只能保存一種類(lèi)型的數(shù)據(jù),而且這個(gè)類(lèi)型必須在使用變量之前聲明,例如C語(yǔ)言。而在PHP中,變量的類(lèi)型是由賦給變量的值確定的。例如,當(dāng)我們創(chuàng)建$totalqty和$totalamount時(shí),就確定了它們的初始類(lèi)型,如下所示:$totalqty=0;$totalamount=0.00;由于我們將0賦值給$totalqty,$totalqty就是一個(gè)整數(shù)類(lèi)型的變量。同樣,$totalamount是一個(gè)浮點(diǎn)類(lèi)型的變量。非常奇怪的是,我們可以在腳本中添加如下所示的語(yǔ)句:$totalamount='Hello';$totalamount變量就可以是字符串類(lèi)型的。PHP可以在任何時(shí)間根據(jù)保存在變量中的值來(lái)確定變量的類(lèi)型。這種在任何時(shí)間透明地改變變量類(lèi)型的功能是非常有用的。請(qǐng)記住,PHP將“自動(dòng)地”獲得輸入的數(shù)據(jù)類(lèi)型。一旦從變量中檢索變量值,它將返回具有相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。1.7.3類(lèi)型轉(zhuǎn)換使用類(lèi)型轉(zhuǎn)換,可以將一個(gè)變量或值轉(zhuǎn)換成另一種類(lèi)型。這種轉(zhuǎn)換與C語(yǔ)言的類(lèi)型轉(zhuǎn)換是相同的。只需在希望進(jìn)行類(lèi)型轉(zhuǎn)換的變量之前的圓括號(hào)中插入需要轉(zhuǎn)換的臨時(shí)數(shù)據(jù)類(lèi)型即可。例如,我們可以使用類(lèi)型轉(zhuǎn)換聲明上一節(jié)中的兩個(gè)變量。$totalqty=0;$totalamount=(float)$totalqty;第2行代碼的意思是“取出保存在$totalqty中的變量值,將其解釋成一個(gè)浮點(diǎn)類(lèi)型,并且將其保存在$totalamount”中。$totalamount變量將變成浮點(diǎn)類(lèi)型。而被轉(zhuǎn)換的變量并不會(huì)改變其類(lèi)型,因此$totalqty仍然是整數(shù)類(lèi)型。你也可以使用PHP的內(nèi)置函數(shù)來(lái)測(cè)試并設(shè)置類(lèi)型,這將在本章稍后內(nèi)容介紹。1.7.4可變變量PHP提供了一種其他類(lèi)型的變量——可變變量。可變變量允許我們動(dòng)態(tài)地改變一個(gè)變量的名稱(chēng)。可以看到,在這方面,PHP具有非常大的自由度——所有語(yǔ)言都允許改變變量的值,但是并沒(méi)有太多的語(yǔ)言允許改變變量的類(lèi)型,至于支持改變變量名稱(chēng)的語(yǔ)言就更少了。這個(gè)特性的工作原理是用一個(gè)變量的值作為另一個(gè)變量的名稱(chēng)。例如,我們可以設(shè)置:$varname='tireqty';于是,我們就可以用$$varname取代$tireqty。例如,我們可以設(shè)置$tireqty的值:$$varname=5;這個(gè)代碼等價(jià)于:$tireqty=5;這種代碼看上去可能不太容易理解,但是我們將在以后的內(nèi)容詳細(xì)介紹它。不用單獨(dú)列出并使用每一個(gè)表單變量,我們可以使用一個(gè)循環(huán)語(yǔ)句和一個(gè)變量來(lái)自動(dòng)處理它們。關(guān)于循環(huán)語(yǔ)句的使用將在本章稍后的第1.15.2節(jié)舉例介紹。1.8聲明和使用常量正如讀者在前面所看到的,我們可以改變保存在一個(gè)變量中的值。我們也可以聲明常量。一個(gè)常量可以保存一個(gè)值,例如一個(gè)變量值,但是常量值一旦被設(shè)定后,在腳本的其他地方就不能再更改。在示例應(yīng)用中,可以將要出售的商品單價(jià)作為常量保存起來(lái)。你可以使用define函數(shù)定義這些常量:define('TIREPRICE',100);define('OILPRICE',10);define('SPARKPRICE',4);現(xiàn)在,將這幾行代碼添加到腳本中。這樣就有了3個(gè)用來(lái)計(jì)算顧客訂單總金額的常量。請(qǐng)注意,常量名稱(chēng)都是由大寫(xiě)字母組成的。這是借鑒了C語(yǔ)言的慣例,這樣就可以很容易區(qū)分變量和常量。這個(gè)慣例并不是必需的,但是它卻可以使代碼變得更容易閱讀和維護(hù)。常量和變量之間的一個(gè)重要不同點(diǎn)在于引用一個(gè)常量的時(shí)候,它前面并沒(méi)有$符號(hào)。如果要使用一個(gè)常量的值,只需要使用其名稱(chēng)就可以了。例如,要使用一個(gè)以上已經(jīng)創(chuàng)建的常量,可以輸入:echoTIREPRICE;除了可以自己定義常量外,PHP還預(yù)定義了許多常量。了解這些常量的簡(jiǎn)單方法就是運(yùn)行phpinfo()函數(shù):phpinfo();這個(gè)函數(shù)將給出一個(gè)PHP預(yù)定義常量和變量的列表,以及其他有用的信息。我們將在以后的內(nèi)容中逐步介紹它們。變量和常量的另一個(gè)差異在于常量只可以保存布爾值、整數(shù)、浮點(diǎn)數(shù)或字符串?dāng)?shù)據(jù)。這些類(lèi)型都是標(biāo)量數(shù)據(jù)。1.9理解變量的作用域作用域是指在一個(gè)腳本中某個(gè)變量可以使用或可見(jiàn)的范圍。PHP具有6項(xiàng)基本的作用域規(guī)則。■內(nèi)置超級(jí)全局變量可以在腳本的任何地方使用和可見(jiàn)。■常量,一旦被聲明,將可以在全局可見(jiàn);也就是說(shuō),它們可以在函數(shù)內(nèi)外使用。■在一個(gè)腳本中聲明的全局變量在整個(gè)腳本中是可見(jiàn)的,但不是在函數(shù)內(nèi)部。■函數(shù)內(nèi)部使用的變量聲明為全局變量時(shí),其名稱(chēng)要與全局變量名稱(chēng)一致。■在函數(shù)內(nèi)部創(chuàng)建并被聲明為靜態(tài)的變量無(wú)法在函數(shù)外部可見(jiàn),但是可以在函數(shù)的多次執(zhí)行過(guò)程中保持該值(我們將在第5章全面介紹這個(gè)思想)。■在函數(shù)內(nèi)部創(chuàng)建的變量對(duì)函數(shù)來(lái)說(shuō)是本地的,而當(dāng)函數(shù)終止時(shí),該變量也就不存在了。$_GET和$_POST數(shù)組以及一些其他特殊變量都具有各自的作用域規(guī)則。這些被稱(chēng)作超級(jí)全局變量,它們可以在任何地方使用和可見(jiàn),包括內(nèi)部和外部函數(shù)。超級(jí)全局變量的完整列表如下所示:■$GLOBALS,所有全局變量數(shù)組(就像global關(guān)鍵字,這將允許在一個(gè)函數(shù)內(nèi)部訪問(wèn)全局變量——例如,以$GLOBALS['myvariable']的形式。)■$_SERVER,服務(wù)器環(huán)境變量數(shù)組■$_GET,通過(guò)GET方法傳遞給該腳本的變量數(shù)組■$_POST,通過(guò)POST方法傳遞給該腳本的變量數(shù)組■$_COOKIE,cookie變量數(shù)組■$_FILES,與文件上傳相關(guān)的變量數(shù)組■$_ENV,環(huán)境變量數(shù)組■$_REQUEST,所有用戶(hù)輸入的變量數(shù)組,包括$_GET、$_POST和$_COOKIE所包含的輸入內(nèi)容(但是,不包括PHP4.3.0版本以后的$_FILES)■$_SESSION,會(huì)話變量數(shù)組在本書(shū)以后的相關(guān)內(nèi)容中,我們將逐個(gè)詳細(xì)介紹這些變量。在本章稍后介紹函數(shù)和類(lèi)的時(shí)候,我們將詳細(xì)介紹作用域。從現(xiàn)在開(kāi)始,在默認(rèn)情況下,我們所使用的所有變量都是全局變量。1.10使用操作符操作符是用來(lái)對(duì)數(shù)值和變量進(jìn)行某種操作運(yùn)算的符號(hào)。我們必須使用其中的一些操作符來(lái)計(jì)算顧客訂單總金額和應(yīng)該繳納的稅金。我們已經(jīng)提到了兩個(gè)操作符:賦值操作符(=)和字符串連接操作符(.)。現(xiàn)在,我們將了解完整的操作符列表。一般地說(shuō),操作符可以帶有1個(gè)、2個(gè)或者3個(gè)運(yùn)算對(duì)象,其中大多數(shù)操作符都是帶有兩個(gè)運(yùn)算對(duì)象。例如,賦值操作符就帶有兩個(gè)對(duì)象——左邊的對(duì)象表示保存值的位置,右邊的對(duì)象表示表達(dá)式。這些運(yùn)算對(duì)象叫做操作數(shù);即,要操作的對(duì)象。1.10.1算術(shù)操作符算術(shù)操作符非常直觀——它們就是常見(jiàn)的數(shù)學(xué)操作符。PHP的算術(shù)操作符如表1-1所示。對(duì)于每一個(gè)操作符,我們可以保存運(yùn)算后的結(jié)果。例如:$result=$a+$b;加法和減法與我們所想象的一樣。這些操作符將$a和$b中的值相加減,然后再保存起來(lái)。還可以將減號(hào)當(dāng)作一個(gè)一元操作符(也就是,一個(gè)只有一個(gè)運(yùn)算對(duì)象或操作數(shù)的操作符)來(lái)使用,表示負(fù)值。例如:$a=-1;乘法和除法也與我們所想象的一樣。請(qǐng)注意,我們使用星號(hào)(*)作為乘法操作符,而不是常規(guī)的乘法符號(hào)。同樣,使用正斜線表示除法操作符,而不是常規(guī)的除法符號(hào)。取余操作符返回的是$a除以$b以后的余數(shù),請(qǐng)看如下所示的代碼段:$a=27;$b=10;$result=$a%$b;變量$result中保存的值是27除以10以后的余數(shù),也就是7。應(yīng)該注意到,算術(shù)操作符通常用于整型或雙精度類(lèi)型的數(shù)據(jù)。如果將它們應(yīng)用于字符串,PHP會(huì)試圖將這些字符串轉(zhuǎn)換成一個(gè)數(shù)字。如果其中包含"e"或"E"字符,它就會(huì)被當(dāng)作是科學(xué)表示法并被轉(zhuǎn)換成浮點(diǎn)數(shù),否則將會(huì)被轉(zhuǎn)換成整數(shù)。PHP會(huì)在字符串開(kāi)始處尋找數(shù)字,并且使用這些數(shù)字作為該字符串的值,如果沒(méi)找到數(shù)字,該字符串的值則為0。1.10.2字符串操作符我們已經(jīng)了解并使用了唯一的字符串操作符。我們可以使用字符串連接操作符將兩個(gè)字符串連接起來(lái)生成并保存到一個(gè)新字符串中,就好像我們使用加法操作符將兩個(gè)數(shù)加起來(lái)一樣。$a="Bob's";$b="AutoParts";$result=$a.$b;變量$result當(dāng)前保存的值是"Bob'sAutoParts"字符串。1.10.3賦值操作符我們已經(jīng)了解了基本賦值操作符(=)。這個(gè)符號(hào)總是用作賦值操作符,其讀法為“被設(shè)置為”。例如:$totalqty=0;這個(gè)語(yǔ)句應(yīng)該讀成“$totalqty被設(shè)置為0”。我們將在本章后續(xù)小節(jié)介紹比較操作符時(shí)詳細(xì)介紹其原因,但是如果將其讀作等于,將會(huì)混淆它們。1.賦值運(yùn)算返回值與其他操作符一樣,使用賦值操作符也會(huì)返回一個(gè)值。如果寫(xiě)入:$a+$b這個(gè)表達(dá)式的值就是將$a與$b加在一起所得到的結(jié)果。同樣,如果寫(xiě)入:$a=0;這個(gè)表達(dá)式的值為0。這使你可以進(jìn)行如下操作:$b=6+($a=5);這樣賦給變量$b的值就是11。賦值運(yùn)算的規(guī)則是:整個(gè)賦值語(yǔ)句的值將賦給左邊的操作數(shù)。當(dāng)計(jì)算一個(gè)表達(dá)式的值時(shí),可以使用圓括號(hào)來(lái)提高子表達(dá)式的優(yōu)先級(jí),正如上例所示。這與數(shù)學(xué)當(dāng)中的計(jì)算法則是相同的。2.復(fù)合賦值操作符除了簡(jiǎn)單的賦值運(yùn)算,PHP還提供了一系列復(fù)合的賦值操作符。每一個(gè)操作符都可以很方便地對(duì)一個(gè)變量進(jìn)行運(yùn)算,然后再將運(yùn)算結(jié)果返回給原來(lái)的變量。例如:$a+=5;以上語(yǔ)句等價(jià)于:$a=$a+5;每一個(gè)算術(shù)操作符和字符串連接操作符都有一個(gè)對(duì)應(yīng)的復(fù)合賦值操作符。表1-2給出了所有復(fù)合賦值操作符及其用途。3.前置遞增遞減和后置遞增遞減運(yùn)算符前置遞增遞減和后置遞增遞減運(yùn)算符類(lèi)似于+=和-=操作符,但是它們還存在一些區(qū)別。所有遞增操作符都有兩個(gè)功能——將變量增加1后再將值賦給原變量。請(qǐng)看如下語(yǔ)句:$a=4;echo++$a;第2行代碼使用了前置遞增操作符,之所以這樣命名是因?yàn)?+符號(hào)出現(xiàn)在$a的前面。其運(yùn)行結(jié)果是:首先將變量$a加1,再將加1后的結(jié)果賦值給原變量。這樣,$a就變成了5,數(shù)值5被返回并顯示到屏幕。整個(gè)表達(dá)式的值就是5。(請(qǐng)注意,實(shí)際上,保存在$a中的值已經(jīng)發(fā)生變化:不僅僅是返回$a+1。)但是,如果把++放在$a的后面,就是使用后置遞增操作符。這個(gè)操作符的作用也有所不同。請(qǐng)看如下語(yǔ)句:$a=4;echo$a++;這個(gè)語(yǔ)句的執(zhí)行結(jié)果剛好相反。也就是,首先$a的值被返回并顯示在屏幕上,然后,它再加1。這個(gè)表達(dá)式的值是4,也是屏幕上將要顯示的結(jié)果。但是在執(zhí)行完這個(gè)語(yǔ)句后,$a的值變成了5。正如讀者所想象的,操作符--的行為與操作符++的行為類(lèi)似。但是,$a不是增加而是減少。4.引用操作符引用操作符&可以在關(guān)聯(lián)賦值中使用。通常,在將一個(gè)變量的值賦給另一個(gè)變量的時(shí)候,先產(chǎn)生原變量的一個(gè)副本,然后再將它保存在內(nèi)存的其他地方。例如:$a=5;$b=$a;這兩行代碼首先產(chǎn)生$a的一個(gè)副本,然后再將它保存到$b中。如果隨后改變$a的值,$b的值將不會(huì)改變:$a=7;//$bwillstillbe5可以使用引用操作符&來(lái)避免產(chǎn)生這樣的副本。例如:$a=5;$b=&$a;$a=7;//$aand$barenowboth7引用是非常有趣的。請(qǐng)記住,引用就像一個(gè)別名,而不是一個(gè)指針。$a和$b都指向了內(nèi)存的相同地址。可以通過(guò)重置它們來(lái)改變所指向的地址,如下所示:unset($a);重置并不會(huì)改變$b(7)的值,但是可以破壞$a和值7保存在內(nèi)存中的鏈接。1.10.4比較操作符比較操作符用來(lái)比較兩個(gè)值。比較操作符表達(dá)式根據(jù)比較結(jié)果返回邏輯值:true或false。1.等于操作符相等的比較操作符==(兩個(gè)等于號(hào))允許測(cè)試兩個(gè)值是否相等。例如,可以使用如下的表達(dá)式:$a==$b來(lái)測(cè)試$a和$b中的值是否相等。如果相等,這個(gè)表達(dá)式返回的結(jié)果為true,如果不等,這個(gè)表達(dá)式返回的結(jié)果為false。這個(gè)操作符很可能會(huì)與賦值操作符“=”混淆。同時(shí),即使出現(xiàn)混淆,程序也不會(huì)報(bào)錯(cuò),但是通常不會(huì)返回你所希望的結(jié)果。一般地說(shuō),非0數(shù)值都是true,0值為false。假設(shè)按如下所示的語(yǔ)句初始化兩個(gè)變量:$a=5;$b=7;如果測(cè)試的是$a=$b,結(jié)果會(huì)是true。為什么呢?表達(dá)式$a=$b的值就是賦給左邊的值,這個(gè)值為7。這是一個(gè)非0值,所以表達(dá)式的值是true。如果希望測(cè)試$a==$b,它的結(jié)果卻是false。這樣,在編碼中,就遇到了非常難發(fā)現(xiàn)的邏輯錯(cuò)誤。通常,應(yīng)該仔細(xì)檢查這兩個(gè)操作符的使用,確保所使用的操作符就是你要用的。使用賦值操作符而不是等于比較操作符是一個(gè)很容易犯的錯(cuò)誤,它可能在編程工作中多次出現(xiàn)。2.其他比較操作符PHP還支持其他一些比較操作符。表1-3給出了所有比較操作符。需要注意的一點(diǎn)是,恒等操作符===(三個(gè)等于號(hào))。只有當(dāng)恒等操作符兩邊的操作數(shù)相等并且具有相同的數(shù)據(jù)類(lèi)型時(shí),其返回值才為true。例如,0=='0'將為true,但是0==='0'就不是true,因?yàn)樽筮叺?是一個(gè)整數(shù),而另一個(gè)0則是一個(gè)字符串。1.10.5邏輯操作符邏輯操作符用來(lái)組合邏輯條件的結(jié)果。例如,我們可能對(duì)取值于0~100之間的變量$a的值感興趣,那么我們可以使用“與”(AND)操作符測(cè)試條件$a>=0和$a<=100,如下所示:$a>=0&&$a<=100PHP支持邏輯與(AND)、或(OR)、異或(XOR)以及非(NOT)的運(yùn)算。表1-4給出了這個(gè)邏輯操作符的集合及其用法。操作符"and"和"or"比&&和||的優(yōu)先級(jí)要低。在本章的后續(xù)內(nèi)容中,我們將詳細(xì)介紹優(yōu)先級(jí)問(wèn)題。1.10.6位操作符位操作符可以將一個(gè)整型變量當(dāng)作一系列的位(Bit,比特)來(lái)處理。在PHP中,讀者可能發(fā)現(xiàn)它們并不經(jīng)常使用,但是在這里,我們還是在表1-5中列出了它們。1.10.7其他操作符到目前為止,除了我們已經(jīng)介紹的操作符外,PHP還有一些其他操作符。逗號(hào)操作符“,”是用來(lái)分隔函數(shù)參數(shù)和其他列表項(xiàng)的,這個(gè)操作符經(jīng)常被附帶地(非獨(dú)立)使用。兩個(gè)特殊的操作符new和->,它們分別用來(lái)初始化類(lèi)的實(shí)例和訪問(wèn)類(lèi)的成員。它們將在第6章詳細(xì)介紹。此外,還有一些操作符,我們?cè)谶@里簡(jiǎn)單地介紹一下。1.三元操作符操作符?:語(yǔ)法格式如下所示:condition?valueiftrue:valueiffalse三元操作符類(lèi)似于條件語(yǔ)句if-else的表達(dá)式版本,這一點(diǎn)我們將在本章后續(xù)內(nèi)容詳細(xì)介紹。舉一個(gè)簡(jiǎn)單的例子:($grade>=50?'Passed':'Failed')這個(gè)表達(dá)式對(duì)學(xué)生級(jí)別進(jìn)行評(píng)分,“Passed(及格)”或“Failed(不及格)”。2.錯(cuò)誤抑制操作符錯(cuò)誤抑制操作符@可以在任何表達(dá)式前面使用,即任何有值的或者可以計(jì)算出值的表達(dá)式之前,例如:$a=@(57/0);如果沒(méi)有@操作符,這一行代碼將產(chǎn)生一個(gè)除0警告。使用這個(gè)操作符,這個(gè)警告就會(huì)被抑制住。如果通過(guò)這種方法抑制了一些警告,一旦遇到一個(gè)警告,你就要寫(xiě)一些錯(cuò)誤處理代碼。如果已經(jīng)啟用了PHP配置文件中的track_errors特性,錯(cuò)誤信息將會(huì)被保存在全局變量$php_errormsg中。3.執(zhí)行操作符執(zhí)行操作符實(shí)際上是一對(duì)操作符,它是一對(duì)反向單引號(hào)()。反向引號(hào)不是一個(gè)單引號(hào),通常,它與~位于鍵盤(pán)的相同位置。PHP將試著將反向單引號(hào)之間的命令當(dāng)作服務(wù)器端的命令行來(lái)執(zhí)行。表達(dá)式的值就是命令的執(zhí)行結(jié)果。例如,在類(lèi)似于UNIX的操作系統(tǒng)中,可以使用:$out=ls-la;echo'<pre>'.$out.'</pre>';在Windows服務(wù)器上,可以使用:$out=dirc:;echo'<pre>'.$out.'</pre>';這兩種版本都會(huì)得到一個(gè)目錄列表并且將該列表保存在$out中,然后,再將該列表顯示在瀏覽器中或用其他方法來(lái)處理。此外,還有其他方法可以執(zhí)行服務(wù)器端的命令。我們將在第19章中詳細(xì)介紹。4.數(shù)組操作符PHP提供了一些數(shù)組操作符。數(shù)組元素操作符([])允許訪問(wèn)數(shù)組元素。在某些數(shù)組上下文中,也可以使用=>操作符。這些操作將在第3章詳細(xì)介紹。也可以使用許多其他數(shù)組操作符。我們會(huì)在第3章詳細(xì)介紹它們,但是這里在表1-6中給出完整列表。你將注意到,表1-6給出的數(shù)組操作符都有作用在標(biāo)量變量上的等價(jià)操作符。只要你記得+執(zhí)行了標(biāo)量類(lèi)型的加操作和數(shù)組的聯(lián)合操作——即使你對(duì)其行為后面使用的實(shí)現(xiàn)算法不感興趣——該行為也是有意義的。你不能將標(biāo)量類(lèi)型與數(shù)組進(jìn)行比較。5.類(lèi)型操作符只有一個(gè)類(lèi)型操作符:instanceof。這個(gè)操作在面向?qū)ο缶幊讨惺褂茫浅鲇谕暾苑矫娴目紤],我們?cè)谶@里也給出它(面向?qū)ο缶幊虒⒃诘?章詳細(xì)介紹)。instanceof操作符允許檢查一個(gè)對(duì)象是否是特定類(lèi)的實(shí)例,如下例所示:classsampleClass{};$myObject=newsampleClass();if($myObjectinstanceofsampleClass)echo"myObjectisaninstanceofsampleClass";1.11計(jì)算表單總金額現(xiàn)在,你已經(jīng)了解了如何使用PHP的操作符,下面就可以開(kāi)始計(jì)算Bob訂單表單的總金額和稅金。要完成這些任務(wù),可以將如下所示的代碼添加到PHP腳本中:$totalqty=0;$totalqty=$tireqty+$oilqty+$sparkqty;echo"Itemsordered:".$totalqty."<br/>";$totalamount=0.00;define('TIREPRICE',100);define('OILPRICE',10);define('SPARKPRICE',4);$totalamount=$tireqty*TIREPRICE+$oilqty*OILPRICE+$sparkqty*SPARKPRICE;echo"Subtotal:$".number_format($totalamount,2)."<br/>";$taxrate=0.10;//localsalestaxis10%$totalamount=$totalamount*(1+$taxrate);echo"Totalincludingtax:$".number_format($totalamount,2)."<br/>";如果在瀏覽器窗口中刷新這個(gè)頁(yè)面,將看到如圖1-5所示的輸出結(jié)果。圖1-5顯示了經(jīng)過(guò)計(jì)算再格式化后的顧客訂單總金額可以看到,我們?cè)谶@段代碼中使用了一些操作符。我們使用了加號(hào)(+)和乘號(hào)(*)來(lái)計(jì)算總量,還使用了字符串連接操作符(.)來(lái)格式化到瀏覽器的輸出。我們還使用了number_format()函數(shù)來(lái)格式化總金額的輸出格式,將總金額的輸出控制成帶有兩位小數(shù)的字符串。這個(gè)函數(shù)來(lái)自PHP的Math庫(kù)。如果要進(jìn)一步了解計(jì)算過(guò)程,讀者可能會(huì)問(wèn)為什么計(jì)算會(huì)按著正確的算術(shù)順序完成。例如,請(qǐng)看如下代碼:$totalamount=$tireqty*TIREPRICE+$oilqty*OILPRICE+$sparkqty*SPARKPRICE;總金額看上去是正確的,但是為什么乘號(hào)會(huì)在加號(hào)之前完成呢?答案就在于操作符的優(yōu)先級(jí),即操作符的執(zhí)行順序。1.12理解操作符的優(yōu)先級(jí)和結(jié)合性一般地說(shuō),操作符具有一組優(yōu)先級(jí),也就是執(zhí)行它們的順序。操作符還具有結(jié)合性,也就是同一優(yōu)先級(jí)的操作符的執(zhí)行順序。這種順序通常有從左到右(簡(jiǎn)稱(chēng)左)、從右到左(簡(jiǎn)稱(chēng)右)或者不相關(guān)。表1-7給出了PHP操作符的優(yōu)先級(jí)和結(jié)合性。在這個(gè)表中,最上面的操作符優(yōu)先級(jí)最低,按著表的由上而下的順序,優(yōu)先級(jí)遞增。請(qǐng)注意,我們還沒(méi)有包括優(yōu)先級(jí)最高的操作符:普通的圓括號(hào)。它的作用就是提高圓括號(hào)內(nèi)部操作符的優(yōu)先級(jí)。這樣,在需要的時(shí)候,就可以避開(kāi)操作符的優(yōu)先級(jí)法則。請(qǐng)記住這一部分的一個(gè)例子:$totalamount=$totalamount*(1+$taxrate);如果寫(xiě)成:$totalamount=$totalamount*1+$taxrate;乘號(hào)就具有比加號(hào)更高的優(yōu)先級(jí),從而優(yōu)先進(jìn)行計(jì)算,這樣就會(huì)得到一個(gè)錯(cuò)誤的結(jié)果。通過(guò)使用圓括號(hào),可以強(qiáng)制先計(jì)算1+$taxrate子表達(dá)式。可以在一個(gè)表達(dá)式中使用任意個(gè)圓括號(hào),最里層圓括號(hào)的表達(dá)式將最先計(jì)算。在上表中,另一個(gè)需要注意的但沒(méi)有介紹的操作符是print語(yǔ)言結(jié)構(gòu),它等價(jià)于echo語(yǔ)句。這兩個(gè)結(jié)構(gòu)都將生成輸出。通常,在本書(shū)中,我們會(huì)使用echo,但是如果你認(rèn)為print更容易閱讀,也可以使用print語(yǔ)句。print和echo都不是真正的函數(shù),但是都可以用帶有參數(shù)的函數(shù)形式進(jìn)行調(diào)用。二者都可以當(dāng)作一個(gè)操作符:只要將要顯示的字符串放置在echo或print關(guān)鍵字之后。以函數(shù)形式調(diào)用print將使其返回一個(gè)值(1)。如果希望在一個(gè)更復(fù)雜的表達(dá)式中生成輸出,這個(gè)功能可能是有用的,但是print要比echo的速度慢。1.13使用可變函數(shù)在我們結(jié)束對(duì)變量和操作符的介紹之前,還要了解一下PHP的可變函數(shù)。PHP有一個(gè)函數(shù)庫(kù),這個(gè)函數(shù)庫(kù)允許我們使用不同的方法來(lái)操作和測(cè)試變量。1.13.1測(cè)試和設(shè)置變量類(lèi)型大部分的可變函數(shù)都是用來(lái)測(cè)試一個(gè)函數(shù)的類(lèi)型的。PHP中有兩個(gè)最常見(jiàn)的函數(shù),分別是gettype()和settype()。這兩個(gè)函數(shù)具有如下所示的函數(shù)原型,通過(guò)它們可以獲得要傳遞的參數(shù)和返回的結(jié)果:stringgettype(mixedvar);boolsettype(mixedvar,stringtype);要使用gettype()函數(shù),必須先給它傳遞一個(gè)變量。它將確定變量的類(lèi)型并且返回一個(gè)包含類(lèi)型名稱(chēng)的字符串:bool、int、double(對(duì)于浮點(diǎn)型)、string、array、object和resource。如果變量類(lèi)型不是標(biāo)準(zhǔn)類(lèi)型之一,該函數(shù)就會(huì)返回“unknowntype(未知類(lèi)型)”。要使用settype()函數(shù),必須先給它傳遞一個(gè)要被改變類(lèi)型的變量,以及一個(gè)包含了上述類(lèi)型列表中某個(gè)類(lèi)型的字符串。提示本書(shū)和文檔都提到了“混合”數(shù)據(jù)類(lèi)型。PHP并沒(méi)有這個(gè)類(lèi)型。但是,由于PHP在類(lèi)型處理方面非常靈活,因此許多函數(shù)可以用許多(或者任意)的數(shù)據(jù)類(lèi)型作為參數(shù)。這些類(lèi)型所允許的參數(shù)通常都是偽“混合”類(lèi)型。我們可以按如下所示的方式使用這些函數(shù):$a=56;echogettype($a).'<br/>';settype($a,'double');echogettype($a).'<br/>';當(dāng)?shù)谝淮握{(diào)用gettype()函數(shù)時(shí),$a的類(lèi)型是整數(shù)。在調(diào)用了settype()后,它就變成了雙精度類(lèi)型。PHP還提供了一些特定類(lèi)型
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)停車(chē)?yán)U費(fèi)方案(3篇)
- 信息技術(shù)對(duì)社會(huì)審計(jì)機(jī)構(gòu)管理優(yōu)化的推動(dòng)作用
- 2025年農(nóng)業(yè)灌溉用水效率提升與節(jié)水型社會(huì)建設(shè)報(bào)告
- 斷路器關(guān)鍵部件項(xiàng)目投資風(fēng)險(xiǎn)評(píng)估報(bào)告
- 2025至2030充電寶行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 如何在初中數(shù)學(xué)教學(xué)中落實(shí)核心素養(yǎng)
- 大學(xué)生心理健康標(biāo)準(zhǔn)論文1000字
- 高三數(shù)學(xué)教學(xué)心得體會(huì)
- 淺談內(nèi)部控制與風(fēng)險(xiǎn)管理的關(guān)系
- 初中語(yǔ)文 教育論文
- 九師聯(lián)盟2024-2025學(xué)年高二下學(xué)期6月摸底聯(lián)考語(yǔ)文試題(含答案)
- 非遺文化掐絲琺瑯景泰藍(lán)
- 電動(dòng)葫蘆考試題及答案
- 2025廣東省勞動(dòng)合同樣本
- 2025餐飲兼職合同樣本
- 2025年甘肅電投集團(tuán)公司招聘筆試參考題庫(kù)含答案解析
- 國(guó)家開(kāi)放大學(xué)《Web開(kāi)發(fā)基礎(chǔ)》形考任務(wù)實(shí)驗(yàn)1-5參考答案
- 中外美術(shù)評(píng)析與欣賞智慧樹(shù)知到期末考試答案章節(jié)答案2024年湖南大學(xué)
- 固體火箭發(fā)動(dòng)機(jī)制造工藝
- 脈沖震蕩檢測(cè)原理及意義
- 預(yù)應(yīng)力錨索專(zhuān)項(xiàng)施工方案
評(píng)論
0/150
提交評(píng)論