|
一、PHP概述 PHP(“PHP: Hypertext Preprocessor”,超文本預(yù)處理器的字母縮寫)是一種被廣泛應(yīng)用的開放源代碼的多用途腳本語言,它可嵌入到 HTML中,尤其適合 web 開發(fā)。和客戶端的 JavaScript 不同的是,PHP 代碼是運(yùn)行在服務(wù)端的。 使用 PHP 的一大好處是它對于初學(xué)者來說極其簡單,同時也給專業(yè)的程序員提供了各種高級的特性。PHP 主要是用于服務(wù)端的腳本程序,因此可以用 PHP 來完成任何其它的 CGI 程序能夠完成的工作,例如收集表單數(shù)據(jù),生成動態(tài)網(wǎng)頁,或者發(fā)送,接收 Cookies。但 PHP 的功能遠(yuǎn)不局限于此。 PHP 腳本主要用于以下三個領(lǐng)域: 1, 服務(wù)端腳本。這是 PHP 最傳統(tǒng),也是最主要的目標(biāo)領(lǐng)域。開展這項(xiàng)工作需要具備以下三點(diǎn):PHP 解析器(CGI 或者服務(wù)器模塊)、web 服務(wù)器和 web 瀏覽器。需要在運(yùn)行 web 服務(wù)器時,安裝并配置 PHP,然后,可以用 web 瀏覽器來訪問 PHP 程序的輸出,即瀏覽服務(wù)端的 PHP 頁面。如果只是實(shí)驗(yàn) PHP 編程,所有的這些都可以運(yùn)行在自己家里的電腦中。請查閱安裝一章以獲取更多信息。 2, 命令行腳本??梢跃帉懸欢?PHP 腳本,并且不需要任何服務(wù)器或者瀏覽器來運(yùn)行它。通過這種方式,僅僅只需要 PHP 解析器來執(zhí)行。這種用法對于依賴 cron(Unix 或者 Linux 環(huán)境)或者 Task Scheduler(Windows 環(huán)境)的日常運(yùn)行的腳本來說是理想的選擇。這些腳本也可以用來處理簡單的文本。請參閱 PHP 的命令行模式以獲取更多信息。 3, 編寫桌面應(yīng)用程序。對于有著圖形界面的桌面應(yīng)用程序來說,PHP 或許不是一種最好的語言,但是如果用戶非常精通 PHP,并且希望在客戶端應(yīng)用程序中使用 PHP 的一些高級特性,可以利用 PHP-GTK 來編寫這些程序。用這種方法,還可以編寫跨平臺的應(yīng)用程序。PHP-GTK 是 PHP 的一個擴(kuò)展,在通常發(fā)布的 PHP 包中并不包含它。如果對 PHP-GTK 感興趣,請?jiān)L問其? 網(wǎng)站以獲取更多信息。 PHP 能夠用在所有的主流操作系統(tǒng)上,已經(jīng)支持了大多數(shù)的 web 服務(wù)器,使用 PHP,可以自由地選擇操作系統(tǒng)和 web 服務(wù)器。同時,還可以在開發(fā)時選擇使用面對過程和面對對象,或者兩者混和的方式來開發(fā)。盡管 PHP 4 不支持 OOP 所有的標(biāo)準(zhǔn),但很多代碼倉庫和大型的應(yīng)用程序(包括 PEAR 庫)僅使用 OOP 代碼來開發(fā)。PHP 5 彌補(bǔ)了 PHP 4 的這一弱點(diǎn),引入了完全的對象模型。 使用 PHP,并不局限于輸出 HTML。PHP 還能被用來動態(tài)輸出圖像、PDF 文件甚至 Flash 動畫(使用 libswf 和 Ming)。還能夠非常簡便的輸出文本,例如 XHTML 以及任何其它形式的 XML 文件。PHP 能夠自動生成這些文件,在服務(wù)端開辟出一塊動態(tài)內(nèi)容的緩存,可以直接把它們打印出來,或者將它們存儲到文件系統(tǒng)中。 PHP 最強(qiáng)大最顯著的特性之一,是它支持很大范圍的數(shù)據(jù)庫。同時還有一個叫做 PDO 的數(shù)據(jù)庫抽象擴(kuò)展庫使得可以自由地使用該擴(kuò)展庫支持的任何數(shù)據(jù)庫。另外,PHP還支持 ODBC,即 Open Database Connection Standard(開放數(shù)據(jù)庫連接標(biāo)準(zhǔn)),因此可以連接任何其它支持該世界標(biāo)準(zhǔn)的數(shù)據(jù)庫。 PHP 還支持利用諸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 環(huán)境)等不計(jì)其數(shù)的協(xié)議的服務(wù)。還可以開放原始網(wǎng)絡(luò)端口,使得任何其它的協(xié)議能夠協(xié)同工作。PHP 支持和所有 web 開發(fā)語言之間的 WDDX 復(fù)雜數(shù)據(jù)交換。關(guān)于相互連接,PHP 已經(jīng)支持了對 Java 對象的即時連接,并且可以將他們自由的用作 PHP 對象。甚至可以用我們的 CORBA 擴(kuò)展庫來訪問遠(yuǎn)程對象。 PHP 具有極其有效的文本處理特性,支持從 POSIX 擴(kuò)展或者 Perl 正則表達(dá)式到 XML 文檔解析。為了解析和訪問 XML 文檔,PHP 4 支持 SAX 和 DOM 標(biāo)準(zhǔn),也可以使用 XSLT 擴(kuò)展庫來轉(zhuǎn)換 XML 文檔。PHP 5 基于強(qiáng)健的 libxm2 標(biāo)準(zhǔn)化了所有的 XML 擴(kuò)展,并添加了 SimpleXML 和 XMLReader 支持,擴(kuò)展了其在 XML 方面的功能。 另外,還有很多其它有趣的擴(kuò)展庫。例如 mnoGoSearch 搜索引擎函數(shù)、IRC 網(wǎng)關(guān)函數(shù)、多種壓縮工具(gzip、bz2、zip)、日歷轉(zhuǎn)換、翻譯…… 如果需要自己配置服務(wù)器和 PHP,有兩個方法將 PHP 連接到服務(wù)器上。對于很多服務(wù)器,PHP 均有一個直接的模塊接口(也叫做 SAPI)。這些服務(wù)器包括 Apache、Microsoft Internet Information Server、Netscape 和 iPlanet 等服務(wù)器。其它很多服務(wù)器支持 ISAPI,即微軟的模塊接口(OmniHTTPd 就是個例子)。如果 PHP 不能作為模塊支持 web 服務(wù)器,總是可以將其作為 CGI 或 FastCGI 處理器來使用。這意味著可以使用 PHP 的 CGI 可執(zhí)行程序來處理所有服務(wù)器上的 PHP 文件請求。 對于PHP的安裝和配置需要說明的是,不同版本的PHP和服務(wù)器、數(shù)據(jù)庫組件之間的裝配方法并不統(tǒng)一,需要根據(jù)不同版本安裝,有關(guān)各模塊最新版本之間的搭配組合安裝參見 一般PHP在不同環(huán)境下的安裝配置 配置文件(PHP 3 中是 php3.ini,自 PHP 4 起是 php.ini)在 PHP 啟動時被讀取。對于服務(wù)器模塊版本的 PHP,僅在 web 服務(wù)器啟動時讀取一次。對于 CGI 和 CLI 版本,每次調(diào)用都會讀取。 更多關(guān)于PHP配置文件的說明請參閱手冊或網(wǎng)絡(luò) 二、PHP基礎(chǔ) 2.1基本語法 開始和結(jié)束標(biāo)記:共有4種不同的界定形式,其中兩種,<?php ?> 和 <script language="php"> </script> 總是可用的,另兩種是短標(biāo)記<? ?>和 ASP風(fēng)格標(biāo)記<% %>,可以在 php.ini 配置文件中打開或關(guān)閉。為了代碼的移植及發(fā)行,確保不要使用短標(biāo)記。和asp標(biāo)記。 指令分隔符:PHP 需要在每個語句后用分號;結(jié)束指令,在一個 PHP 代碼段中的最后一行可以不用分號結(jié)束。 注釋: 單行#或// 多行/* */ 數(shù)據(jù)類型:PHP 支持8種基本的數(shù)據(jù)類型。 四種標(biāo)量類型: boolean (布爾型) integer (整型) float (符點(diǎn)型, 也稱作 double) string (字符串) 兩種復(fù)合類型: array (組) object (對象) 兩種特殊類型: resource (資源) NULL (NULL) 為了確保代碼的易讀性,手冊還介紹了一些偽類型,mixed:說明一個參數(shù)可以接受多種不同的(但并不必須是所有的)類型。 Number:說明一個參數(shù)可以是 integer 或者 float。 Callback:有些諸如 call_user_function() 或 usort() 的函數(shù)接受用戶自定義的函數(shù)作為一個參數(shù)。Callback 函數(shù)不僅可以是一個簡單的函數(shù),它還可以是一個對象的方法,包括靜態(tài)類的方法。 PHP 在變量定義中不需要(或不支持)明確的類型定義;變量類型是根據(jù)使用該變量的上下文所決定的。關(guān)于類型之間的轉(zhuǎn)換規(guī)則及注意事項(xiàng)參閱PHP手冊,對于數(shù)組類型下面會詳細(xì)講到。 變量:PHP 中的變量用一個美元符號后面跟變量名來表示。變量名是區(qū)分大小寫的。一個有效的變量名由字母或者下劃線開頭,后面跟上任意數(shù)量的字母,數(shù)字,或者下劃線。按照正常的正則表達(dá)式,它將被表述為:'[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*'。變量默認(rèn)總是傳值賦值。 然在 PHP 中并不需要初始化變量,但對變量進(jìn)行初始化是個 雖好習(xí)慣。未初始化的變量具有其類型的默認(rèn)值。依賴未初始化變量的默認(rèn)值在某些情況下會有問題,例如把一個文件包含到另一個之中時碰上相同的變量名。 使用未初始化的變量會發(fā)出E_NOTICE錯誤,但是在向一個未初始化的數(shù)組附加單元時不會。isset() 語言結(jié)構(gòu)可以用來檢測一個變量是否已被初始化。 PHP 將會自動將變量名中的點(diǎn)替換成下劃線。PHP 包括幾個函數(shù)可以判斷變量的類型,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。 關(guān)于PHP系統(tǒng)的預(yù)定義變量等更多變量內(nèi)容參見PHP手冊 常量: 定義常量define()函數(shù)通過給一個變量名賦值來定義一個常量,其形式如下: boolean define(string name, mixed value[,bool case_insensitive]),如果使用可選參數(shù)case insensitive,并且這個參數(shù)值為下RUE,那么后面對此常量的引用將不區(qū)分大小寫。常量的范圍是全局的。 魔術(shù)常量:有七個魔術(shù)常量它們的值隨著它們在代碼中的位置改變而改變。這些特殊的常量不區(qū)分大小寫 __LINE__ 文件中的當(dāng)前行號。 文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路__FILE__ 徑(如果是符號連接,則是解析后的絕對路徑),而在此之前的版本有時會包含一個相對路徑。 文件所在的目錄。如果用在被包括文件中,則返回被包括的文件__DIR__ 所在的目錄。它等價于 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。(PHP 5.3.0中新增) = 函數(shù)名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數(shù)__FUNCTION__ 被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被__CLASS__ 定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)__METHOD__ 分大小寫)。 當(dāng)前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義__NAMESPACE__ 的(PHP 5.3.0 新增) 關(guān)于系統(tǒng)的預(yù)定義常量參見PHP手冊 表達(dá)式&運(yùn)算符:最精確的定義一個表達(dá)式的方式就是“任何有值的東西”。 運(yùn)算符是可以通過給出的一或多個值(用編程行話來說,表達(dá)式)來產(chǎn)生另一個值(因而整個結(jié)構(gòu)成為一個表達(dá)式)的東西。有三種類型的運(yùn)算符。第一種是一元運(yùn)算符,只運(yùn)算一個值,例如 !(取反運(yùn)算符)或 ++(加一運(yùn)算符)。第二種是有限二元運(yùn)算符,PHP 支持的大多數(shù)運(yùn)算符都是這種。第三種是三元運(yùn)算符:?:。它應(yīng)該被用來根據(jù)一個表達(dá)式在另兩個表達(dá)式中選擇一個,而不是用來在兩個語句或者程序路線中選擇。把整個三元表達(dá)式放在擴(kuò)號里是個很好的主意。 有關(guān)具體運(yùn)算符和其優(yōu)先級參見PHP手冊 控制結(jié)構(gòu):基本的控制結(jié)構(gòu)同c語言,其他像foreach等將在后面具體說明 函數(shù):function functionName(parameters) { function一body } 函數(shù)名是大小寫無關(guān)的,不過在調(diào)用函數(shù)的時候,通常使用其在定義時相同的形式。一般函數(shù)必須在其調(diào)用之前定義。 通過引用傳遞參數(shù)以及默認(rèn)參數(shù)。也PHP 支持按值傳遞參數(shù)(默認(rèn)),支持可變數(shù)量的參數(shù)。 返回語句會return()立即中止函數(shù)的運(yùn)行,并且將控制權(quán)交回調(diào)用該函數(shù)的代碼行。 函數(shù)不能返回多個值,但可以通過返回一個數(shù)組來得到類似的效果。從函數(shù)返回一個引用,必須在函數(shù)聲明和指派返回值給一個變量時都使用引用操作符 & PHP 支持可變函數(shù)的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它??勺兒瘮?shù)可以用來實(shí)現(xiàn)包括回調(diào)函數(shù),函數(shù)表在內(nèi)的一些用途。 關(guān)于系統(tǒng)函數(shù)API參見PHP手冊。 三、面向?qū)ο笏枷?/p> 面向?qū)ο缶幊?Object Oriented Programming,OOP,面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)。OOP 的一條基本原則是計(jì)算機(jī)程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成。為了實(shí)現(xiàn)整體運(yùn)算,每個對象都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息。 簡而言之,面向?qū)ο罂梢杂孟旅婀礁爬? OO=Objects+Classes+Inheritance+Communication With messagees 面向?qū)ο蟪绦蛟O(shè)計(jì),首先學(xué)會面向?qū)ο蟮乃季S解題方法,各種面向?qū)ο蟮恼Z言無非是實(shí)現(xiàn)面向?qū)ο蠼忸}方法的工具。 面向?qū)ο蟮膬?yōu)點(diǎn)是,接近人類的思維習(xí)慣、穩(wěn)定性好、可重用性和可維護(hù)性好。對象內(nèi)部的數(shù)據(jù)只能通過對象的公有方法來訪問或處理,對象是具有相同狀態(tài)的一組操作的集合。形式化定義為: 對象,{標(biāo)識或名字,操作集合,數(shù)據(jù)結(jié)構(gòu),受理的消息 名集合} 幾個基本概念: OOP的封裝:通過眾所周知的接口將用戶與實(shí)際應(yīng)用程序的內(nèi)部工作原理分離,使用一個對象(組件)的時候,只需知道他向外界提供的接口形式,無需知道他的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和實(shí)現(xiàn)操作的算法。 繼承:特殊類的對象擁有其一般類的全部屬性與方法。 多態(tài):子類對象可以和父類的對象使用相同名字的方法,而不同子類對象對方法的具體實(shí)現(xiàn)由本身決定。 重載:分 函數(shù)和運(yùn)算符重載,即根據(jù)不同的數(shù)據(jù)類型或參數(shù)個數(shù)實(shí)現(xiàn)不同的操作。 面向?qū)ο蠓治鲞^程: OOM:為了理解事物而對事物作出的一種抽象,是對事物的一種無歧義的書面描述。通常,模型由一組圖示符號和組織這些符號的規(guī)則組成。 用面向?qū)ο蠓椒ㄩ_發(fā)軟件,需要建立三種形式的模型: 1, 對象模型(Object Model):描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu),是最重要、最基本、最核心的 2, 動態(tài)模型(Dynamic Model):描述系統(tǒng)控制結(jié)構(gòu) , 功能模型(Function Model):描述系統(tǒng)功能 對象模型:表示靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)的“數(shù)據(jù)”性質(zhì)。模擬客觀世界實(shí)體的對象以及對象彼此間的關(guān)系的映射,描述了系統(tǒng) 的靜態(tài)結(jié)構(gòu)的“數(shù)據(jù)”性質(zhì)。 建立對象模型的表示方法,包括下列符號: 表示類的符號(應(yīng)該即能表示屬性又能表示服務(wù)); 表示對象(類實(shí)例)的符號; 表示繼承關(guān)系的符號; 表示類或?qū)ο箝g其它關(guān)系的符號; 類-&-對象的圖形符號: 類名 類名 屬性 屬性 服務(wù) 服務(wù) 類-&-對象的符號 類的符號 類符號是代表一個沒有實(shí)例的抽象類; 類,&,對象符合外的虛框代表屬于該類的對象; 表示結(jié)構(gòu)的圖形符號: 1.歸納關(guān)系(Conclusion relationship) 2.組合關(guān)系(Combination relationship) 1, 關(guān)聯(lián)關(guān)系 兩個對象間的二元關(guān)聯(lián)分為(1:1)、(1:M1)、(M:N); 盡量避免使用多元關(guān)聯(lián)。 (3)鏈屬性:關(guān)聯(lián)鏈的性質(zhì) (4)限定:特殊的鏈屬性 (5)消息連接:一個對象對另一個對象的依賴性   OOA: 就是抽取和整理用戶需求并建立問題域精確模型的過程。分析工作包括理解(Comprehension)、表達(dá)(Expression)和驗(yàn)證(Verification)三項(xiàng)內(nèi)容。 建立的模型應(yīng)包括 對象模型(靜態(tài)結(jié)構(gòu),Static Structure) 動態(tài)模型(交互次序,Interaction Sequence) 功能模型(數(shù)據(jù)變換,Data Transformation) 大型系統(tǒng)的對象模型由五個層次組成 主題層(范疇層)(Subject Layer) 類-&-對象層 (Class-&-Object Layer) 結(jié)構(gòu)層 (Structure Layer) 屬性層 (Attribute Layer) 服務(wù)層 (Service Layer) 面向?qū)ο蠓治龉ぷ鞔篌w上按下列順序進(jìn)行: 、尋找類&對象 1 1.找出候選的類-&-對象:一般按語法分析,尋找主語名詞或名詞短語 2.篩選出正確的類-&-對象:篩選標(biāo)準(zhǔn):1、冗余2、無關(guān)、3、籠統(tǒng)4、屬性5、 操作6、實(shí)現(xiàn) 2、識別結(jié)構(gòu)(確定關(guān)聯(lián)) 3、定義屬性:既對象所具有的性質(zhì),一般是賓語名詞 4、識別繼承關(guān)系:確定了類中屬性之后,利用繼承機(jī)制共享的公共性質(zhì),對系統(tǒng)中的類加以組織。一般有兩種方法建立繼承關(guān)系: (1)自底向上:抽象出現(xiàn)有類的共同性質(zhì)泛化出父類 (2)自頂向下:把現(xiàn)有類細(xì)化成更具體的子類 5、定義方法 在確定類中應(yīng)該有的的方法時,既要考慮該類實(shí)體的常規(guī)行為,又要考慮完成本系統(tǒng)功能所需要提供的服務(wù)。把籠統(tǒng)的功能細(xì)化為具體的功能,再把所有該完成 的功能分配給適當(dāng)?shù)膶ο笕コ袚?dān)。 OOD:從分析到設(shè)計(jì)是一個逐漸擴(kuò)充模型反復(fù)迭代 的過程,或者說,面向?qū)ο笤O(shè)計(jì)是用面向?qū)ο笥^點(diǎn)建立求解域模型的過程一個實(shí)用的軟件系統(tǒng)在邏輯上由下述四部分組成, 問題域子系統(tǒng) (Problem Domain Sub-system) , 人機(jī)交互子系統(tǒng) (Human-Machine Interaction Sub-system), 任務(wù)管理子系統(tǒng) (Task Management Sub-system) , 數(shù)據(jù)管理子系統(tǒng) (Data Management Sub-system 盡管分析和設(shè)計(jì)是有區(qū)別的,但實(shí)際開發(fā)中二者界限模糊 面向?qū)ο笤O(shè)計(jì)準(zhǔn)則: 1、 模塊化2、抽象3、信息隱藏 4、弱耦合:對象之間的耦合一般分1、交互耦合2繼承耦合 應(yīng)該使前者盡量松散而提高繼承耦合程度 5、強(qiáng)內(nèi)聚6、可重用 OOP:即把面向?qū)ο笤O(shè)計(jì)的的結(jié)果翻譯成用某種面向?qū)ο蟪绦蛘Z言書寫的程序 OOT: 四、面向?qū)ο蟮腜HP 4、1基礎(chǔ) PHP中一般類的創(chuàng)建語法 Class name{ #數(shù)據(jù)成員var $name #方法聲明scope function functionName() { //Function body goes here } } 對象使用new關(guān)鍵字創(chuàng)建,如下 $employee=new Employee() 創(chuàng)建對象之后,這個剛實(shí)例化的對象就具有了類中定義的所有性質(zhì)和行為。 作用域:PHP支持5種字段作用域: public,:任何地方,默認(rèn)為該項(xiàng) private,:本類內(nèi)部 protected,:本類及繼承類;如果希望擴(kuò)展類,就應(yīng)當(dāng)使用保護(hù)字段而不是私有字段。 final:子類將無法重寫final定義的屬性或方法,final類:阻止該類被繼承static : 但在類中一般不使用Public定義屬性,那樣違背了封裝性的原則,而是采取{通過一些稱為公共方法(public method)的接口來訪問。類似下面: class Employee { private $name; public function setName($name){ $this->name=$name; } } 類常量:用const使用字段或方法 $object->field $object->method_ name(); 在本類中引用使用$this,$this表示要引用當(dāng)前類(要訪問或操作的字段所在的類)中的字段。不能在類中使用$this來引用聲明為static的字段動態(tài)創(chuàng)建新的變量來擴(kuò)展類:即當(dāng)對象試圖訪問類中不存在的成員時,會自動觸發(fā)。 1、 設(shè)置屬性 bool __set([string property name],[mixed value to assign]) 它接受一個屬性名和相應(yīng)的值作為輸入,如果方法成功執(zhí)行就返回TRUE,否則返回false.例如:class{ Employee var $name function { _set($propName, $propValue) $this->$propName=$propValue; } } $employee = new Employee(); $employee->name = "Mario"; $employee->title=”Executive Chef"; echo "Name: ".$employee->name; echo "<br/>”; echo "Title:”.$employee->title; 輸出:Name: Mario Title: Executive Chef 2.獲取屬性 boolean _get((string property name]) 它接受一個屬性名作為輸入?yún)?shù),即要獲取該屬性的值。它在成功執(zhí)行時返回TRUE,否則返回FALSE。 例:class Employee { ar $name; v var $city; protected $wage; function __get($propName) { echo "__get called!<br/>"; $vars=array("name","city"); if (in_array($propName, $vars)) { return $this一>$propName; }else{ return "No such variable!"; } } } $employee=new Employee(); $employee ->name='Mario'; echo $employee->name.'<br />'; echo $employee->age; ?> 輸出:Mario __get called! No such variable! 注意到:當(dāng)要訪問的變量確實(shí)是類的屬性的時候,set方法和get方法不會被調(diào)用。函數(shù)的作用域除了字段作用域外,多一個abstract. 抽象(abstract)方法很特殊,只在父類中聲明,但在子類中實(shí)現(xiàn)。只有聲明為abstract的類可以聲明抽象方法。如果想定義一個應(yīng)用編程接口(API ),以后作為實(shí)現(xiàn)的一個模型,就可以聲明一個抽象方法。開發(fā)人員會知道,如果能滿足抽象方法定義的所有需求,那么他為該方法開發(fā)的特定實(shí)現(xiàn)應(yīng)該能正常工作。抽象方法如下聲明: abstract function methodName(); 繼承:一個擴(kuò)充類總是依賴一個單獨(dú)的基類,也就是說,不支持多繼承。使用關(guān)鍵字“extends”來擴(kuò)展一個類。 作用域識別操作符:用于在沒有聲明任何實(shí)例的情況下訪問類中的函數(shù)或者基類中的函數(shù)和變量,用::實(shí)現(xiàn) 與其常見的用法:parent::基類成員或方法 基類名::基類成員或方法 Self::變量名或方法(子類中引用本身成員或方法) 靜態(tài)類成員:有時,可能有必要創(chuàng)建供所有類實(shí)例共享的字段和方法,這些字段和方法與所有的類實(shí)例有關(guān),靜態(tài)字段和方法應(yīng)使用self關(guān)鍵字和類名來引用,而不是通過this和箭頭操作符。 Instanceof關(guān)鍵字: PHP 5的另一個新成員是ins七anceof關(guān)鍵字。使用這個關(guān)鍵字可以確定一個對象是類的實(shí)例、類的子類,還是實(shí)現(xiàn)了某個特定接口,并進(jìn)行相應(yīng)的操作。例如,假設(shè)希望了解名為manager的對象是否為類Employee的實(shí)例: $manager=new Employee(); if ($manager instanceof Employee) echo "Yes"; 有兩點(diǎn)值得注意。首先,類名沒有任何定界符(引號)。使用定界符將導(dǎo)致語法錯誤。其次,如果比較失敗,腳本將退出執(zhí)行。instanceof關(guān)鍵字在同時處理多個對象時特別有用。例如,你可能要重復(fù)地調(diào)用某個函數(shù),但希望根據(jù)對象類型調(diào)整函數(shù)的行為??梢允褂胏ase語句和instanceof關(guān)鍵字來實(shí)現(xiàn)這個目標(biāo)。 自動加載對象:通過定義特殊的_autoload函數(shù),當(dāng)引用未在腳本中定義的類時會自動調(diào)用這個函數(shù)?;氐綀D書館的例子,通過定義如下函數(shù),就不必再手工包含各個類文件了: function __ autoload($class){ require_ once("classes/$class.class.php"); } 定義這個函數(shù)后,將不再需要那些require once()語句,因?yàn)楫?dāng)?shù)谝淮握{(diào)用一個類時,就會調(diào)用__autoload(),并根據(jù)__autoload()中定義的命令加載類。這個函數(shù)可以放在某個全局應(yīng)用程序配置。 4、2高級OOP特性 PHP不支持的高級特性:運(yùn)算符重載和多重繼承 接口: 接口(interface)定義了實(shí)現(xiàn)某種服務(wù)的一般規(guī)范,聲明了所需的函數(shù)和常量,但不指定如何實(shí)現(xiàn)。之所以不給出實(shí)現(xiàn)的細(xì)節(jié),是因?yàn)椴煌膶?shí)體可能需要用不同的方式來實(shí)現(xiàn)公共的方法定義。關(guān)鍵是要建立必須實(shí)現(xiàn)的一組一般原則,只有滿足了這些原則才能說實(shí)現(xiàn)了這個接口。接口中定義的所有方法都必須是public,這是接口的特性。 接口中不定義類成員!類成員的定義完全交給實(shí)現(xiàn)類來完成。在PHP中,要這樣創(chuàng)建接口: interface InterfaceName { CONST 1; CONST N; function methodNamel(); function methodNameN(); } 接口中的所有方法都必須實(shí)現(xiàn),倘若實(shí)現(xiàn)類沒有實(shí)現(xiàn)所有方法,則必須聲明為抽象類。 可以看到,接口特別有用。因?yàn)?,雖然它們定義了發(fā)生某一行為需要多少個方法,以及各個方法的名字,但接口允許不同的類,以不同的方式來實(shí)現(xiàn)這些方法。 如果要實(shí)現(xiàn)多個接口,可以用逗號來分隔多個接口的名稱。 抽象類:抽象類是不能實(shí)例化的類,只能作為由其他類繼承的基類。用于描述各種公共的共同性質(zhì)。聲明為抽象的類必須在定義前面加上關(guān)鍵字abstract abstract class Class Name { //insert attribute definitions here //insert method definitions here } 任何派生類都必須實(shí)現(xiàn)從該抽象類繼承的所有抽象方法。 什么時候使用接口或抽象類: 1、 如果要創(chuàng)建一個模型,這個模型將由一些緊密相關(guān)的對象采用就可以使用 抽象類。如果要創(chuàng)建將由、些不相關(guān)對象采用的功能,就使用接口。 2、 如果必須從多個來源繼承行為,就使用接口,PHP類可以繼承多個接口, 但不能擴(kuò)展多個抽象類 3、 如果知道所有類都會共享一個公共的行為實(shí)現(xiàn),就使用抽象類、并在其中 實(shí)現(xiàn)該行為。在接口中無法實(shí)現(xiàn)行為 命名空間: 隨著類庫的不斷擴(kuò)展,最后很可能遭遇這樣一種情況:兩個類庫使 用了相同的類名。由于要求每個類有唯一的名,所以不可能在同一個PHP腳本中 使用兩個同名的類。 在你自己的應(yīng)用程序中實(shí)現(xiàn)PHP 6的命名空間特性之前,一定要仔細(xì)研究PHP手冊。 克隆:在將一個類變量賦值給另一個變量時,執(zhí)行的是引用賦值,即引用類的同一實(shí)例,對任何一個變量的值的改變都將導(dǎo)致另一變量的改變??寺∩傻膶?shí)例具有自己獨(dú)立變化的屬性,這樣對克隆對象的修改就不會影響到原對象。 五、字符串函數(shù)和正則表達(dá)式 5、1正則表達(dá)式 在正則表達(dá)式(regular expression)的基礎(chǔ)上,可以根據(jù)預(yù)定義的語法規(guī)則描述或匹配數(shù)據(jù)。正則表達(dá)式本身只是字符串模式,用于匹配某些文本。PHP提供了支持POSIX風(fēng)格和Perl風(fēng)格的兩組正則表達(dá)式實(shí)現(xiàn)的函數(shù)庫。每種正則表達(dá)式都有自己獨(dú)特的語法風(fēng)格。前者更容易掌握,但不是二進(jìn)制安全的,后者則有更快的速度。 正則表達(dá)式中包括的元素 (1)、原子(普通字符:a-z A-Z 0-9 、原子表、 轉(zhuǎn)義字符) (2)、元字符 (有特殊功能的字符) (3)、模式修正符 (系統(tǒng)內(nèi)置部分字符 i 、m、S、U…)模式修正符是為正則表達(dá)式增強(qiáng)和補(bǔ)充的一個功能,使用在正則之外 / 正則 / U 構(gòu)造正則表達(dá)式的方法和創(chuàng)建數(shù)學(xué)表達(dá)式的方法一樣。也就是用多種元字符與操作符將小的表達(dá)式結(jié)合在一起來創(chuàng)建更大的表達(dá)式。正則表達(dá)式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。 PHP的正則表達(dá)式函數(shù)(Perl兼容): PHP為使用Perl兼容的正則表達(dá)式搜索字符串提供了7個函數(shù),包括 preg _grep():函數(shù)搜索數(shù)組中的所有元素,返回由與某個模式匹配的所有元素組成的數(shù)組。 preg_ match():函數(shù)在字符串中搜索模式,如果存在則返回TRUE,否則返回FALSE preg_ match_ all():函數(shù)在字符串中匹配模式的所有出現(xiàn),以便通過可選的輸入?yún)?shù)order所指定的順序,將每次出現(xiàn)放在某個數(shù)組中。 preg_quotet():在每個對于正則表達(dá)式語法而言有特殊含義的字符前插入一個反斜線。 正則表達(dá)式的特殊字符包括:. + * ? [ ^ ] $ ( ) { } = ! < > | : preg_replace(): preg__replace _callback() preg_ split(): 有關(guān)正則表達(dá)式的構(gòu)建參見正則表達(dá)式手冊。 常用的正則表達(dá)式整理 5、2字符串函數(shù) 除了前半部分討論的基于正則表達(dá)式的函數(shù),PHP還提供了100多個函數(shù),能夠處理字符串中我們所能想到的每一個方面。一般而言,對于同樣的功能 ,正則表達(dá)式的函數(shù)效率要低于字符串函數(shù),如果程序足夠簡單,應(yīng)選擇字符串函數(shù),但是,對于可以通過單個正則表達(dá)式執(zhí)行的任務(wù)來說,如果使用多個字符串函數(shù)是不對的。 詳細(xì)的函數(shù)使用規(guī)則參見PHP手冊 六、PHP專題相關(guān) 6、1數(shù)組 PHP 中的 數(shù)組 實(shí)際上是一個有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。用 array() 語言結(jié)構(gòu)來新建一個 array。它接受任意數(shù)量用逗號分隔的 鍵(key) => 值(value) 對。key 可以是 integer 或者 string型,values的值任意。如果對給出的值沒有指定鍵名,則取當(dāng)前最大的整數(shù)索引值,而新的鍵名將是該值加一。如果指定的鍵名已經(jīng)有了值,則該值會被覆蓋。 通過在方括號內(nèi)指定鍵名來給數(shù)組賦值:$arr[key] = value;用list()提取數(shù)組 list()函數(shù)與array()類似,只是它可以在一次操作中從一個數(shù)組內(nèi)提取多個值,同時為多個變量賦值。從數(shù)據(jù)庫或文件中提取信息時,這種構(gòu)造尤其有用。使用 list()同時為多個變量賦值:例: //Open the users.txt file fusers=fopen("users.txt", "r" //While the EOF hasn't been reached, get next line while ($line=fgets{fusers, 4096)){ //use explode() to separate each piece of data. list($name, $occupation, $color)=explode("|”,$line); //format and output the data printf("Name: %s <br/>”,$name); printf("Occupation: %s <br/>”,$occupation); printf("Favorite color: %s <br/>”,$color); } fclose($users); list()依靠函數(shù)explode()將每一行分解為三個元素,這些元素分別賦給了$name, $occupation和$color。至此,余下的只是如何格式化以及顯示到瀏覽器。用預(yù)定義的值范圍填充數(shù)組: range()函數(shù)是一個快速創(chuàng)建數(shù)組的簡單方法,并會使用low到high范圍的整數(shù)值填充數(shù)組。這個函數(shù)將返回一個包含此范圍內(nèi)所有整數(shù)的數(shù)組。其形式如下: array range(int low, int high[,int step]) range()函數(shù)還可以用于字符序列。例如,假設(shè)希望創(chuàng)建一個包含字母A到F的數(shù)組: $letters=range("A","F"); //$letters=array("A,”,.”.B”.,”C”,”D”,.”.E”..”F.”.) 打印數(shù)組用于測試:print_r()函數(shù)boolean print _r(mixed'variable[,boolean return])可選參數(shù)return用來修改函數(shù)的行為,使函數(shù)將輸出返回給調(diào)用者,而不是發(fā)送到標(biāo)準(zhǔn)輸出。因此,如果希望返回以上$states數(shù)組的內(nèi)容,只需將return設(shè)置為TRUE: 測試數(shù)組:內(nèi)置函數(shù)is _array()可用于測試某變量是否為數(shù)組格式。 在編程中數(shù)組的作用不可或缺,有很多數(shù)組的操作函數(shù),可以產(chǎn)生強(qiáng)大的功能,參見PHP手冊-數(shù)組函數(shù)。 foreach循環(huán):foreach 僅能用于數(shù)組,當(dāng)試圖將其用于其它數(shù)據(jù)類型或者一個未初始化的變量時會產(chǎn)生錯誤。有兩種語法,第二種比較次要但卻是第一種的有用的擴(kuò)展。 foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement foreach 所操作的是指定數(shù)組的一個拷貝,而不是該數(shù)組本身。 可以很容易地通過在 $value 之前加上 & 來修改數(shù)組的元素。此方法將以引用賦值而不是拷貝一個值。 <?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) ?> foreach 不支持用“@”來抑制錯誤信息的能力。 6、2函數(shù) PHP 支持按值傳遞參數(shù)(默認(rèn)),通過引用傳遞參數(shù)以及默認(rèn)參數(shù)。也支持可變數(shù)量的參數(shù)。 按值傳遞:意味著,函數(shù)范圍內(nèi)對這些值(非靜態(tài))的任何改變在函數(shù)外部都會被忽略。如果希望在函數(shù)范圍外也能反映出這些修改,則可以按引用傳遞參數(shù)。 不要求非得在調(diào)用之前定義函數(shù),因?yàn)镻HP在執(zhí)行前會把整個腳本讀到引擎中。但并不推薦這種隨便的做法。 按引用傳遞參數(shù):可能希望在函數(shù)內(nèi)對參數(shù)的修改在函數(shù)范圍外也能反映,如果想要函數(shù)的一個參數(shù)總是通過引用傳遞,可以在函數(shù)定義中該參數(shù)的前面預(yù)先加上符號 &,(調(diào)用時不必) 默認(rèn)參數(shù)值:可以為輸入?yún)?shù)指寧默認(rèn)值,在沒有提供其他值的情況下,就會把這個默認(rèn)值自動賦給該參數(shù)。默認(rèn)參數(shù)值必須位于參數(shù)列表末尾或?yàn)槌?shù)表達(dá)式,而不能指定函數(shù)調(diào)用或變量等非常量值。可以指定某個參數(shù)為可選(optional)參數(shù),為此,這些參數(shù)需要放在參數(shù)列表末尾,而且要指定其默認(rèn)值為空,如下: function calcSalesTax($price, $tax="") { $total=$price+($price*$tax); echo "Total cost:$total"; } 返回值:return()語句可以向函數(shù)調(diào)用者返回任意確定的值,將程序控制權(quán)返回到調(diào)用者的作用域。return()在全局作用域內(nèi)調(diào)用,將終止腳本的執(zhí)行。 從函數(shù)中返回多個值通常很方便。例如,假設(shè)要創(chuàng)建一個函數(shù),從數(shù)據(jù)庫中獲取用戶數(shù)據(jù),比如用戶的姓名、電子郵件地址和電話號碼,然后返回給調(diào)用者。通常的做法是用數(shù)組做返回值,用list()構(gòu)造承接。 函數(shù)庫:常將函數(shù)組織到函數(shù)庫中,可以在以后類似的應(yīng)用程序中重復(fù)使用。在一個文件中簡單地聚集函數(shù)定義就可以創(chuàng)建PHP庫。保存這個庫,最好使用一個能清楚地說明其用途的命名約定來命名,如taxes.library.php 6、3錯誤和異常處理 配置指令:許多配置指令確定了PHP的錯誤報告行為。本節(jié)將介紹其中一些指令。 error_reporting指令確定報告的敏感級別。共有14個不同的級別,這些級別的任何組合都是有效的。每個級別都包括位于其下面的所有級別。  在PHP6中,E _STRIC被集成到了E ALL中,因此,當(dāng)運(yùn)行PHP 6時,需要將error_ reporting指令設(shè)置為E_ ALL來查看這些可移植性建議。 error_reporting指令使用一字符表示邏輯操作符NOT., 例 error_reporting E_ALL& ~(E_ERROR | E_WARNING | E_NOTICE); 啟用display errors時,將顯示滿足error_ reporting所定義規(guī)則的所有錯誤。應(yīng)當(dāng)只在測試期間啟用此指令,網(wǎng)站投入使用時要將其禁用。顯示這些消息不僅可能會讓終端用戶更迷惑,還可能會過多地泄露有關(guān)應(yīng)用用及務(wù)器的信息。 錯誤日志: 如果要決定在單獨(dú)的文本文件中記錄錯誤日志,那么Web服務(wù)器進(jìn)程所有者必須有足夠的權(quán)限來寫這個文件。此外,要確保這個文件存放在文檔根之外,以減少遭到攻擊的可能性。 異常處理: 對于初學(xué)者來說,異常處理對于標(biāo)識和報告應(yīng)用程序錯誤提供了通用策略,另外,對于指定程序在遇到錯誤時如何進(jìn)行處理也有一般性的策略,通過使用這些策略,異常處理要優(yōu)于錯誤管理過程。此外,異常處理的語法促進(jìn)了將錯誤處理器與一般的應(yīng)用程序邏輯相分離,因而可以得到更有組織、更具可讀性的代碼。大多數(shù)實(shí)現(xiàn)異常處理的語言將此過程抽象為4個步驟: (1)應(yīng)用程序嘗試做一些操作; (2)如果嘗試失敗,則異常處理特性拋出一個異常; (3)指定的處理器捕獲該異常,完成必要的任務(wù); (4)異常處理特性清除在嘗試期間占用的資源。 PHP 5 添加了類似于其它語言的異常處理模塊。在 PHP 代碼中所產(chǎn)生的異常可被 throw 語句拋出并被 catch 語句捕獲。需要進(jìn)行異常處理的代碼都必須放入 try 代碼塊內(nèi),以便捕獲可能存在的異常。每一個 try 至少要有一個與之對應(yīng)的 catch。使用多個 catch 可以捕獲不同的類所產(chǎn)生的異常。當(dāng) try 代碼塊不再拋出異?;蛘哒也坏?catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉(zhuǎn)到最后一個 catch 的后面繼續(xù)執(zhí)行。當(dāng)然,PHP 允許在 catch 代碼塊內(nèi)再次拋出(throw)異常。 當(dāng)一個異常被拋出時,其后(譯者注:指拋出異常時所在的代碼塊)的代碼將不會繼續(xù)執(zhí)行,而 PHP 就會嘗試查找第一個能與之匹配的 catch。如果一個異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應(yīng)的處理的話,那么 PHP 將會產(chǎn)生一個嚴(yán)重的錯誤,并且輸出 Uncaught Exception ... (未捕獲異常)的提示信息。所以,應(yīng)設(shè)置處理未捕獲的異常函數(shù),set_exception_handler()。 用戶可以用自定義的異常處理類來擴(kuò)展 PHP 內(nèi)置的異常處理類。 如果使用自定義的類來擴(kuò)展內(nèi)置異常處理類,并且要重新定義構(gòu)造函數(shù)的話,建議同時調(diào)用 parent::__construct() 來檢查所有的變量是否已被賦值。當(dāng)對象要輸出字符串的時候,可以重載 __toString() 并自定義輸出的樣式。 雖然可以擴(kuò)展異?;?,但不能覆蓋任何一個方法,因?yàn)樗鼈兌悸暶鳛閒inal。 內(nèi)置異常類及異常類的擴(kuò)展參見PHP手冊。 6、4處理文件和操作系統(tǒng) 解析目錄路徑: basemane()函數(shù)返回路徑的文件名部分。 dirname()函數(shù)恰好與basename()相反,它提供路徑的目錄部分,dirname() 的操作從 PHP 5.0.0 版開始是二進(jìn)制安全的。常用dirname(__FILE__),返回當(dāng)前文件的絕對路徑。 pathinfo()函數(shù)創(chuàng)建一個關(guān)聯(lián)數(shù)組,其中包括路徑中的三個部分:目錄名、基本名和擴(kuò)展名。 realpath()函數(shù)將path中的所有符號鏈接和相對路徑引用轉(zhuǎn)換為相應(yīng)的硬鏈接和絕對路徑。 filesize()函數(shù)返回指定文件的大小,以字節(jié)為單位。 disk_ free space()函數(shù)返回指定的目錄disk=total_ space()函數(shù)返回指定的目錄所在磁盤分區(qū)的總?cè)萘?以字節(jié)為單位)。所在磁盤分區(qū)的可用空間(以字節(jié)為單位)。 確定訪問和修改時間: fileatime()函數(shù)返回文件的最后訪問時間,采用UNIX時間戳格式,有錯誤時返回FALSE. filectime()函數(shù)返回文件的最后改變時間,采用UNIX時間戳格式,有錯誤時返回FALSE filemtime()函數(shù)返回文件的最后修改時間,采用UNIX時間戳格式,否則返回FALSE. “最后改變時間”不同于“最后修改時間”,最后改變時間指的是對文件inode'致?lián)娜魏胃淖?,包括改變?quán)限、所有者、組或其他inode特定的信息,而最后修改時間 指對文件內(nèi)容的修改(特別是以字節(jié)為單位的文件大小)。 文件處理: 識別文件末尾字符int feof{string resource) 打開和關(guān)閉文件:在處理文件內(nèi)容之前,通常需要創(chuàng)建所謂的句柄。同樣,結(jié)束該資源的操作之后,應(yīng)當(dāng)銷毀該句柄。 fopen()函數(shù)將文件綁定到一個句柄。綁定之后,腳本就可以通過句柄與此文件交互。fopen()還能通過一些協(xié)議(包括HTTP, HTTPS和FTP)打開資源,這些概念將在第16章討論。打開資源時,如果指定了模式,就可以確定該資源的訪問級別。 好的編程實(shí)踐指出,一旦完成資源的處理,就要撤銷其指針。fcloset)函數(shù)就會做此處理。 讀取文件: file()函數(shù)能夠?qū)⑽募x取到數(shù)組中,各元素由換行符分隔,同時換行符仍附加在每個元素的末尾。它不像其他讀/寫函數(shù),你不必建立文件句柄來讀取該函數(shù)。 file _get _contents()函數(shù)將文件中的內(nèi)容讀到字符串中。 fgetcsv()函數(shù)使用起來很方便,將解析標(biāo)記為CSV的文件中的每一行。 fgtes()函數(shù)返回通過打開的資源句柄讀入的若干個字符,或者返回遇到換行或EOF之前讀取的所有內(nèi)容。 fgetss()函數(shù)與fgets()相似,只是它將從輸入中清除所有HTML和PHP標(biāo)記。 如果希望從用戶通過表單提交的輸入中刪除HTML標(biāo)記,請使用strip tags()函數(shù), fread()函數(shù)從handle指定的資源中讀取leng七h(yuǎn)個字符。當(dāng)?shù)竭_(dá)EOF或讀取到length個字符時,讀取將停止。使用fread()時不考慮換行符。 readfile()函數(shù)讀取由filename指定的整個文件,立即輸出到輸出緩沖區(qū),并返回讀取的字節(jié)數(shù)。 將字符串寫入文件:fwrite()函數(shù)將字符串的內(nèi)容輸出到指定的資源中。 讀取目錄內(nèi)容: opendir()會打開路徑指定的目錄流。 closedir()函數(shù)關(guān)閉目錄流。 readir()函數(shù)返回目錄中的各個元素。readdir()還返回在一般的UNIX目錄列表中常見的“.”和“二”項(xiàng)??梢岳胕f語句過濾 scandir()函數(shù)是PHPS的新函數(shù),返回一個由directory中文件和目錄組成的數(shù)組, 執(zhí)行Shell命令: rmdir()函數(shù)刪除指定的目錄,成功時返回下RUE,否則為FALSE 如果用戶對目錄沒有寫權(quán)限,rmdir將失敗。此外,目錄必須為空。要刪除一個非空的目錄,編寫一個遞歸函數(shù),在刪除目錄前先刪除其中的所有文件內(nèi)容。 renamet)函數(shù)重命名文件,成功時返回丁RUE,否則返回FALSE touch()函數(shù)設(shè)置文件filename的最后修改時間和最后訪問時間,成功時返回TRUE,否則為FALSE。 系統(tǒng)級程序執(zhí)行: 清理輸入:如果沒有清理可能順次傳遞給系統(tǒng)級函數(shù)的用戶輸入,可能會讓攻擊者有機(jī)可趁,用戶的輸入傳遞給任何PHP程序執(zhí)行函數(shù)之前,先對輸入進(jìn)行清理。有兩個標(biāo)準(zhǔn)函數(shù)可以很方便地完成此工作:escapeshellargt)和escapeshellcmd()。 escapeshellargt)函數(shù)用單引號界定給定的參數(shù),并為輸入的參數(shù)中的單引號加上前綴(轉(zhuǎn)義)。 escapeshellcmd{)函數(shù)的工作前提與escapeshellarg{)相同,通過對shell元孚符轉(zhuǎn)義米清理可能危險的輸入。其形式為: string escapeshellcmd{string command) 這些字符包括:#&;,1*?,一<>‘()〔〕{}$。 PHP的程序執(zhí)行函數(shù): 1.執(zhí)行系統(tǒng)級命令 exec()函數(shù)最適合執(zhí)行在服務(wù)器后臺連續(xù)執(zhí)行的操作系統(tǒng)級應(yīng)用程序。 2.獲取系統(tǒng)命令的結(jié)果 如果希望輸出執(zhí)行命令的結(jié)果,system()函數(shù)很有用。 passthru()函數(shù)與exec()函數(shù)相似,只不過它應(yīng)當(dāng)用于向調(diào)用者返回二進(jìn)制輸出。假設(shè)希望在瀏覽器顯示GIF圖片前,先將GIF圖片轉(zhuǎn)換為PNG格式圖片。 4.用反引號執(zhí)行shell命令 使用反引號(backtick )界定字符串時,就是在告訴PHP:該字符串應(yīng)當(dāng)作為shell命令來執(zhí)行,反引號不是單引號,而是一個傾斜的引號,在大多數(shù)美國鍵盤上一般與波浪線(~)在同一個按鍵上。5.可代替反引號的函數(shù) shell exec()函數(shù)提供了與反引號相同的語法形式,會執(zhí)行一個shell命令,返回輸出。 雖然只使用PHP來構(gòu)建有意義而且強(qiáng)大的Web應(yīng)用程序肯定是可行的,但是,如果能與底層平臺和其他技術(shù)相集成,這些功能可以得到極大的擴(kuò)展。 邏輯上己經(jīng)實(shí)現(xiàn)了很多常見任務(wù)(不論應(yīng)用程序是何種類型,都肯定需要反復(fù)執(zhí)行這樣一些任務(wù)),所以,利用這些以社區(qū)為后盾的服務(wù),會節(jié)省很多編程時間。 6.5日期和時間 七、PHP基礎(chǔ)模塊代碼 八、PHP常用API分類匯總 九、MVC框架及模板 關(guān)于MVC的知識見MVC及框架學(xué)習(xí)筆記。 要努力以可靠的開發(fā)實(shí)踐作為開發(fā)的基礎(chǔ),其中一些實(shí)踐經(jīng)過多年的發(fā)展己經(jīng)越來越明確。許多開發(fā)人員已經(jīng)聯(lián)手打造了多種Web框架,這些Web框架可以幫助其他開發(fā)人員以一種高效、快速并體現(xiàn)可靠開發(fā)原則的方式開發(fā)Web應(yīng)用程序。 常見框架:CakePHP框架、Sola框架、symfony框架 Zend框架: ThinkPHP: ThinkPHP是一個快速、兼容而且‘簡單的輕量級國產(chǎn)PHP開發(fā)框架,誕生十2006年初,原名FCS,,2007年元旦正式更名為ThinkPHP,遵循Apache2開源協(xié)議發(fā)布,從Struts結(jié)構(gòu)移植過來并做了改進(jìn)和完善,同時也借鑒了國外很多優(yōu)秀的框架和模式,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu)和MVC模式,融合了Struts的思想和TagLib(標(biāo)簽庫)、ROR的ORM映射和 ActiveRecord模式,封裝了 CURD和一些常用操作,單一入口模式等,在模版引擎、 數(shù)據(jù)庫抽象層、緩存機(jī)制、認(rèn)證機(jī)制和擴(kuò)展性方面均有獨(dú)特的表現(xiàn),從誕生到現(xiàn)在經(jīng)歷了不少的變化和發(fā)展,得到了很多朋友的關(guān)注和支持,同時也已經(jīng)越來越多地受到國內(nèi)PHP開發(fā)人員的認(rèn)可。 十、PEAR包 PEAR,即PHP擴(kuò)展與應(yīng)用庫C PHP Extension and Application Repository)的縮寫,是可重用PHP組件的一個框架和分發(fā)系統(tǒng),如果你還沒有開始使用PEAR,那你肯定曾花費(fèi)大量精力和時間閉門造車,重復(fù)地實(shí)現(xiàn)了PEAR包中已有的一些特性。 在使用前先安裝pear。 使用已安裝的PEAR包很簡單。只需利用include或require(更可取)。記住,需要將PEAR的基目錄添加到include_ path指令中 十一、 PHP網(wǎng)站部署及安全 十二、 雜項(xiàng) 十三、 PHP網(wǎng)站常見模塊(非框架版) 十四、 PHP網(wǎng)站常見模塊(TP框架版) 十五、 用PHP+Mysql構(gòu)造網(wǎng)站系統(tǒng)案例(詳細(xì)設(shè)計(jì)文檔)
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|