發展歷程
PHP原始為PersonalHomePage的縮寫,已經正式更名為"PHP:HypertextPreprocessor"。注意不是“HypertextPreprocessor”的縮寫,這種將名稱放到定義中的寫法被稱作遞歸縮寫。PHP於1994年由RasmusLerdorf創建,剛剛開始是RasmusLerdorf為了要維護個人網頁而製作的一個簡單的用Perl語言編寫的程式。這些工具程式用來顯示RasmusLerdorf的個人履歷,以及統計網頁流量。後來又用C語言重新編寫,包括可以訪問資料庫。他將這些程式和一些表單直譯器整合起來,稱為PHP/FI。PHP/FI可以和資料庫連線,產生簡單的動態網頁程式。
在1995年以PersonalHomePageTools(PHPTools)開始對外發表第一個版本,Lerdorf寫了一些介紹此程式的文檔。並且發布了PHP1.0!在這的版本中,提供了訪客留言本、訪客計數器等簡單的功能。以後越來越多的網站使用了PHP,並且強烈要求增加一些特性。比如循環語句和數組變數等等;在新的成員加入開發行列之後,RasmusLerdorf在1995年6月8日將PHP/FI公開發布,希望可以透過社群來加速程式開發與尋找錯誤。這個發布的版本命名為PHP2,已經有PHP的一些雛型,像是類似Perl的變數命名方式、表單處理功能、以及嵌入到HTML中執行的能力。程式語法上也類似Perl,有較多的限制,不過更簡單、更有彈性。PHP/FI加入了對MySQL的支持,從此建立了PHP在動態網頁開發上的地位。到了1996年底,有15000個網站使用PHP/FI。
在1997年,任職於TechnionIIT公司的兩個以色列程式設計師:ZeevSuraski和AndiGutmans,重寫了PHP的剖析器,成為PHP3的基礎。而PHP也在這個時候改稱為PHP:HypertextPreprocessor。經過幾個月測試,開發團隊在1997年11月發布了PHP/FI2。隨後就開始PHP3的開放測試,最後在1998年6月正式發布PHP3。ZeevSuraski和AndiGutmans在PHP 3發布後開始改寫PHP的核心,這個在1999年發布的剖析器稱為ZendEngine,他們也在以色列的RamatGan成立了ZendTechnologies來管理PHP的開發。
在2000年5月22日,以ZendEngine1.0為基礎的PHP4正式發布,2004年7月13日則發布了PHP5,PHP5則使用了第二代的ZendEngine。PHP包含了許多新特色,像是強化的面向對象功能、引入PDO(PHPDataObjects,一個存取資料庫的延伸函式館)、以及許多效能上的增強。PHP4已經不會繼續更新,以鼓勵用戶轉移到PHP5。
2008年PHP5成為了PHP唯一的有在開發的PHP版本。將來的PHP5.3將會加入Latestaticbinding和一些其他的功能強化。PHP 6的開發也正在進行中,主要的改進有移除register_globals、magicquotes和Safemode的功能。
2013年6月20日,PHP開發團隊自豪地宣布推出PHP5.5.0。此版本包含了大量的新功能和bug修復。需要開發者特別注意的一點是不再支持WindowsXP和2003系統。
2014年10月16日,PHP開發團隊宣布PHP5.6.2可用。四安全相關的錯誤是固定在這個版本,包括修復cve-2014-3668,cve-2014-3669和cve-2014-3670。所有的PHP5.6鼓勵用戶升級到這個版本。
開發工具
集成開發環境是一種集成了軟體開發過程中所需主要工具的集成開發環境,其功能包括但不僅限於代碼高亮、代碼補全、調試、構建、版本控制等。一些常見的PHPIDEs如下:ZendStudio:商業版,Zend官方出品,基於eclipse
EclipsewithPDT:免費
Coda:商業版,針對Mac用戶
NetBeans:免費,功能強大
PHPStorm:商業版
AptanaStudio:免費
PhpEd:商業版
KomodoIDE/Edit:IDE為商業版,Edit可免費使用
AdobeDreamweaver:商業版
除去集成開發環境,具備代碼高亮功能的常見文本編輯器因其輕巧靈活也常被選作開發工具,例如:Notepad++、Editplus、SublimeText、Everedit(國人開發)等等。
類型
php支持八種原始類型。
四種標量類型:
•boolean(布爾型)
•integer(整型)
•float(浮點型,也作“double”)
•string(字元串)
兩種複合類型:
array(數組)、object(對象)
最後是兩種特殊類型:
resource(資源)、NULL
為了確保代碼的易讀性,本手冊還介紹了一些偽類型:
•mixed
•number
•callback
可能還會讀到一些關於“雙精度(double)”類型的參考。實際上double和float是相同的,由於一些歷史的原因,這兩個名稱同時存在。
變數的類型通常不是由程式設計師設定的,確切地說,是由php根據該變數使用的上下文在運行時決定的。
註:如果想查看某個表達式的值和類型,用var_dump()。
註:如果只是想得到一個易讀懂的類型的表達方式用於調試,用gettype()。要查看某個類型,不要用gettype(),而用is_type函式。
特性
PHP的特性包括:1.PHP獨特的語法混合了C、Java、Perl以及PHP自創新的語法。2.PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的程式語言相比,
PHP是將程式嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現。
3.PHP支持幾乎所有流行的資料庫以及作業系統。
4.最重要的是PHP可以用C、C++進行程式的擴展。
優勢
1、開放的原始碼:所有的PHP原始碼事實上都可以得到。
2、PHP是免費的:
和其它技術相比,PHP本身免費且是開原始碼。
3、php的快捷性:
程式開發快,運行快,技術本身學習快。嵌入於HTML:因為PHP可以被嵌入於HTML語言,它相對於其他語言。編輯簡單,實用性強,更適合初學者。
4、跨平台性強:
由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS、MacOS下。
5、效率高:
PHP消耗相當少的系統資源。
6、圖像處理:
用PHP動態創建圖像
7、面向對象:
在php4,php5中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程式。
8、專業專註:
PHP支持腳本語言為主,同為類C語言。
技術套用
1.偽靜態2.靜態頁面生成
3.資料庫快取
4.過程快取
5.div+cssw3c標準
6.大負荷
7.分散式
8.flex
9.桌面程式套用(不擅長)
10.支持MVC模型
11.Smarty模版引擎
參考手冊
函式完整參考手冊:
序號 | 分類 | 描述 |
---|---|---|
1 | Array 函式 | |
2 | Calendar 函式 | 日曆擴展包含了簡化不同日曆格式間的轉換的函式。 |
3 | Date/Time 函式 | Date/Time 函式用於從 PHP 腳本運行的伺服器上獲取日期和時間並進行格式化。 |
4 | Directory 函式 | Directory 函式用於獲得關於目錄及其內容的信息。 |
5 | Error/Logging 函式 | Error/Logging 函式用於對錯誤進行處理和記錄。 |
6 | Filesystem 函式 | Filesystem 函式用於訪問和操作檔案系統。 |
7 | Filter 函式 | PHP 過濾器用於對來自非安全來源的數據(比如用戶輸入)進行驗證和過濾。 |
8 | FTP 函式 | FTP 函式通過檔案傳輸協定 (FTP) 提供對檔案伺服器的客戶端訪問。 |
9 | HTTP 函式 | HTTP 函式用於對由 Web 伺服器傳送到瀏覽器的信息進行操作。 |
10 | Libxml 函式 | Libxml 函式和常量與 SimpleXML、XSLT 以及 DOM 函式一起使用。 |
11 | Mail 函式 | mail() 函式用於從腳本中直接傳送電子郵件。 |
12 | Math 函式 | Math 函式能處理 integer 和 float 範圍內的值。 |
13 | 雜項函式 | 我們把不屬於其他類別的函式歸納到雜項函式類別。 |
14 | MySQLi 函式 | MySQLi 函式用於訪問 MySQL 資料庫伺服器。 |
15 | SimpleXML 函式 | SimpleXML 擴展提供了一種獲取 XML 元素的名稱和文本的簡單方式。 |
16 | String 函式 | |
17 | XML Parser 函式 | XML Parser 函式允許您創建 XML 解析器,並為 XML 事件定義句柄。 |
18 | Zip File 函式 | Zip File 函式允許您讀取壓縮檔案。 |
版本對比
PHP版本VC6與VC9、ThreadSafe與None-ThreadSafe等的區別
PHP的大版本主要分三支:PHP4/PHP5/PHP6
其中,PHP4由於太古老、對QQ支持不力已基本被淘汰,請無視PHP4。
PHP6由於基本沒有生產線上的套用,還基本只是一款概念產品,很多功能已在PHP5.3.3上實現,所以也不詳述,請無視PHP6。
PHP5的版本主要分四支:PHP5.2之前的版本、PHP5.2.X、PHP5.3和日前發布的PHP5.4。
選擇版本
PHP5.2之前的版本不值得考慮,因為某些功能缺陷或者BUG。PHP5.4還處於Beta試用的版本號,非穩定版本,請無視PHP5.4。
主流PHP程式對PHP5.2.X的兼容性最好,而每次版本號的升級帶來的都是安全性和穩定性的改善,所以宜挑選最新的版本。目前PHP5.2系列最新的是PHP5.2.17。
而如果產品是自己開發自己使用,PHP5.3在某些方面更具優勢,在穩定性上更勝一籌,增加了很多PHP5.2所不具有的功能,比如內置php-fpm、更完善的垃圾回收算法、命名空間的引入、sqlite3的支持等等,是部署項目值得考慮的版本,強烈推薦PHP5.3.3。
除了版本號的不同,同一版本號的PHP版本也有區別,並且在選擇PHP擴展的時候需要注意。
install版:可執行的MSI格式安裝包。
ZIP版:解壓即可用。和install版無區別。建議選擇ZIP版。
DEBUG版:最終用戶無需關心。
VC6與VC9
如果你在apache1或者apache2下使用PHP,你應該選擇VC6的版本
如果你在IIS下使用PHP應該選擇VC9的版本,VC6的版本使用visualstudio6編譯,VC9使用VisualStudio2008編譯,並且改進了性能和穩定性。VC9版本的PHP需要你安裝Microsoft2008C++Runtime。不要在apache下使用VC9的版本。
TS和NTS
TS指ThreadSafety,即執行緒安全,一般在IIS以ISAPI方式載入的時候選擇這個版本。
NTS即None-ThreadSafe,一般以fastcgi方式運行的時候選擇這個版本,具有更好的性能。
從2000年10月20日發布的第一個Windows版的PHP3.0.17開始的都是執行緒安全的版本,這是由於與Linux/Unix系統是採用多進程的工作方式不同的是Windows系統是採用多執行緒的工作方式。如果在IIS下以CGI方式運行PHP會非常慢,這是由於CGI模式是建立在多進程的基礎之上的,而非多執行緒。一般我們會把PHP配置成以ISAPI的方式來運行,ISAPI是多執行緒的方式,這樣就快多了。但存在一個問題,很多常用的PHP擴展是以Linux/Unix的多進程思想來開發的,這些擴展在ISAPI的方式運行時就會出錯搞垮IIS。因此在IIS下CGI模式才是PHP運行的最安全方式,但CGI模式對於每個HTTP請求都需要重新載入和卸載整個PHP環境,其消耗是巨大的。
為了兼顧IIS下PHP的效率和安全,微軟給出了FastCGI的解決方案。FastCGI可以讓PHP的進程重複利用而不是每一個新的請求就重開一個進程。同時FastCGI也可以允許幾個進程同時執行。這樣既解決了CGI進程模式消耗太大的問題,又利用上了CGI進程模式不存線上程安全問題的優勢。
因此,如果是使用ISAPI的方式來運行PHP就必須用ThreadSafe(執行緒安全)的版本;而用FastCGI模式運行PHP的話就沒有必要用執行緒安全檢查了,用NoneThreadSafe(NTS,非執行緒安全)的版本能夠更好的提高效率。
查看版本
一個很簡單的辦法就是phpinfo();
ThreadSafetydisabled是NTS,enabled是TS
ConfigureCommand看到VC98字樣的是VC6,Compiler標明MSVC9(VisualC++2008)的是VC9
在WIN7下:IIS7+NTS+FastCGI+vc9是最佳搭檔或者apache+fastcgi+nts+vc6。
在WINXP下:Apache+TS+Apachemodule+vc6最合適的搭檔。
PHP3
PHP3跟Apache伺服器的緊密結合的特性;加上它可以不斷的更新及加入新的功能,而且幾乎支持所有主流與非主流資料庫。再以它能高速的執行效率,使得PHP在1999年中的使用站點已經超過了150000。加上它的原始碼完全公開,在OpenSource意識抬頭的今天,它更是這方面的中流砥柱。不斷地有新的函式館加入,以及不停地更新的活力。使得PHP無論在UNIX、LINUX或是Windows的平台上都可以有更多新的功能。它提供豐富的函式,使得在程式設計方面有著更好的支持。
PHP4
簡介
PHP4.0整個腳本程式的核心大幅更動,讓程式的執行速度,滿足更快的要求。在最佳化之後的效率,已較傳統CGI或者ASP等程式有更好的表現。而且還有更強的新功能、更豐富的函式館。無論您接不接受,PHP都將在WebCGI的領域上,掀起巔覆性的革命。對於一位專業的WebMaster而言,它將也是必修課程之一。
PHP4.0是更有效的,更可靠的動態Web頁開發工具,在大多數情況運行比PHP3.0要快,其腳本描述更強大並且更複雜,最顯著的特徵是速率比的增加。PHP4.0這些優異的性能是PHP腳本引擎重新設計產生的結果:引擎由AndiGutmans和ZeevSuraski從底層全面重寫。PHP4.0腳本引擎——Zend引擎,使用了一種更有效的編譯——執行方式,而不是PHP3.0採用的執行——當解析時模型。
優越性
PHP4在3.0版的基礎上增加或增強了許多有用的特徵,主要如下:
(1)別名:在PHP4中,可以利用引用為變數賦值,這給編程帶來了很大的靈活性。
(2)擴充了API模組:PHP4.0為擴展的API模組的提供了擴展PHP接口模組,它比舊的API版本顯著地快。PHP模組已有的及最常用的接口多數被轉換到使用這個擴展的接口。
(3)自動資源釋放:PHP4增加了引用計數功能,這種新技術的引入使PHP4具有了自動記憶體管理功能,減輕了開發人員的負擔。
(4)布爾類型:PHP4.0支持布爾類型。
(5)進程生成:在UNIX環境下的PHP4.0提供了一個很智慧型和通用的生成進程,使用了一種名為基於automake/libtool的系統生成技術。
(6)COM/DCOM支持:PHP4.0提供COM/DCOM支持(僅用於Windows環境)可以無縫地存取和訪問COM對象。
(7)與PHP3.0兼容性很好:PHP4.0是與PHP3.0代碼向後兼容性接近100%。由於PHP4的改進的體系結構,兩者有一些細微的差別,但是大多數人將可能永遠不可能遇上這種情況。
(8)配置:PHP4重新設計和增強了PHP.ini檔案,這使得用PHP.ini來配置PHP顯得極為容易,這個檔案可以在運行時被Apache(unix系統)或由Windows註冊(Windows環境)。
(9)加密支持:PHP4實現了完整的加密,這些加密功能是一個完整的mycrypt庫,並且PHP4.0支持哈希函式。Blowfish,TripleDES,MD5,並且SHA1也是可使用的一些加密算法。
(10)類型檢查:PHP4.0支持同一操作符用於評類型檢查:===(3等號運算符,恆等計算符),為在兩個值和其類型之間作檢查。例如,'3'===3將視為假(類型是不同的),而3==3(相等判斷,不比較類型)將視為真。
(11)FTP支持:PHP4.0支持FTP。通常,你會為通過一個數據機連線下載一個大檔案提供一個接口。然而,如果你確實有需要,可以使用PHP。
(12)PHP4新增函式或功能增強函式:PHP4.0新增了許多函式,同時也將許多現有的函式功能進行了增強,以下是一些例子。array_count_values()eval()foreach()include()ob_end_clean()ob_end_flush()ob_get_contents()ob_start()strip_tags()unset()。
(13)here列印:PHP4.0的Here列印是與Perl類似的,儘管完全不相同。Here是列印大容量文章的一個有用的方法,例如在HTML檔案中,不會漏掉任何一個字元,例如目錄標記。
(14)HTTPSessionfallback系統:為HTTPSession管理的一個fallback系統在PHP4.0被實現。預設情況下,Session標識符由cookies存儲。如果沒有cookies支持或一項cookies任務失敗,Session標識符自動被創建並在URL的查詢字元串中被攜帶。
(15)ISAPI支持:PHP4.0能作為一個個性化的ISAPI模組作為IIS外掛程式。這比PHP3.0更有效,它作為一個外部的程式來運行。
(16)記憶體:PHP4.0能更有效的使用記憶體,導致較少的記憶體占用消耗,這主要歸功於引用計數技術的實現。⒄其他類成員函式:在PHP4.0你能在成員函式本身的作用域或全局範圍內調用其他類的成員函式。例如,你能用一個子函式覆蓋父函式,並在子函式中調用父函式。
(17)多維數組:在PHP4.0,利用GET,POST,Cookies的進行的數據傳輸支持多維數組。
(18)個性化的HTTPSession支持:HTTPSession處理,包括fallback系統管理,在PHP4.0被它的新庫函式實現。在版本3.0中處理Session要求使用PHPLIB和第三方的庫函式,它比把Session直接地由PHP支持慢了許多。
(19)個性化的Java支持:PHP4.0支持和java的互動。這種個性化的Java支持為PHP在Java對象上創建和使用方法提供一個簡單並且有效的工具。
(20)對象和數嵌套組:PHP4.0實現了功能更加強大的對象,移去了PHP3.0存在的種種句法限制。對象能在數組以內被嵌套並且反過來也如此,可以根據你的需要實現嵌套。
(21)面向對象的編程:PHP4.0為面向對象的編程和構造類及對象提供擴展的功能和新特徵。PHP4實現了對象重載,引用技術等新技術。
(22)對象重載支持:對象重載語法允許第三方的基於面向對象的類庫使用PHP4的面向對象的特徵存取他們自身的功能。使用這個特徵的一個COM模組已經被實現了。
(23)輸出緩衝支持:PHP提供了一個輸出緩衝函式集合。輸出緩衝支持允許你寫包裹函式功能壓縮緩衝區。在PHP4的輸出緩衝支持允許HTML頭信息存放,無論HTML的正文是否輸出。頭信息((header(),contenttype,andcookies)不採用緩衝。
(24)增加了PCRE庫:PHP4.0包括一個Perl兼容的正則表達式(PCRE)庫,和正常regex庫一起與PHP綁定。split和replacePCRE功能被支持。PCRE和Perl正規表達式之間有一些細微差別。
(25)PHP.ini檔案:PHP.ini檔案在PHP4.0被重新設計,使用的PHP的配置PHP.ini是更容易並且更有效的。全部檔案能被Apache在運行時間操作(在Apache環境下)或由Windows註冊表(在Windows下面)。被加入PHP.ini檔案的配置指令自動地在所有相關的模組中被支持。
(26)引用計數:PHP4.0為系統中的每個數值提供了引用計數,包括資源。一旦一個資源不再被任何變數引用,它自動地被釋放以節省記憶體資源。利用這個特徵的最明顯的例子一個內置SQL查詢的循環語句。在PHP3.0中,每次遞歸另外的SQL結果集合重複申請記憶體,直到腳本執行完畢,這些結果集合占用的記憶體才被釋放。
(27)支持引用:通過引用可以改變一個變數的值。
(28)函式的運行時綁定:PHP4.0的運行時間綁定功能允許你在他們被聲明以前調用,無論聲明是否在代碼以後或是在運行時間。
(29)類的運行時信息:PHP4.0支持在運行時刻存取下列類信息:一個對象的類名,一個對象的父類的類名字,以及對象函式所在的名字。
(30)伺服器抽象層:為支持Web伺服器提供了增強型SAPI(伺服器API)接口,是PHP4.0不可分的一部分。這個伺服器抽象層,提供了通用的WEB伺服器接口支持,支持多執行緒WEB伺服器,為大多數的WEB伺服器提供透明的支持,這些伺服器包括Apache,IIS(ISAPI),以及AOL伺服器。
(31)語法的點亮顯示:PHP4.0語法的點亮顯示允許開發者看見原始碼而不是腳本,這個功能比PHP3.0中的更有效。它跑得更快,更執行得更好,並且產生更緊湊的HTML代碼。
(32)由引用改變變數的值:PHP4.0由引用支持可變的賦值,“關聯”的2個變數之中個的任何一個的值被改變,另外的變數的值同樣被改變,這類似與C中的指針類型。
(33)在引用字元串中的變數引用:PHP4.0增強了在引用字元串中的變數引用。
PHP5
PHP5在長時間的開發及多個預發布版本後,2004年7月13日,PHP5.0發布。該版本以Zend引擎Ⅱ為引擎,並且加入了新功能如PHPDataObjects(PDO)。PHP5.0版本強化更多的功能。首先,完全實現面向對象,提供名為PHP兼容模式的功能。其次是XML功能,PHP5.0版本支持可直觀地訪問XML數據、名為SimpleXML的XML處理用界面。同時還強化了XMLWeb服務支持,而且標準支持SOAP擴展模組。資料庫方面,PHP新版本提供旨在訪問MySQL的新界面——MySQL。除此前的界面外,還可以使用面向對象界面和預處理語句(PreparedStatement)等MySQL的新功能.另外,PHP5.0上還捆綁有小容量RDBMS-SQLite.
新對象模式
*構造函式和析構函式*對象的引用*對象的克隆*對象中的私有、公共及受保護模式*接口(Interfaces)
*抽象類*__call*__set和__get*靜態成員
構造函式和析構函式
在PHP4中,當函式與對象同名時,這個函式將成為該對象的構造函式,並且在PHP4中沒有析構函式的概念。
在PHP5中,構造函式被統一命名為__construct,並且引入了析構函式的概念,被統一命名為__destruct。
在PHP4中,傳遞變數給一個函式或方法,實際是把這個變數做了一次複製,也就意味著你傳給函式或方法的是這個變數的一個副本,除非你使用了引用符號“&;”來聲明是要做一個引用,而不是一個Copy。在PHP5中,對象總是以引用的形式存在的,對象中的賦值操作同樣也都是一個引用操作。
對象的克隆當一個對象始終以引用的形式來被調用時,如果我想得到該對象的一個副本,該怎么辦呢?PHP5提供了一個新的功能,就是對象的克隆,語法為__clone。
抽象類抽象類不能被實例化。
抽象類與其它類一樣,允許定義變數及方法。
抽象類同樣可以定義一個抽象的方法,抽象類的方法不會被執行,不過將有可能會在其派生類中執行。
__call
PHP5的對象新增了一個專用方法__call(),這個方法用來監視一個對象中的其它方法。如果你試著調用一個對象中不存在的方法,__call方法將會被自動調用。
__set和__get
這是一個很棒的方法,__set和__get方法可以用來捕獲一個對象中不存在的變數和方法。
在PHP5中,你可以在對象的方法中指明其參數必須為另一個對象的實例。
靜態成員靜態成員和靜態方法在面象對象編程的術語中被稱作“類方法(classmethods)”和“類變數(classvariables)”。
“類方法”在一個對象沒有實例化前允許被調用。同樣,“類變數”在一個對象沒有實例化前可以被獨立操作控制(不需要用一個對象的方法來控制)。
異常處理
異常處理是公認的處理程式錯誤的理想方法,在Java及C中都有這個概念,我們欣喜的看到,在PHP5已經加入了這方面的套用。你可以嘗試使用“try”和“catch”來控制程式的錯誤。當有錯誤發生的時候,代碼會把錯誤交給“catch”子句來處理,在“catch”子句中,你需要指明要把錯誤交給某個對象處理,這樣做可以使代碼結構看起來更清晰,因為我們可以把所有的錯誤信息交給一個對象來處理。
自定義錯誤處理
你可以很方便的用自定義的處理錯誤的代碼來控制你的程式中的意外。你僅僅需要從異常類中派生出一個自己的錯誤控制類,在你自己的錯誤控制類中,你需要有一個構造函式和一個getMessage方法。
命名空間
名稱空間對類的分組或函式分組很有用。它可以把一些相關的類或函式給組合到一起,方便以後調用。
注意你需要在何種情況下使用名稱空間,在實際運用中,你可能會需要聲明兩個或多個名稱一樣的對象來做不同的事情,那么你就可以把他們分別放到不同的名稱空間中去(但接口是要相同的)。
加密
從PHP5.3開始支持ZendGuard加密方式,必須安裝ZendGuardLoader,老的zendoptimizer將不被支持。
Linux安裝ZendGuardLoader支持的過程:
作業系統為CentOS5.5,PHP版本為5.3.8(CentOS5.5中的PHP默認版本較低,如果要升級到PHP最新版,可以使用remi的report源進行升級)。
Windows下面的ZendGuardLoader不支持php5.3.8VC9x86ThreadSafe而,php5.3.8VC9x86NonThreadSafe又不支持apache。所以安裝的話,就需要安裝在iis或者和nginx搭配。
1、下載最新的Linux作業系統系下的ZendGuardLoader。
2、上傳至Linux伺服器並解壓縮,注意閱讀生成目錄下的README檔案。全文如下(添加必要的注釋)。在/etc/php.d/目錄下創建檔案zend.ini,內容如下:
1 | zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so |
注意路徑一定要寫上,剛開始沒寫路徑,老是載入不上ZendGuardLoader.so,也可以直接將上面的配置寫入/etc/php.ini檔案中,效果一樣。
3、重啟httpd服務:servicehttpdrestart。
4.輸出<?phpphpinfo();?>
PHP5.5正式版發布不再支持WindowsXP
同時PHP開發者也提醒用戶,PHP5.5也包含一些不向後兼容的內容,包括:不再支持WindowsXP和2003系統;不區分大小寫的匹配函式、類;常數名稱跟Locale無關,這對一些使用非ASCII代碼的常量名的開發者需要注意的。
PHP6構想
1、支持Unicode。Unicode是有其必然,雖然Unicode占用較多的空間,但Unicode帶來的便利性,遠超過占用空間的缺點,尤其在國際化的今天,硬體設備越來越強大,網速也大幅度的提升,這么一點小小的缺點是可以忽略的。另外一點,PHP也可以在.ini檔案中設定能不能開啟支持Unicode,決定權在你自己,這是一個不錯的點子,關掉Unicode的支持,PHP的性能並不會有大幅度的提升,主要的影響在於需要引用字元串的函式。
2、RegisterGlobals將被移除這是一個主要的決定,老的PHP使用者會覺得RegisterGlobals滿方便的,但是卻忽略了RegisterGlobals會帶來程式上安全性的隱患,大多數的主機上此項功能是關閉的,印象中從PHP4.3.x版開始,此項默認配置值即是關閉狀態,PHP6正式移除RegisterGlobals也代表著如果程式是PHP3時代的產物,將完全不能運用,除了改寫用途外,別無他法。
3、MagicQuotes將取消MagicQuotes主要是自動轉義須要轉義的字元,此項功能移除也符合大多數PHP開發者的心聲。
4、SafeMode取消。老實說,這個模式不知道哪裡不好,取消就取消吧,反正也用不到。
5、‘var’別名為‘public’,在類中的var聲明變成public的別名,相信是為了兼容PHP5而作的決定,PHP6現在也可以稱作為OO語言了。
6、通過引用返回將出錯未來通過引用返回編譯器將會報錯例如$a=&newb()、function&c(),OO語言默認就是引用,所以不須要再運用&了。
7、zend.ze1compatbilitymode將被移去(Zend.ze1相容模式將被移去),PHP5是為兼容舊有PHP4,所以在.ini中可選擇是否開啟相容模式,原由在於PHP5運用的是第二代分析引擎,但是相容模式並不是百分之百能分析PHP4語法,所以舊時代的產物,移除。
8、Freetype1andGD1support將不見這兩個Libs存在了很久,php6將不再支持,況且GD1早已被現在的GD2取代了。
9、dl()被移到SAPI中dl()主要是讓設計師載入extensionLibs,被移到SAPI中。
10、RegisterLongArray去除從PHP5起默認是關閉,在PHP6中正式移除。
11、一些Extension的變更例如XMLReader和XMLWriter將不再是以Extension的方式出現,他們將被移入到PHP的核心之中,並且默認是開啟,eregextension將被放入PECL,代表著它將被移出PHP核心,這也是為了讓路給新的正則表達式extension,此外,Fileinfoextension也將被導入PHP的核心之中。
12、APC將被導入核心這是一個提高PHP性能的功能,它將被放入PHP核心中,並且可以選擇是否啟用APC。
13、告別ASP風格的起始標籤原來是為了取悅ASP開發者轉向運用PHP,現今已經不再須要這種做法了。
最後,別期望PHP6的性能可以徹底超過PHP5,有可能PHP6的執行效率會比PHP5還要來得慢,但是可以預期的是,PHP開發小組將會努力的完善PHP6,超越PHP5。
環境配置
Windows下
軟體需求(最新版)
WindowsVista或更高版本;
Apache2+或IIS6+或Nginx
安裝過程
將PHP4.0.5解壓到C:\Web\php\目錄下。
將MySQL3.23.38安裝到C:\Web\mysql\目錄下。
將C:\web\php\php4ts.dll檔案拷貝到C:\WINNT\system32\目錄下。
將C:\web\php\php.exel檔案拷貝到C:\WINNT\目錄下。
將C:\web\php\php.ini-dist檔案拷貝到C:\WINNT\目錄下,並將php.ini-dist更名為php.ini。
運行C:\Web\apache\Apache\Apache.exe-i-n
運行C:\Web\mysql\bin\mysqld-nt.exe--install
編輯C:\WINNT\php.ini
找到“extension_dir=./”欄位,將其改為extension_dir="C:\myphp\php\extensions"。
編輯C:\Web\apache\Apache\conf\httpd.conf
找到“#BindAddress*”欄位,將其改為BindAddress127.0.0.1。(如果主機有固定IP位址,此處改為主機IP位址。如BindAddress211.101.152.106),找到“ServerName”欄位,將其改為ServerNamelocalhost。(如主機有固定主機名,此處改為主機的主機名。如ServerNamebn001)。
找到“ScriptAlias/cgi-bin/"C:/Web/apache/Apache/cgi-bin/"”欄位,在其下面加入ScriptAlias/php/"C:/Web/php/"。找到“#AndforPHP4.x,use:”欄位,在其後面加入:AddTypeapplication/x-httpd-php;ActionApplication/x-httpd-php"c:/Web/php/php.exe"。
找到“#LoadModuleusertrack_modulemodules/mod_usertrackso”欄位,LoadModulephp4_modulec:/web/php/sapi/php4apache.dll
UNIX下
所需軟體
php-3.0.14-win32.zip;php-3.0.14-win32.zip;mysql-shareware-3.22.32-win.zip
所有軟體均安裝在/export/home/guoj/下,也可在其他目錄。
安裝mysql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | gzip-dcmysql-3.22.30.tar.gz|tarxvf- cdmysql-3.22.30 ./configure-prefix=/export/home/guoj/mysql make makeinstall scripts/mysql_install_db cd../mysql/bin bin/safe_mysqld&安裝phpapache gzip-dcapache_1.3.11.tar.gz|tarxvf- gzip-dcphp-3.0.11.tar.gz|tarxvf- cdapache_1.3.11 ./configure-prefix=/export/home/guoj/www cd../php-3.0.11 ./configure-with-apache=/export/home/guoj/apache_1.3.11 -with-mysql=/export/home/guoj/mysql-enable-track-vars make makeinstall cd../apache_1.3.11 ./configure--prefix=/export/home/guoj/www --activate-module=src/modules/php3/libphp3.aP make makeinstall cd../php-3.0.11 cd../php3.ini-distphp3.ini viphp3.ini修改php3.ini doc_root=/export/home/guoj/www/htdocs/ extension_dir=/export/home/guoj/php-3.0.11/ extension=php3_mysql.dllcpphp3.ini/usr/local/lib/php3.inivi../www/conf/httpd.conf |
加上以下幾句:
1 2 3 4 | <Directory"/export/home/guoj/php-3.0.11/"> OptionsFollowSymLinks AllowOverrideNone </Directory>../www/bin/apachectlstart |
其他方面
PHP 在資料庫方面的豐富支持,也是它迅速走紅的原因之一,它支持下列的資料庫或是數據檔案:
Adabas 、D、 DBA、dBase 、dbm 、filePro 、Informix 、InterBase、mSQL 、Microsoft SQL Server、·MySQL、Solid、Sybase、 Oracle 、PostgreSQL
而在 Internet 上它也支持了相當多的通訊協定 (protocol),包括了與電子郵件相關的 IMAP,POP3;網管系統 SNMP;網路新聞NNTP;帳號共用 NIS;全球信息網 HTTP 及 Apache 伺服器;目錄協定 LDAP 以及其它網路的相關函式。
除此之外,用 PHP 寫出來的 Web 後端 CGI 程式,可以很輕易的移植到不同的作業系統上。例如,先以 Linux 架的網站,在系統負荷過高時,可以快速地將整個系統移到 SUN 工作站上,不用重新編譯 CGI 程式。面對快速發展的 Internet,這是長期規劃的最好選擇。
相關語法及概念
語法(例子中均忽略了PHP代碼邊界符 ):
注釋的語法有三種:
基本的結構控制語句:
一個PHP實例:
php對面向對象的支持
面向對象編程的概念:
不同的作者之間說法可能不一樣,但是一個OOP語言必須有以下幾方面:
1.抽象數據類型和信息封裝
2.繼承
3.多態
在PHP中是通過類來完成封裝的:
當然你可以按自己的喜好進行定義,但最好保持一種標準,這樣會更有效。數據成員在類中使用"var"聲明來定義,在給數據成員賦值之前,它們是沒有類型的。一個數據成員可以是一個整數,一個數組,一個相關數組(associative array)或者是一個對象。方法在類中被定義成函式形式,在方法中訪問類成員變數時,你應該使用$this->name,否則對一個方法來說,它只能是局部變數。
使用new操作符來創建一個對象:
然後你可以使用成員函式通過:
在這個例子中,setX成員函式將5賦值給對象的成員變數x(不是類的),然後getX返回它的值5。可以象:$obj->x=6那樣通過類引用方式來存取數據成員,這不是一個很好的OOP習慣。我強烈建議通過方法來存取成員變數。如果你把成員變數看成是不可處理的,並且只通過對象句柄來使用方法,你將是一個好的OOP程式設計師。不幸的是,PHP不支持聲明私有成員變數,所以不良代碼在PHP中也是允許的。繼承在PHP中很容易實現,只要使用extends關鍵字。
"Another"類的對象擁有了父類(Something)的全部的數據成員及方法,而且還加上了自己的數據成員和方法。
你可以使用
PHP只支持單繼承,所以你不能從兩個或兩個以上類派生出新的類來。你可以在派生類中重定義一個方法,如果我們在"Another"類中重定義了getX方法(方法重寫),我們就不能使 用"Something"中的getX方法了。如果你在派生類中聲明了一個與基派同名的數據成員,那么當你處理它時, 它將“隱藏”基類的數據成員。
你可以在你的類中定義構造函式。構造函式是一個與類名同名的方法,當你創建一個類的對象時會被調用,例如:
所以你可以創建一個對象,通過:
構造函式會自動地把6賦值給數據變數x。構造函式和方法都是普通的PHP函式(”__“兩個下劃線,魔術方法),所以你可以使用預設參數。
接著:
預設參數使用C++的方式,所以你不能忽略Y的值,而給X一個預設參數,參數是從左到右賦值的,如果傳入的參數少於要求的參數時,其作的將使用預設參數。
當一個派生類的對象被創建時,只有它的構造函式被調用,父類的構造函式沒被調用,如果你想調用基類的構造函式,你必須要在派生類的構造函式中用parent::__construct()調用。可以這樣做是在派生類中所有父類的方法都是可用的。
OOP的一個很好的機制是使用抽象類。抽象類是不能實例化,只能提供給派生類一個接口。設計者通常使用抽象類來強迫程式設計師從基類派生,這樣可以確保新的類包含一些期待的功能。在PHP中沒有標準的方法,但是:如果你需要這個特性,可以通過定義基類,並在它的構造函式後加上"die" 的調用,這樣就可以保證基類是不可實例化的,在每一個方法(接口)後面加上"die" 語句,所以,如果一個程式設計師在派生類中沒有復蓋方法,將引發一個錯誤。而且因為PHP 是無類型的,你可能需要確認一個對象是來自於你的基類的派生類,那么在基類中增加一個方法來實義類的身份(返回某種標識id),並且在你接收到一個對象參數時校驗這個值。當然,如果一個不好的邪惡程式設計師在派生類中復蓋了這個方法,這種方法就不起作用了,不過一般問題多在懶惰的程式設計師身上,而不是邪惡的程式設計師。
當然,能夠讓基類對程式設計師無法看到是很好的,只要將接口列印出來做他們的工作就可以了。PHP 5 引入了析構函式的概念,這類似於其它面向對象的語言,如 C++。析構函式會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。
重載(與復蓋不同)在PHP中不支持,因為PHP是弱類型語言。在OOP中,你可以重載一個方法來實現兩個或重多的方法具有相同的名字,但是有不同數量或類型的參數(這要看語言)。PHP 是一種鬆散類型的語言,所以通過類型重載不起作用,然而通過參數的個數不同來重載也不起作用。
有時在OOP中重載構造函式非常好,這樣你可以通過不同的方法創建對象(變數函式)。在PHP中實現它的技巧是:
通過在類中的額外的處理,使用這個類對用戶是透明的:
有時這個非常好用。
多態
多態是對象的一種能力,它可以在運行時刻根據傳遞的對象參數,決定調用哪一個對象的方法。例如,如果你有一個figure的類,它定義了一個draw的方法。並且派生了circle和rectangle 類,在派生類中你復蓋了draw方法,你可能還有一個函式,它希望使用一個參數x,並且可以調用$x->draw()。如果你有多態性,調用哪個draw方法就依賴於你傳遞給這個函式的對象類型。
多態性在象PHP這樣的解釋語言(想像一下一個C++編譯器生成這樣的代碼,你應該調用哪一個方法?你也不知道你擁有的對象是什麼類型的,好,這不是重點)是非常容易和自然的。所以PHP當然支持多態性。
用PHP進行面向對象編程
一些"純化論者(purists)"可能會說PHP不是一個真正的面向對象的語言,這是事實。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統的過程化編程。然而,對於大型項目,你可能想/需要在PHP 中使用純的OOP去聲明類,而且在你的項目只用對象和類。
隨著項目越來越大,使用OOP可能會有幫助,OOP代碼很容易維護,容易理解和重用。這些就是軟體工程的基礎。在基於web的項目中套用這些概念就成為將來網站成功的關鍵。
高級OOP技術
在看過基本的OOP概念後,我就可以向你展示更高級的技術:
序列化(Serializing)
PHP不支持永久對象,在OOP中永久對象是可以在多個套用的引用中保持狀態和功能的對象,這意味著擁有將對象保存到一個檔案或資料庫中的能力,而且可以在以後裝入對象。這就是所謂的序列化機制。PHP 擁有序列化方法,它可以通過對象進行調用,序列化方法可以返回對象的字元串表示。然而,序列化只保存了對象的成員數據而不包括方法。
在PHP4中,如果你將對象序列化到字元串$s中,然後釋放對象,接著反序列化對象到$obj,你可以繼續使用對象的方法!我不建議這樣去做,因為(a)文檔中沒有保證這種行為在以後的版本中仍然可以使用。(b) 這個可能導致一種誤解,在你把一個序列化後的版本保存到磁碟並退出腳本時。當以後運行這個腳本時,你不能期待著在反序列化一個對象時,對象的方法也會在那裡,因為字元串表示根本就不包括方法。
總而言之,PHP 進行序列化對於保存對象的成員變數非常有用。(你也可以將相關數組和數組序列化到一個檔案中)。
例子 :
你恢復了成員數據,但是不包括方法(根據文檔所說)。這導致了只能通過類似於使用$obj2->x來存取成員變數(你沒有別的方法!)的唯一辦法,所以不要在家裡試它。
有一些辦法可以解決這個問題,我把它留著,因為對這篇簡潔的文章來說,他們太不好。我會很高興地歡迎在PHP的後續版本中有全序列化的特性。
使用類進行數據存儲PHP和OOP一件非常好的事情就是,你可以很容易地定義一個類來操作某件事情,並且無論何時你想用的時候都可以調用相應的類。假設你有一個HTML表單,用戶可以通過選擇產品ID號來選擇一個產品。在資料庫中有產品的信息,你想把產品顯示出來,顯示它的價格等等。你擁有不同類型的產品,並且同一個動作可能對不同的產品具有不同的意思。例如,顯示一個聲音可能意味著播放它,但是對於其它種類的產品可能意味著顯示一個存在資料庫中的圖片。你可以使用OOP或PHP來減少編碼並提高質量:
定義一個產品的類,定義它應該有的方法(例如:顯示),然後定義對每一種類型的產品的類,從產品類派後出來(SoundItem類,ViewableItem類,等等),復蓋在產品類中的方法,使它們按你的想法動作。
根據資料庫中每一種產品的類型(type)欄位給類命名,一個典型的產品表可能有(id,type,price,description,等等欄位)...然後在處理腳本中,你可以從資料庫中取出type值,然後實例化一個名為type的對象:
這是PHP的一個非常好的特性,你可以不用考慮對象的類型,調用$obj的顯示方法或其它的方法。使用這個技術,你不需要修改腳本去增加一個新類型的對象,只是增加一個處理它的類。
這個功能很強大,只要定義方法,而不去考慮所有對象的類型,在不同的類中按不同的方法實現它們,然後在主腳本中對任意對象使用它們,沒有if...else,也不需要兩個程式設計師,只有高興。
你同意編程是容易的,維護是便宜的,可重用是真的嗎?
如果你管理一組程式設計師,分配工作就是很簡單的了,每個人可能負責一個類型的對象和處理它的類。
可以通過這個技術實現國際化,根據用戶所選的語言欄位套用相應的類就可以了,等等。
拷貝和克隆
當你創建一個$obj的對象時,你可以通過$obj2=$obj來拷貝對象,新的對象是$obj的一個拷貝(不是一個引用),所以它具有$obj在當時的狀態。有時候,你不想這樣,你只是想生成一個象obj類一樣的一個新的對象,可以通過使用new語句來調用類的構造函式。在PHP中也可以通過序列化,和一個基類來實現,但所有的其它類都要從基類派生出來。
進入危險區域
當你序列化一個對象,你會得到某種格式的字元串,如果你感興趣,你可以調究它,其中,字元串中有類的名字(太好了!),你可以把它取出來,象:
所以假設你創建了一個"Universe"的類,並且強制所有的類都必須從universe擴展,你可以在universe 中定義一個clone的方法,如下:
你所得到的是一個新的Something類的對象,它同使用new方法,調用構造函式創建出的對象一樣。我不知道這個對你是否有用,但是Universe類可以知道派生類的名字是一個好的經驗。想像是唯一的限制。
模板引擎
Smarty:Smarty的特點是將模板編譯成PHP腳本,然後執行這些腳本。很快,非常方便。
Heyes Template Class:一個非常容易使用,但功能強大並且快速的模板引擎,它幫助你把頁面布局和設計從代碼中分離。
FastTemplate:一個簡單的變數插值模板類,它分析你的模板,把變數的值從HTML代碼中分離處理。
ShellPage:一個簡單易用的類,可以讓你的整個網站布局基於模板檔案,修改模板就能改變整個站點。
STP Simple Template Parser:一個簡單、輕量級並且易於使用的模板分析類。它可以從多個模板中組裝一個頁面,把結果頁面輸出到瀏覽器或者檔案系統。
OO Template Class:一個你可以用在自己程式中的面向對象的模板類。
SimpleTemplate:一個可以創建和結構化網站的模板引擎。它可以解析和編譯模板。
bTemplate:短小但是快速的模板類,允許你把PHP邏輯代碼從HTML修飾代碼中分離。
Savant:一個強大且輕量級的PEAR兼容模板系統。它是非編譯型的,使用PHP語言本身做為它的模板語言。
ETS - easy template system:可以使用完全相同數據重組模板的模板系統。
EasyTemplatePHP:適用於你的站點的一個簡單但是強大的模板系統。
vlibTemplate:一個快速、全能的模板系統,它包含一個快取和調試類。
AvanTemplate:多位元組安全的模板引擎,占用很少系統資源。它支持變數替換,內容塊可以設定顯示或隱藏
Grafx Software’s Fast Template:一個修改版本的Fast Template系統,它包括快取功能,調試控制台以及沉默去除為賦值塊。
TemplatePower:一個快速、簡單、功能強大的模板類。主要功能有嵌套的動態塊支持,塊/檔案包含支持以及顯示/隱藏未賦值的變數。
TagTemplate:這個庫的功能被設計來使用模板檔案,同時允許你從HTML檔案檢索信息。
htmltmpl: templating engine:一個適用於Python和PHP的模板引擎。它面向希望在項目中分離代碼和設計的web套用開發人員。
PHP Class for Parsing Dreamweaver templates:一個分析Dreamweaver模板的簡單類,被用於Gallery 2 和WordPress的自定義模組中。
MiniTemplator (Template Engine):針對HTML檔案的一個緊湊型模板引擎。對於模板變數和塊定義它具有簡單的語法。其中塊可以嵌套。
Layout Solution:簡化網站開發和維護。它擁有常用的變數和頁面元素使你不需要重複做頁面布局工作。
Cached Fast Template:它已經納入 FastTemplate ,允許你快取模板檔案,甚至可以在分離的塊內容上快取不同的規格。
TinyButStrong:一個支持MySQL,Odbc,Sql-Server和ADODB的模板引擎。它包含7個方法和兩個屬性。
Brian Lozier’s php based template engine:只有2K大小,非常快並且是面向對象設計。
WACT:一個從設計中分離代碼的模板引擎。
PHPTAL:一個PHP下面的XML/XHTML模板庫。
Rong_View_Wudimei:Wudimei開發的國產框架Rong Framework的模板引擎,它類似於smarty,優點是速度快,缺點是模板標籤較少,不過夠用了。
框架介紹thinkphp
ThinkPHP是一個免費開源的,快速、簡單的面向對象的 輕量級PHP開發框架 ,創立於2006年初,遵循Apache2開源協定發布,是為了敏捷WEB套用開發和簡化企業套用開發而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。並且擁有眾多的原創功能和特性,在社區團隊的積極參與下,在易用性、擴展性和性能方面不斷最佳化和改進,已經成長為國內最領先和最具影響力的WEB套用開發框架,眾多的典型案例確保可以穩定用於商業以及門戶級的開發。
PHP認證級別
PHP課程由初級(IFE)、中級(IPE)和高級(IAE)三個部分。
IFE即Index Front-end Engineer的縮寫,指數前端工程師的意思。
IPE即 Index PHP Engineer 的縮寫,意思是指數PHP工程師。
IAE即 Index architecture/advanced engineer 的縮寫,意思是:指數高級/架構工程師。
PHP安全
PHP其實不過是Web伺服器的一個模組功能,所以首先要保證Web伺服器的安全。當然Web伺服器要安全又必須是先保證系統安全,這樣就扯遠了,無窮無盡。常見的web安全漏洞有:注入攻擊,跨站攻擊,伺服器自身漏洞等,對應的詳細解釋,詳見:擴展閱讀中的《WEB安全性-2010_OWASP_TOP10》,這裡有很詳盡的解釋。
PHP的優點學習過程和方法
PHP的語法類似於C,Perl,ASP或者JSP。對於那些對上述之一的語言較熟悉的人來說,PHP太簡單了。相反的,如果你對PHP了解較多,那么你對於其他幾種語言的學習都很簡單了。你只需要很短的時間內將PHP的核心語言特點全部掌握,你可能已經非常了解HTML,甚至你已經知道怎樣用編輯設計軟體或者手工來製作好看的WEB站點。由於PHP代碼能夠無障礙的添加進你的站點,在你設計和維護站點的同時,你可以很輕鬆的加入PHP使得你的站點更加具有動態特性。
資料庫連線
PHP可以編譯成具有與許多資料庫相連線的函式。PHP與MySQL是絕佳的組合,如果再加上Apache伺服器,就是相當完美的了。你還可以自己編寫外圍的函式取間接存取資料庫。通過這樣的途徑當你更換使用的資料庫時,可以輕鬆的更改編碼以適應這樣的變化。PHPLIB就是最常用的可以提供一般事務需要的一系列基庫。
可擴展性
就像前面說的那樣,PHP已經進入了一個高速發展的時期。對於一個非程式設計師來說為PHP擴展附加功能可能會比較難,但是對於一個PHP程式設計師來說並不困難。
PHP可伸縮性
傳統上網頁的互動作用是通過CGI來實現的。CGI程式的伸縮性不很理想,因為它為每一個正在運行的CGI程式開一個獨立進程。解決方法就是將經常用來編寫CGI程式的語
言的解釋器編譯進你的web伺服器(比如mod_perl,JSP)。PHP就可以以這種方式安裝,雖然很少有人願意這樣以CGI方式安裝它。內嵌的PHP可以具有更高的可伸縮性。
PHP免費安裝
PHP原始碼包安裝版:這個版本適合已經有自己獨立的網站域名、網站空間的專業網站建設用戶。使用方法依然其為簡單,只需三步:
第一、到官方網站:下載 PHP原始碼包安裝版最新版本,解壓下載檔案,將其中的全部內容上傳到你的支持PHP的網站空間
第二、改更檔案屬性,請將根目錄下以PHP為後綴名的檔案和”/include/domain.php”和 “/attachments” 和 “/data”資料夾以及資料夾下所有的檔案屬性改成“可讀”、“可寫”、“可執行”,通常是“755”。
第三、打開你的網站根目錄,系統會自動運行setup安裝程式,按提示點下一步操作即可。
友情提示:當你下載我們的軟體並看到這份說明時,則說明你一定是對企業網站建設有一定的需求或者你是一個網站建設技術學習者。
檔案格式
對於只含有 php 代碼的檔案,我們將在檔案結尾處忽略掉 "?>"。這是為了防止多餘的空格或者其它字元影響到代碼。
例如:
$foo = 'foo';
縮進應該能夠反映出代碼的邏輯結果,儘量使用四個空格,禁止使用制表符TAB,因為這樣能夠保證有跨客戶端編程器軟體的靈活性。
例如:
變數賦值建議保持相等間距和排列。
例如:
每行代碼長度應控制在80個字元以內,最長不超過120個字元。因為 linux 讀入檔案一般以80列為單位,就是說如果一行代碼超過80個字元,那么系統將為此付出額外操作指令。這個雖然看起來是小問題,但是對於追求完美的程式設計師來說也是值得注意並遵守的規範。
每行結尾不允許有多餘的空格。
Php檔案記事本編輯亂碼問題
一般情況下,記事本編輯器在對檔案進行完編輯並保存之時,其默認編碼為ANSI,中文。然則更多的時候,php在語言環境設定時語言多數為utf-8,直接保存並用於apache等http-server解析後就會出現亂碼。
為此,應該注意在用記事本編輯完後可將檔案用“另外儲存為”的方式對檔案進行保存,並將“檔案類型”選擇“所有檔案”,編碼與檔案指定語言編碼一致即可。
算數運算符
PHP 的運算符包括算術運算符、賦值運算符、比較運算符和邏輯運算符。
算數運算符:
加,減,乘,除,取模(取余)
+、-、*、/、%
賦值運算符:(以下解釋在許多書中有所不同)
賦值,加賦值,減賦值、乘賦值、除賦值,連字賦值
=、+=、-=、*=、/=、.=
位運算符:
位與、位或、位亦或、位非、左移、右移
&、|、^、~、<<、>>
比較運算符:
等於、全等於、不等於、不全等於、大於、小於、大於等於、小於等於
==、===、!=(<>)、!==、>、<、>=、<=
邏輯運算符:
邏輯與、邏輯或、邏輯非、邏輯亦或
&&、||、!、xor
字元串運算符:
. 連線兩個字元串
常用函式
$_SERVER
$_SERVER是PHP語言中獲取伺服器相關資料的函式,顯示相關函式代碼。
具體函式:
$_SERVER['PHP_SELF'] #當前正在執行腳本的檔案名稱,與 document root相關。
$_SERVER['argv'] #傳遞給該腳本的參數。
$_SERVER['argc'] #包含傳遞給程式的命令行參數的個數(如果運行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #伺服器使用的 CGI 規範的版本。例如,“CGI/1.1”。
$_SERVER['SERVER_NAME'] #當前運行腳本所在伺服器主機的名稱。
$_SERVER['SERVER_SOFTWARE'] #伺服器標識的字串,在回響請求時的頭部中給出。
$_SERVER['SERVER_PROTOCOL'] #請求頁面時通信協定的名稱和版本。例如,“HTTP/1.0”。
$_SERVER['REQUEST_METHOD'] #訪問頁面時的請求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
$_SERVER['QUERY_STRING'] #查詢(query)的字元串。
$_SERVER['DOCUMENT_ROOT'] #當前運行腳本所在的文檔根目錄。在伺服器配置檔案中定義。
$_SERVER['HTTP_ACCEPT'] #當前請求的 Accept: 頭部的內容。
$_SERVER['HTTP_ACCEPT_CHARSET'] #當前請求的 Accept-Charset: 頭部的內容。例如:“iso-8859-1,*,utf-8”。
$_SERVER['HTTP_ACCEPT_Encoding'] #當前請求的 Accept-Encoding: 頭部的內容。例如:“gzip”。
$_SERVER['HTTP_ACCEPT_LANGUAGE']#當前請求的 Accept-Language: 頭部的內容。例如:“en”。
$_SERVER['HTTP_CONNECTION'] #當前請求的 Connection: 頭部的內容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST'] #當前請求的 Host: 頭部的內容。
$_SERVER['HTTP_REFERER'] #連結到當前頁面的前一頁面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] #當前請求的 User_Agent: 頭部的內容。
$_SERVER['REMOTE_ADDR'] #正在瀏覽當前頁面用戶的 IP 地址。
$_SERVER['REMOTE_HOST'] #正在瀏覽當前頁面用戶的主機名。
$_SERVER['REMOTE_PORT'] #用戶連線到伺服器時所使用的連線埠。
$_SERVER['SCRIPT_FILENAME'] #當前執行腳本的絕對路徑名。
$_SERVER['SERVER_ADMIN'] #管理員信息
$_SERVER['SERVER_PORT'] #伺服器所使用的連線埠
$_SERVER['SERVER_SIGNATURE'] #包含伺服器版本和虛擬主機名的字元串。
$_SERVER['PATH_TRANSLATED'] #當前腳本所在檔案系統(不是文檔根目錄)的基本路徑。
$_SERVER['SCRIPT_NAME'] #包含當前腳本的路徑。這在頁面需要指向自己時非常有用。
$_SERVER['REQUEST_URI'] #訪問此頁面所需的 URI。例如,“/index.html”。
$_SERVER['PHP_AUTH_USER'] #當 PHP 運行在 Apache 模組方式下,並且正在使用 HTTP 認證功能,這個變數便是用戶輸入的用戶名。
$_SERVER['PHP_AUTH_PW'] #當 PHP 運行在 Apache 模組方式下,並且正在使用 HTTP 認證功能,這個變數便是用戶輸入的密碼。
$_SERVER['AUTH_TYPE'] #當 PHP 運行在 Apache 模組方式下,並且正在使用 HTTP 認證功能,這個變數便是認證的類型。
$_SERVER['PATH_INFO'] #Contains any client-provided pathname information trailing the actual script filename but preceding the query string, if available. For instance, if the current script was accessed via the URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, then$_SERVER['PATH_INFO'] would contain /some/stuff.
$_SERVER['ORIG_PATH_INFO'] #Original version of 'PATH_INFO' before processed by PHP.
相關技巧:
1.獲取腳本網頁地址二級路徑:
案例如下,腳本網址路徑“http://so.com/so/index.php”,需要“http://so.com/so/”這個地址,而地址是根據不同部落格地址而變化的。其中“so.com”可用“$_SERVER['HTTP_HOST']”生成,但網路上卻沒有相關函式。
查找了php.net,發現一位網友有如下的生成思路:先用“$_SERVER['PHP_SELF']”生成腳本路徑:“/so/index.php”,再用“$scriptname=end(explode('/',$_SERVER['PHP_SELF']));”截取腳本檔案名稱:“index.php”,再用替換函式“$scriptpath=str_replace($scriptname,'',$_SERVER['PHP_SELF']);”獲取二級路徑:“/so/”。
然後使用顯示二級路徑,這樣就解決了缺失函式問題。