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