php版本歷史

php最初就是爲了快速構建一個web頁面而迅速被你們廣爲接受的。它的好處是在代碼中能內嵌html的代碼,從而讓程序員能再一個頁面中同時寫html代碼和php代碼就能生成一個web頁面。php

這篇文章用時間軸的角度來記錄一下php的歷史。html

PHP版本歷史

1995年初

PHP1.0誕生程序員

Rasmus Lerdof發明了PHP,這是簡單的一套Perl腳本,用來跟蹤訪問者的信息。這個時候的PHP只是一個小工具而已,它的名字叫作「Personal Home Page Tool」(我的主頁小工具)。web

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。
  • 非法使用字符串偏移量會致使 E_ERROR 而不是 E_WARNING。一個非法使用的例子:\(str = 'abc'; unset(\)str[0]);.
  • array_merge() 被改爲只接受數組。若是傳遞入非數組變量,對每一個此類參數都會發出一條 E_WARNING 信息。要當心由於你的代碼有可能瘋狂發出 E_WARNING。
  • 若是 variables_order 包括「S」,$_SERVER 應該帶有 argc 和 argv 被產生。若是用戶特別配製系統不建立 $_SERVER,那此變量固然就不存在了。改變的地方是無論 variables_order 怎麼設定,在 CLI 版本中 argc 和 argv 老是可用的。原本 CLI 版不是總會產生全局變量 $argc 和 $argv 的。
  • 沒有屬性的對象再也不被當成「empty」。
  • get_class(),get_parent_class() 和 get_class_methods() 現在返回的類/方法名和定義時的名字一致(區分大小寫),對於依賴之前行爲(類/方法名老是返回小寫的)的老腳本可能產生問題。一個可能的解決方法是在腳本中搜索全部這些函數並使用 strtolower()。 區分大小寫的改變也適用於魔術常量 CLASSMETHODFUNCTION。其值都會嚴格按照定義時的名字返回(區分大小寫)。
  • ip2long() 在傳遞入一個非法 IP 做爲參數時返回 FALSE,再也不是 -1。
  • 若是有函數定義在包含文件中,則這些函數能夠在主文件中使用而與是否在 return 指令以前仍是以後無關。若是文件被包含兩次,PHP 5 會發出致命錯誤,由於函數已經被定義,而 PHP 4 無論這個。所以推薦使用 include_once 而不要去檢查文件是否已被包含以及在包含文件中有條件返回。
  • include_once 和 require_once 在 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" 將不會工做.
  • call_user_func() 系列函數即便被調用者是一個父類也使用 $this.
  • 數組函數 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 將再也不接受對象做爲參數. 在將這些函數應用於對象時, 請首先將對象轉換爲數組.
  • 按引用傳遞參數的函數在被按值傳遞調用時行爲發生改變. 此前函數將接受按值傳遞的參數, 如今將拋出致命錯誤. 以前任何期待傳遞引用可是在調用時傳遞了常量或者字面值 的函數, 須要在調用前改成將該值賦給一個變量。
  • __toString 魔術方法再也不接受參數.
  • 魔術方法 __get, __set, __isset, __unset, and __call 應該老是公共的(public)且不能是靜態的(static). 方法簽名是必須的.
  • 如今 __call 魔術方法在訪問私有的(private)和被保護的(protected)方法時被調用.
  • 函數內 include 或者 require 一個文件時,文件內 將不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函數。
  • goto,namespace關鍵詞被保留。

新功能:

  • 添加了命名空間的支持.
  • 添加了靜態晚綁定支持.
  • 增長了goto支持。
  • 增長了閉包支持。
  • 新增了兩個魔術方法, __callStatic 和 __invoke.
  • 添加了 Nowdoc 語法支持, 相似於 Heredoc 語法, 可是包含單引號.就是<<'EOF'這樣的語法。
  • 可以使用雙引號聲明 Heredoc, 補充了 Nowdoc 語法.
  • 可在類外部使用 const 關鍵詞聲明 常量.
  • 三元運算操做符有了簡寫形式: ?:.
  • HTTP 流包裹器將從 200 到 399 所有的狀態碼都視爲成功。
  • 容許動態訪問靜態方法。
  • 異常能夠被內嵌
  • 新增了循環引用的垃圾回收器而且默認是開啓的.
  • mail() 如今支持郵件發送日誌. (注意: 僅支持經過該函數發送的郵件.)

更多參考資料從5.2遷移到5.3

php5.4

改動:

  • 再也不支持 安全模式 。任何依賴安全模式的應用在安全方面都須要進行調整。
  • 移除 魔術引號 。爲避免出現安全問題,依賴此特性的應用可能須要升級。 get_magic_quotes_gpc() 和 get_magic_quotes_runtime() 如今老是返回 FALSE 。 調用 set_magic_quotes_runtime() 將產生一個 E_CORE_ERROR 級別的錯誤。
  • register_globals 和 register_long_arrays php.ini 指令被移除。
  • 調用時的引用傳遞 被移除。就是不能有f(&$a)這樣的形式。
  • break 和 continue 語句再也不接受可變參數( 好比: break 1 + foo() * $bar; )。像相似 break 2; 這樣的固定參數仍可以使用。受此變化影響,再也不容許出現 break 0; 和 continue 0; 。
  • 在 日期與時間擴展 中,再也不支持時區使用 TZ(TimeZone)環境變量設置。必須使用 date.timezone php.ini 配置選項或 date_default_timezone_set() 函數來指定時區。PHP 將再也不嘗試猜想時區,而是回退到「UTC」併發出一條 E_WARNING 錯誤。
  • 非數字的字符串偏移量,好比 $a['foo'] 此處 $a 是一個字符串,如今使用 isset() 時返回 false,使用 empty() 時返回 true,併產生一條 E_WARNING 錯誤。偏移量類型是布爾和 null 則產生一條 E_NOTICE 錯誤。 數字字符串(好比 $a['2'] )仍像之前同樣運行。注意像相似 '12.3' 和 '5 foobar' 這樣的偏移量將被視爲非數字併產生一條 E_WARNING 錯誤,但由於向後兼容的緣由它們會被分別轉換成 12 和 5 。 注意:下列代碼返回不一樣的結果。 \(str='abc';var_dump(isset(\)str['x'])); // 在 PHP 5.4 或更新版本返回 false,但在 PHP 5.3 或更低版本返回 true
  • 數組轉換成字符串將產生一條 E_NOTICE 級別的錯誤,但返回的結果還是字符串 "Array" 。
  • NULL 、FALSE 、或 一個空字符串被添加成一個對象的屬性時將發出一條 E_WARNING 級別的錯誤,而不是 E_STRICT 。
  • 如今參數名使用全局變量將會致使一個致命錯誤。禁止相似 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 。
  • 如今不論是否設置 short_open_tag 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擴展

更多參考資料從5.4遷移到5.5

參考文章

PHP 的歷史

相關文章
相關標籤/搜索