天天看點

php版本曆史PHP版本曆史php最近幾個版本的功能描述

php最初就是為了快速建構一個web頁面而迅速被大家廣為接受的。它的好處是在代碼中能内嵌html的代碼,進而讓程式員能再一個頁面中同時寫html代碼和php代碼就能生成一個web頁面。

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

php1.0誕生

rasmus lerdof發明了php,這是簡單的一套perl腳本,用來跟蹤通路者的資訊。這個時候的php隻是一個小工具而已,它的名字叫做“personal home page tool”(個人首頁小工具)。

php2.0誕生

rasmus lerdof用c語言來重新開發這個工具,取代了最初的perl程式。這個新的用c寫的工具最大的特色就是可以通路資料庫,可以讓使用者簡單地開發動态web程式了。這個用c寫的工具又稱為php/fi。它已經有了今天php的一些基本功能了。

自rasmus在1995年6月将php/fi釋出源碼之後,到1997年,全世界大約有幾千個使用者(估計)和大約50000個域名安裝。

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的基礎結構之外,還吸引了大量的開發人員加入并送出新的子產品。

php4.0釋出

andi gutmans和zeev suranski在4.0做的最大的動作就是重寫了php的代碼,發明了zend引擎來增強程式運作時的性能和php的子產品性。這個zend實際上就是andi和zeev名字縮寫的合稱。

使用了zend引擎,php獲得了更高的性能之外,也有其他一些關鍵的功能,包括支援更多的web伺服器;http session的支援;輸出緩沖等。

php5.0釋出

php5.0的核心是zend引擎2代。它引入了新的對象模型和大量的新功能。比如引入了pdo(php data object)

以zend引擎作為解析器

加入超全局變量功能,包括get,get,_post,$_session等

從網絡接收的資料将不會設定成全局變量,增加程式的安全性。

加入指令檔,成為cli

加入phpize和php-config的man頁面

使用了zend 2 引擎。

增加了新關鍵字,包括this,try,catch,public,private,protected等

strrpos() 和 strripos() 如今使用整個字元串作為 needle。

非法使用字元串偏移量會導緻 e_error 而不是 e_warning。一個非法使用的例子:str=′abc′;unset(str=′abc′;unset(str[0]);.

array_merge() 被改成隻接受數組。如果傳遞入非數組變量,對每個此類參數都會發出一條 e_warning 資訊。要小心因為你的代碼有可能瘋狂發出 e_warning。

如果 variables_order 包括“s”,server應該帶有argc和argv被産生。如果使用者特别配制系統不建立server應該帶有argc和argv被産生。如果使用者特别配制系統不建立_server,那此變量當然就不存在了。改變的地方是不管 variables_order 怎麼設定,在 cli 版本中 argc 和 argv 總是可用的。本來 cli 版不是總會産生全局變量 argc和argc和argv 的。

沒有屬性的對象不再被當成“empty”。

get_class(),get_parent_class() 和 get_class_methods() 如今傳回的類/方法名和定義時的名字一緻(區分大小寫),對于依賴以前行為(類/方法名總是傳回小寫的)的老腳本可能産生問題。一個可能的解決方法是在腳本中搜尋所有這些函數并使用 strtolower()。 區分大小寫的改變也适用于魔術常量 class,method 和 function。其值都會嚴格按照定義時的名字傳回(區分大小寫)。

ip2long() 在傳遞入一個非法 ip 作為參數時傳回 false,不再是 -1。

如果有函數定義在包含檔案中,則這些函數可以在主檔案中使用而與是否在 return 指令之前還是之後無關。如果檔案被包含兩次,php 5 會發出緻命錯誤,因為函數已經被定義,而 php 4 不管這個。是以推薦使用 include_once 而不要去檢查檔案是否已被包含以及在包含檔案中有條件傳回。

include_once 和 require_once 在 windows 下先将路徑規格化,是以包含 a.php 和 a.php 隻會把檔案包含一次。

重寫了資料處理部分的代碼

pdo擴充預設啟動

性能優化

超過30個新函數

超過400個bug修複

cli sapi不再從php.ini和php-cli.ini中擷取目前目錄資訊。這是從安全角度考慮的。

對0取模的時候會提示warning資訊。

對象可以通過__tostring()函數被當做字元串調用。

禁止設定抽象類的靜态方法

改動:

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() 現在支援郵件發送日志. (注意: 僅支援通過該函數發送的郵件.)

不再支援 安全模式 。任何依賴安全模式的應用在安全方面都需要進行調整。

移除 魔術引号 。為避免出現安全問題,依賴此特性的應用可能需要更新。 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[′foo′]此處a 是一個字元串,現在使用 isset() 時傳回 false,使用 empty() 時傳回 true,并産生一條 e_warning 錯誤。偏移量類型是布爾和 null 則産生一條 e_notice 錯誤。 數字字元串(比如 $a['2'] )仍像以前一樣運作。注意像類似 '12.3' 和 '5 foobar' 這樣的偏移量将被視為非數字并産生一條 e_warning 錯誤,但因為向後相容的原因它們會被分别轉換成 12 和 5 。 注意:下列代碼傳回不同的結果。 str=′abc′;vardump(isset(str=′abc′;vardump(isset(str['x'])); // 在 php 5.4 或更新版本傳回 false,但在 php 5.3 或更低版本傳回 true

數組轉換成字元串将産生一條 e_notice 級别的錯誤,但傳回的結果仍是字元串 "array" 。

null 、false 、或 一個空字元串被添加成一個對象的屬性時将發出一條 e_warning 級别的錯誤,而不是 e_strict 。

現在參數名使用全局變量将會導緻一個緻命錯誤。禁止類似 function foo(get,get,_post) {} 這樣的代碼。

salsa10 和 salsa20 雜湊演算法 被移除。

當使用兩個空數組作為參數時, array_combine() 現在傳回 array() 而不是 false 。

htmlentities() 将像 htmlspecialchars() 一樣處理亞洲字元集,這是以前 php 版本的處理情況,但現在将會發出一條 e_strict 錯誤。

強烈建議不要再使用 eregi() ,此特性在最新版本中被移除。

trait,callable,insteadof關鍵詞被保留。

新特性:

新增支援 traits 。

新增短數組文法,比如 a=[1,2,3,4];或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 。

已放棄對 windows xp 和 2003 的支援。建構 windows 版本的 php 需要 windows vista 或更新的系統。

pack() 和 unpack() 函數的變化

移除 php logo guids

新增 generators,包括yield關鍵字

新增 finally 關鍵字

foreach 現在支援 list()

empty() 現在支援傳入一個任意表達式,而不僅是一個變量。

非變量array和string也能支援下标擷取了

類名通過::class可以擷取

增加了opcache擴充