php版本歷史


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。
  • 非法使用字符串偏移量會導致 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 的歷史


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM