原文Oracle:LAMP 體系有了新的競爭,但此版本中的特性使 PHP 再次挑戰極限。 稍微作了修改。:css
概述總結:
1. 內存和性能改進:大型 PHP 應用程序中可節省 20-50% 的內存。經過各類優化使性能提升 10-30%
2. 支持特性Trait
3. 精簡數組語法,能夠定義短數組
4. 函數數組解除引用,支持Array dereferencing,
5. 實例方法調用
6. 閉包綁定
7. 對象即函數
8. 內置 Web 服務器 (CLI)
9. 原生會話處理程序接口
10. JsonSerializable 接口
11. 二進制表示法
12. 改進了錯誤消息
13. 數組到字符串轉換通知
14. 函數類型提示的加強,(Callable typehint)
15. 對時間統計的加強,高精度計時器
16. 上傳進度條Upload progress
17. Zend Signal in PHP 5.4
18. PHP 5.4 由Arnaud 引入了一個對三元式的優化方案.
1)棄用: allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat4二、session.bug_compat_warn 以及 y2k_compliance。
2)再也不支持PHP 中的 break 和continue 後帶變量語法
3)mysqlnd 這一捆綁的 MySQL 原生驅動程序庫如今默認用於與 MySQL 通訊的各類擴展,除非在編譯時經過 ./configure 被顯式覆蓋。html
大約八年前,我爲 Oracle 技術網寫了一篇名爲「您瞭解 PHP 嗎?」的文章。在那篇文章中,我談到了 PHP 執拗的功能優於形式的「Web 問題」解決方法,以及它所具有的讓事情變得簡單的能力。當時,咱們即將發佈 PHP 5.0。如今,時隔將近十年以後咱們推出全新的 PHP 5.4.0 版本,雖然在這期間發生了不少事情,但也有許多事情根本沒變。前端
沒變的一件事情就是生態系統一如以往那樣重要。解決 Web 問題不只僅關乎腳本語言的選擇,它關乎的是周圍的整個生態系統。如今,LAMP 體系已盛行近 15 年,仍廣受歡迎,但咱們開始注意到其餘功能強大的方案。附帶 nginx 的 PHP-FPM 已經快速流行起來,由於從 PHP 5.3 開始大大改進了支持,並在 5.4 中進一步獲得簡化。體系中的 M(即數據庫)部分與 8 年前相比也開始變得極爲不一樣。與將全部內容都只放入 MyISAM 表中相比,各類 NoSQL 解決方案和 MySQL Cluster 提供了一組更豐富的選擇。mysql
出現了多種有趣的技術,於是咱們編寫了 PHP 擴展來輕鬆訪問這些技術。我最喜好的一個擴展是 libevent,能夠用它在 PHP 中編寫事件驅動的高性能應用程序。另外一個是ZeroMQ,這是一個高級套接字庫。與 SQLite 再也不須要編寫另外一種原始文件格式和關聯的分析器極爲類似,ZeroMQ 也無需因任何理由而使用套接字協議和關聯的套接字處理代碼。您甚至能夠組合使用 libevent 和 ZeroMQ,以得到獨立、高性能、事件驅動的卓越服務器。(若是您對此感興趣,請參見此示例。)我還十分喜歡SVM(支持向量機)這一機器學習算法,您沒必要成爲機器學習的愛好者也可提出許多問題。nginx
還有許多擴展在最近幾年內已被普遍接受。特別是,Gearman 變得流行起來,逐漸成爲用戶部署的常見體系的一部分。您能夠經過 Gearman 分派做業,以便由工做器異步完成這些做業。工做器能夠遍及多臺服務器,它們甚至能夠進一步分派更多的 MapReduce 類型做業。web
2004 年發佈 PHP 5.0 以後,接下來在 2005 年推出 5.1,此版本新增了 DateTime 實現、PDO 和性能改進。PHP 5.2 於 2006 年發佈,引入了改進的內存管理器、JSON 支持和輸入篩選。當時,咱們着手推進 PHP 6,這是一個極其宏偉的計劃,徹底重寫有關 ICU(Unicode 國際化組件)庫的全部內容。事實證實這個計劃有些操之過急 — 咱們沒法使足夠多的開發人員爲之興奮,最終只得將準備引入 PHP 6 的各類特性添加到 2009 年發佈的 PHP 5.3 中。5.2 與 5.3 版本時隔 3 年,這也意味着 5.3 向 PHP 新增了大量內容:命名空間、後期靜態綁定、閉包、垃圾收集、受限 goto、mysqlnd(MySQL 原生驅動程序)、更好的 Windows 性能以及許多其餘內容。算法
過後看來,將此版本稱爲 PHP 6 可能有必定的道理,但 PHP 6 等同於在 Unicode 方面所作的努力,以致於爲此編寫了相關書籍,所以咱們認爲若是沒有對 Unicode 作出重大改進,就不能發佈 PHP 6。咱們引入了名爲「intl」的 ICU 擴展,它也針對 PHP 5.2 編譯,這可以讓您訪問更多的 ICU 功能。mbstring 擴展隨時間不斷地改進,這意味着幾乎任何與 Unicode 相關的問題都有解決方案,只是未明確集成到語言自己中。sql
這樣在 2012 年推出 PHP 5.4。並且,與上一版本時隔將近 3 年,咱們在此期間對一些內容進行了改進。我寧願恢復到每一年推出一個版本,每一個版本包含更少的新特性。數據庫
如下是您升級到 5.4 時將看到的主要特性:
許多內部結構已變得更小或徹底消失,從而在大型 PHP 應用程序中可節省 20-50% 的內存。經過各類優化使性能提升 10-30%(主要取決於代碼執行的操做),這些優化包括內聯各類常見代碼路徑、將 $GLOBALS 添加到 JIT、「@」操做符運算更快、添加了運行時類/函數/常量緩存、運行時字符串常量如今被拘留、經過預先計算的散列更快地訪問常量、空數組速度更快並使用更少內存、unserialize() 和 FastCGI 請求處理速度更快,以及在整個代碼中進行更多的內存和性能調整。
例如,早期的一些測試代表,Zend Framework 在 5.4 中運行速度提升 21% 而且內存使用減小 23%,而 Drupal 內存使用減小 50% 而且運行速度大約提升 7%。
Trait 多是 PHP 5.4 中談論最多的特性 — 將它們視爲編譯器輔助的複製粘貼。Trait 也是 Scala 的一個特性。其餘語言可能將它們稱爲「mixin」— 或者這些語言根本不對它們進行命名,但具備擴展接口機制,容許接口包含其方法的實際實現。
與 mixin 相反,PHP 中的 trait 包括顯式衝突解決機制,用於多個 trait 實現相同方法的狀況。
請參見 php.net/traits 瞭解更多示例,包括衝突解決語法、方法優先順序、可見性以及對 trait 中常量和屬性的支持。此外,要詳細瞭解概念理論,您能夠閱讀 Nathan Schärli 的論文「Trait:行爲構建塊中的組合類」。
新增的一種簡單但很是流行的語法:
就是說,您如今再也不須要使用「array」關鍵字來定義數組。
1)新增的另外一種經常使用語法。返回數組的函數調用如今能夠直接解除引用:
2)有了Array dereferencing, 之前的這種寫法就不再必要了:
與函數數組解除引用相關,您如今能夠調用對象實例化方法。與早期版本同樣,您固然仍能夠連接方法調用,所以您如今能夠編寫以下代碼:
然而,因爲可能丟棄實例化的對象,所以,除非您的構造函數執行有用操做,不然您應該在此改用靜態方法調用。若是將它與精簡數組語法和函數數組解除引用結合使用,咱們能夠編寫某些十分複雜的代碼:
看一眼以後,您能夠判定輸出是什麼嗎?在此,咱們將二維數組傳遞到僅返回數組的構造函數。而後,咱們選出第二個維度的第一個元素,所以這將輸出「4」。
閉包是在 PHP 5.3 中引入的,但在 5.4 中咱們改進了閉包與對象的交互方式。例如:
注意閉包訪問 $this->prop 這一私有屬性。默認狀況下,PHP 中的閉包使用預綁定 — 這意味着閉包內的變量具備定義閉包時所具備的值。可使用引用將其轉換爲後綁定。可是,也能夠從新綁定閉包:
在此,咱們將閉包從 $a 實例從新綁定到 $b 中的實例。若是您不但願閉包隨時訪問對象實例,能夠將閉包聲明爲靜態:
有一種新的神奇方法,名爲「__invoke」,其用法以下:
CLI 服務器是一種小型 Web 服務器實現,能夠從命令行運行:
CLI 服務器不適合用做生產 Web 服務器;咱們將使用它運行一些 PHP 迴歸測試,其餘單元測試機制也可以使用它,而且 IDE 也可能使用它。它確實具備一些頗有用的特性,用於從命令行進行平常代碼調試。默認狀況下,它使用當前目錄做爲 DocumentRoot;它也處理靜態文件請求。默認目錄索引文件爲「index.php」,所以您能夠在滿含 .php、.css、.jpg 等文件的目錄中激活它,它本身就能夠運行。對於可能使用 mod_rewrite 將全部請求發送到前端控制器或路由器的更復雜應用程序,您能夠將此路由器與一個簡單的小腳本包裝在一塊兒,並啓動 CLI 服務器,以下所示:
router.php 腳本可能以下所示:
此包裝器加載直接 .php 請求,將包含「.」的任何其餘請求傳遞到靜態文件處理程序,其餘全部內容都傳遞到框架的路由器。您能夠如此直接從命令行運行 Drupal 和 Symphony。
這是一個小而方便的特性,如今能夠用它實現會話處理程序接口。如今,您能夠僅將會話處理對象的實例傳遞給 session_set_save_handler(),而沒必要傳遞給它六個比較麻煩的函數:
如今,您能夠經過實現 JsonSerializable 接口來控制有人嘗試使用 json_encode() 對您的對象進行編碼時所發生的狀況:
爲了與 PHP 的原生十六進制和八進制支持協調一致,如今也支持二進制表示法:採用「0b」前綴標識二進制數
$mask = 0b010101;
錯誤消息稍有改進。
改進前:
改進後:
改進可能不十分明顯,但區別是如今已在錯誤消息中顯示偏移標記「foo」的值。
若是您一直使用 PHP,則可能以隨機出如今頁面中「Array」一詞結束編程,由於您嘗試直接輸出數組。每當將數組直接轉換爲字符串時,都頗有可能出現錯誤,如今有了一個針對這一狀況的通知:
注意:數組到字符串轉換在 example.php onlLine 2 中
14. 函數類型提示的加強,(Callable typehint)
因爲php是弱類型的語言,所以在php 5.0後,引入了函數類型提示的功能,支持對象和數組,其含義爲對於傳入函數中的參數都進行類型檢查,舉個例子,有以下的類:
這次引入了$_SERVER['REQUEST_TIME_FLOAT']數組變量,微秒級精度(百萬分之一秒,float類型)。對於統計腳本運行時間會很是有用:
echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2)
16. 上傳進度條Upload progress
文件上傳進度反饋, 這個需求在當前是愈來愈廣泛, 好比大附件郵件. 在PHP5.4之前, 咱們能夠經過APC提供的功能來實現. 或者使用PECL擴展uploadprogress來實現.
雖說, 它們能很好的解決如今的問題, 可是也有很明顯的不足:
從PHP的角度來講, 最好的儲存這些信息的地方應該是SESSION, 首先它是PHP原生支持的機制. 其次, 它能夠被配置到存放到任何地方(支持多機共享).
正由於此, Arnaud Le Blanc提出了針對Session報告上傳進度的RFC, 而且如今實現也已經包含在了PHP5.4的主幹中。
經過$_SESSION["upload_progress_name"]就能夠得到當前文件上傳的進度信息,結合Ajax就能很容易實現上傳進度條了。
在PHP5.4中, 根據由Rasmus提交的RFC, 引入了一套新的信號處理機制, 目的是爲了使得信號屏蔽機制能夠應用到任何SAPI中, 而且提升在這個過程當中的PHP性能.
新的機制, 叫作zend signal, 它的理念, 來自Yahoo的」延遲信號處理」(Yahoo signal deferring mechanism), 然後, facebook把這套理念加入了PHP中, 爲了提高PHP+Apache 1.X下PHP調用ap_block/ap_unblock的性能.
18. PHP 5.4 由Arnaud 引入了一個對三元式的優化方案.
咱們都知道PHP用寫時複製來對變量複製作性能優化, 而在之前的三元式中, 卻每次都會複製, 這在操做數是大數組的狀況下, 會形成性能問題:
1)最後,咱們集中整理了幾年來標記爲已棄用的多個特性。這些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat4二、session.bug_compat_warn 以及 y2k_compliance。
2) 備受指責的 Register Globals 已從 PHP 中徹底刪除。十年來,該特性一直以其頻繁發生的安全漏洞而著稱。2002年該特性被設置爲默認關閉。2009年發佈的 PHP5.3 將該特性標記爲「棄用」,想必從那時起,大部分開發人員已經再也不使用它。
3)除了這些特性以外,magic_quotes 多是最大的危險。在早期版本中,未考慮因 magic_quotes 出錯致使的後果,簡單編寫且未採起任何舉措使自身免受 SQL 注入攻擊的應用程序都經過 magic_quotes 來保護。若是在升級到 PHP 5.4 時未驗證已採起正確的 SQLi 保護措施,則可能致使安全漏洞。
4)PHP 中的 break 和continue 語句以後能夠跟上一個參數用來指明跳出的循環層數。若是不指定參數,它會像 VB、C#或 Java 同樣跳出最內層的循環。在 PHP 5.4 以前,開發人員能夠向 break 語句傳遞一個變量,而如今只能傳遞常量。
5)PHP 容許參數按引用傳遞。在早期版本中,你能夠經過爲調用點添加修飾來指明變量按引用傳遞。在 PHP 5.4 中,該選項已被移除。相反,現代 PHP 編程只須要在函數聲明時指定按引用傳遞便可。與 C# 不一樣,你不須要同時在聲明和調用點指定按引用傳遞。
有一種新的「可調用的」類型提示,用於某方法採用回調做爲參數的狀況。
htmlspecialchars() 和 htmlentities() 如今可更好地支持亞洲字符,若是未在 php.ini 文件中顯式設置 PHP default_charset,這兩個函數默認使用 UTF-8 而不是 ISO-8859-1。
<?=(精簡回顯語法)如今始終可用,不管 short_tags ini 設置的值爲什麼。這應該使模板化系統建立者感到滿意。
會話 ID 如今默認經過 /dev/urandom(或等效文件)中的熵生成,而不是與早期版本同樣成爲必須顯式啓用的一個選項。
mysqlnd 這一捆綁的 MySQL 原生驅動程序庫如今默認用於與 MySQL 通訊的各類擴展,除非在編譯時經過 ./configure 被顯式覆蓋。
可能還有 100 個小的改動和特性。從 PHP 5.3 升級到 5.4 應該極爲順暢,但請閱讀遷移指南加以確保。若是您從早期版本升級,執行的操做可能稍多一些。請查看之前的遷移指南再開始升級。
咱們沒有對 PHP 進行長期規劃。PHP 將隨 Web 一塊兒發展。咱們不知道 5-10 年內的重要 Web 趨勢和技術將是什麼,但知道經過咱們的不斷付出,PHP 必將存在。
短時間內,咱們經過「internals」郵件列表討論 PHP 開發,而且就大特性達成共識時,它將發展爲 RFC。您能夠在wiki.php.net/rfc 中找到 RFC。一旦咱們表決贊成發佈一組極佳的新特性,而且對這些特性進行了正確實現和測試,咱們便開始籌備推出新版本。
PHP 隨 Web 發展並保持穩定的市場份額,在全球全部網站中,大約三分之一的網站都使用它。其中不只包括一些最大的網站,並且還包括很大一部分最小的網站。我是在最小網站上單獨設置 PHP 的:擴展是天然而然的事情,甚至是預期的特徵,也是強烈吸引工程師的特徵,但縮減不太正常,而且在某些狀況下更困難。若是您找到適當的平衡,而且能夠將同一代碼庫用於宿舍出租乃至擁有數十億美圓資產的公司,那麼您就真正掌握了這種語言。
PHP 5.4版本將是最後一個支持Windows XP 和 Windows 2003的版本,從此將再也不提供針對這些操做系統的二進制包。