php版本曆史
來源:互聯網
上載者:User
php最初就是為了快速構建一個web頁面而迅速被大家廣為接受的。它的好處是在代碼中能內嵌html的代碼,從而讓程式員能再一個頁面中同時寫html代碼和php代碼就能產生一個web頁面。 這篇文章用時間軸的角度來記錄一下php的曆史。 PHP版本曆史1995年初 PHP1.0誕生 Rasmus Lerdof發明了PHP,這是簡單的一套Perl指令碼,用來跟蹤訪問者的資訊。這個時候的PHP只是一個小工具而已,它的名字叫做“Personal Home Page Tool”(個人首頁小工具)。 1995年6月 PHP2.0誕生 Rasmus Lerdof用C語言來重新開發這個工具,取代了最初的Perl程式。這個新的用C寫的工具最大的特色就是可以訪問資料庫,可以讓使用者簡單地開發動態Web程式了。這個用C寫的工具又稱為PHP/FI。它已經有了今天php的一些準系統了。 自Rasmus在1995年6月將PHP/FI發布源碼之後,到1997年,全世界大約有幾千個使用者(估計)和大約50000個網域名稱安裝。 1998年6月 PHP3.0誕生 雖然說98年6月才正式發布php3.0,但是在正式發布之前,已經經過了9個月的公開測試了。 Andi Gutmans和Zeev Suraski加入了PHP開發項目組。這是兩個以色列工程師,他們在使用PHP/FI的時候發現了PHP的一些缺點,然後決定重寫PHP的解析器。注意,在這個時候,PHP就不再稱為Personal Home Page了。而改稱為PHP:Hypertext Preprocessor。 PHP3是最像現在使用的php的第一個版本,這個重寫的解譯器也是後來Zend的雛形。PHP3.0的最強大的功能就是它的可擴充性。它提供給第三方開發人員資料庫,協議,和API的基礎結構之外,還吸引了大量的開發人員加入並提交新的模組。 2000年5月 PHP4.0發布 Andi Gutmans和Zeev Suranski在4.0做的最大的動作就是重寫了PHP的代碼,發明了Zend引擎來增強程式運行時的效能和PHP的模組性。這個Zend實際上就是Andi和Zeev名字縮寫的合稱。 使用了Zend引擎,PHP獲得了更高的效能之外,也有其他一些關鍵的功能,包括支援更多的web伺服器;HTTP Session的支援;輸出緩衝等。 2004年7月 PHP5.0發布 PHP5.0的核心是Zend引擎2代。它引入了新的物件模型和大量的新功能。比如引入了PDO(PHP Data Object) 現在(2014年2月) 最新的PHP 已經發布到5.6了,據說PHP6.0已經在開發過程中了。所有php的曆史代碼可以在PHP 博物館找到。 php最近幾個版本的功能描述php4.0 以Zend引擎作為解析器 php4.1 加入超全域變數功能,包括$GET,$POST,$_SESSION等 php4.2 從網路接收的資料將不會設定成全域變數,增加程式的安全性。 php4.3 加入命令檔,成為CLI php4.4 加入phpize和php-config的man頁面 php5.0 使用了Zend 2 引擎。增加了新關鍵字,包括this,try,catch,public,private,protected等strrpos() 和 strripos() 如今使用整個字串作為 needle。非法使用字串位移量會導致 EERROR 而不是 EWARNING。一個非法使用的例子:str=′abc′;unset(str[0]);.arraymerge() 被改成只接受數組。如果傳遞入非陣列變數,對每個此類參數都會發出一條 EWARNING 資訊。要小心因為你的代碼有可能瘋狂發出 E_WARNING。如果 variablesorder 包括“S”,$SERVER 應該帶有 argc 和 argv 被產生。如果使用者特別配製系統不建立 $SERVER,那此變數當然就不存在了。改變的地方是不管 variablesorder 怎麼設定,在 CLI 版本中 argc 和 argv 總是可用的。本來 CLI 版不是總會產生全域變數 argc和argv 的。沒有屬性的對象不再被當成“empty”。getclass(),getparentclass() 和 getclass_methods() 如今返回的類/方法名和定義時的名字一致(區分大小寫),對於依賴以前行為(類/方法名總是返回小寫)的老指令碼可能產生問題。一個可能的解決方案是在指令碼中搜尋所有這些函數並使用 strtolower()。 區分大小寫改變也適用於魔術常量 CLASS,METHOD 和 FUNCTION。其值都會嚴格按照定義時的名字返回(區分大小寫)。ip2long() 在傳遞入一個非法 IP 作為參數時返回 FALSE,不再是 -1。如果有函數定義在包含檔案中,則這些函數可以在主檔案中使用而與是否在 return 指令之前還是之後無關。如果檔案被包含兩次,PHP 5 會發出致命錯誤,因為函數已經被定義,而 PHP 4 不管這個。因此推薦使用 include_once 而不要去檢查檔案是否已被包含以及在包含檔案中有條件返回。includeonce 和 requireonce 在 Windows 下先將路徑規格化,因此包含 A.php 和 a.php 只會把檔案包含一次。更多參考資料php5的新特性 php 5.1 重寫了資料處理部分的代碼PDO擴充預設啟動效能最佳化超過30個新函數超過400個bug修複php5.2 CLI SAPI不再從php.ini和php-cli.ini中擷取目前的目錄資訊。這是從安全形度考慮的。對0模數的時候會提示Warning資訊。對象可以通過__toString()函數被當做字串調用。禁止設定抽象類別的靜態方法增加RFC(data:stream)的支援。更多參考資料從5.1遷移到5.2 php5.3 改動: realpath() 現在是完全與平台無關的. 結果是非法的相對路徑比如 FILE . "/../x" 將不會工作.calluserfunc() 系列函數即使被調用者是一個父類也使用 $this.數組函數 natsort(), natcasesort(), usort(), uasort(), uksort(), arrayflip(), 和 arrayunique() 將不再接受對象作為參數. 在將這些函數應用於對象時, 請首先將對象轉換為數組.按引用傳遞參數的函數在被按值傳遞調用時行為發生改變. 此前函數將接受按值傳遞的參數, 現在將拋出致命錯誤. 之前任何期待傳遞引用但是在調用時傳遞了常量或者字面值 的函數, 需要在調用前改為將該值賦給一個變數。__toString 魔術方法不再接受參數.魔術方法 _get, _set, _isset, _unset, and __call 應該總是公用的(public)且不能是靜態(static). 方法簽名是必須的.現在 __call 魔術方法在訪問私人的(private)和被保護的(protected)方法時被調用.函數內 include 或者 require 一個檔案時,檔案內 將不能使用 funcgetarg(), funcgetargs() 和 funcnumargs() 函數。goto,namespace關鍵詞被保留。新功能: 添加了命名空間的支援.添加了靜態晚綁定支援.增加了goto支援。增加了閉包支援。新增了兩個魔術方法, _callStatic 和 _invoke.添加了 Nowdoc 文法支援, 類似於 Heredoc 文法, 但是包含單引號.就是<<'EOF'這樣的文法。可使用雙引號聲明 Heredoc, 補充了 Nowdoc 文法.可在類外部使用 const 關鍵詞聲明 常量.三元運算操作符有了簡寫形式: ?:.HTTP 流包裹器將從 200 到 399 全部的狀態代碼都視為成功。允許動態訪問靜態方法。異常可以被內嵌新增了循環參考的記憶體回收行程並且預設是開啟的.mail() 現在支援郵件發送日誌. (注意: 僅支援通過該函數發送的郵件.)更多參考資料從5.2遷移到5.3 php5.4 改動: 不再支援 安全模式 。任何依賴安全模式的應用在安全方面都需要進行調整。移除 魔術引號 。為避免出現安全問題,依賴此特性的應用可能需要升級。 getmagicquotesgpc() 和 getmagicquotesruntime() 現在總是返回 FALSE 。 調用 setmagicquotesruntime() 將產生一個 ECORE_ERROR 層級的錯誤。registerglobals 和 registerlong_arrays php.ini 指令被移除。調用時的引用傳遞 被移除。就是不能有f(&$a)這樣的形式。break 和 continue 語句不再接受可變參數( 比如: break 1 + foo() * $bar; )。像類似 break 2; 這樣的固定參數仍可使用。受此變化影響,不再允許出現 break 0; 和 continue 0; 。在 日期與時間擴充 中,不再支援時區使用 TZ(TimeZone)環境變數設定。必須使用 date.timezone php.ini 配置選項或 datedefaulttimezoneset() 函數來指定時區。PHP 將不再嘗試猜測時區,而是回退到“UTC”並發出一條 EWARNING 錯誤。非數位字串位移量,比如 a[′foo′]此處a 是一個字串,現在使用 isset() 時返回 false,使用 empty() 時返回 true,併產生一條 EWARNING 錯誤。位移量類型是布爾和 null 則產生一條 ENOTICE 錯誤。 數字字串(比如 $a['2'] )仍像以前一樣運行。注意像類似 '12.3' 和 '5 foobar' 這樣的位移量將被視為非數字併產生一條 EWARNING 錯誤,但因為向後相容的原因它們會被分別轉換成 12 和 5 。 注意:下列代碼返回不同的結果。 $str='abc';vardump(isset($str['x'])); // 在 PHP 5.4 或更新版本返回 false,但在 PHP 5.3 或更低版本返回 true數群組轉換成字串將產生一條 E_NOTICE 層級的錯誤,但返回的結果仍是字串 "Array" 。NULL 、FALSE 、或 一個Null 字元串被添加成一個對象的屬性時將發出一條 EWARNING 層級的錯誤,而不是 ESTRICT 。現在參數名使用全域變數將會導致一個致命錯誤。禁止類似 function foo($GET, $POST) {} 這樣的代碼。Salsa10 和 Salsa20 雜湊演算法 被移除。當使用兩個空數組作為參數時, array_combine() 現在返回 array() 而不是 FALSE 。htmlentities() 將像 htmlspecialchars() 一樣處理亞洲字元集,這是以前 PHP 版本的處理情況,但現在將會發出一條 E_STRICT 錯誤。強烈建議不要再使用 eregi() ,此特性在最新版本中被移除。trait,callable,insteadof關鍵詞被保留。新特性: 新增支援 traits 。新增短數組文法,比如 a=[1,2,3,4];或a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; 。新增支援對函數返回數組的成員訪問解析,例如 foo()[0] 。現在 閉包 支援 $this 。現在不管是否設定 shortopentag php.ini 選項,新增在執行個體化時訪問類成員,例如: (new Foo)->bar() 。現在支援 Class::{expr}() 文法。新增二進位直接量,例如:0b001001101改進解析錯誤資訊和不相容參數的警告。SESSION 擴充現在能追蹤檔案的 上傳進度 。內建用於開發的 CLI 模式的 web server 。更多參考資料從5.3遷移到5.4 php5.5 改動: 已放棄對 Windows XP 和 2003 的支援。構建 Windows 版本的 PHP 需要 Windows Vista 或更新的系統。pack() 和 unpack() 函數的變化移除 PHP logo GUIDs新特性: 新增 Generators,包括yield關鍵字新增 finally 關鍵字foreach 現在支援 list()empty() 現在支援傳入一個任意運算式,而不僅是一個變數。非變數array和string也能支援下標擷取了類名通過::class可以擷取增加了opcache擴充