文章轉自PHP5研究室,作者:John Mertic
------------------
“PHP V5.3 中的新特性” 系列文章將持續(xù)介紹該發(fā)行版提供的令人興奮的新特性。第 1 部分 介紹了 PHP 5.3 中對面向對象編程及對象處理所做的更改,第 2 部分 介紹了閉包函數及 lambda 函數。第 3 部分 探討了名稱空間,這是該 PHP 版本中最令人期待也是最具爭議的特性之一。在 第 4 部分中,我們進一步研究了 Phar,這是一種用于 PHP 的歸檔格式。在本系列的最后一部分中,了解從 PHP V5.2 升級到 PHP V5.3 時要考慮的一些事情。PHP V5.3 中的一些變化破壞了向后兼容性,有些特性在 PHP V5.3 中不受支持,在將來的版本中將被取消。本文還介紹 PHP V5.3 對 PHP 中一些已有特性的增強。
本系列著重介紹 PHP V5.3 中的新特性,例如名稱空間、閉包、對象管理、面向對象編程和 Phar。雖然這些動人的新特性作為該語言的增補廣受歡迎,但 PHP V5.3 同時也是為進一步優(yōu)化 PHP 而設計的。它構建在流行、穩(wěn)定的 PHP V5.2 的基礎上,并對該語言作了增強,使之更加強大。在本文中,了解 PHP V5.3 中的變化,以及從 PHP V5.2 升級到 PHP V5.3 時需要考慮的一些事情。
![]() ![]() |
![]() |
該語言新增了名稱空間和閉包,增加了更多的保留字。從 PHP V5.3 開始,namespace
不再用作標識符。closure
類現(xiàn)在是一個保留類,但它仍然可以作為有效的標識符。清單 1 顯示了一些例子,由于新增的保留字的緣故,有些語句在 PHP V5.3 中不再有效。
|
PHP V5.3 中還增加了對 goto
語句的支持。現(xiàn)在,goto
是一個保留字。goto
語句在現(xiàn)代語言中不太常見(您也許記得在 BASIC 中如何使用 goto),但是有些情況下,goto 語句的確方便。清單 2 顯示了一個如何使用 goto 語句的例子。
|
goto
的一個可能的用例是中斷深度嵌套的循環(huán)和 if
語句。這將使代碼閱讀起來清晰很多。
![]() ![]() |
![]() |
在 PHP V5.3 中,函數和方法沒有大的變化,但還是有一些增強,以幫助解決 PHP 中的一些突出問題并提高性能。本節(jié)討論一些較為顯著的變化。
在之前版本的 PHP 中,數組函數 atsort
、natcasesort
、usort
、uasort
、uksort
、array_flip
和 array_unique
可以以參數形式傳遞對象而不是數組。然后,這些函數將對象的屬性當做數組的鍵和值。PHP V5.3 中不再支持這一點,所以需要首先將對象轉換成數組。清單 3 展示了如何修改代碼。
|
魔術類方法現(xiàn)在受到更嚴格的限制。下面的方法必須具有公共可見性:
__get
__set
__isset
__unset
__call
現(xiàn)在,當在靜態(tài)上下文中使用 __call
時,為了應對上述變化,可以使用新的 __callStatic()
魔術方法。除了不接受參數的 __isString()
魔術方法以外,這些方法的必需參數都是強制性的,并且必須提供。清單 4 顯示了如何使用這些方法以及它們的必需參數。
|
在 Windows 上,有些函數之前在 PHP 中不受支持,現(xiàn)在在 PHP V5.3 中獲得支持。例如,getopt()
函數用于解析從命令行調用 PHP 腳本時使用的選項。用于編碼和解碼 Internet 地址的 inet_ntop()
和 inet_pton()
函數,現(xiàn)在也可以在 Windows® 上使用。還有一些數學函數,例如 asinh()
、acosh()
、atanh()
、log1p()
和 expm1()
,現(xiàn)在在 Windows 上也受支持。
![]() ![]() |
![]() |
PHP Extension C Library(PECL)一直都是 PHP 中的新擴展的來源地。當一個擴展已經成熟和穩(wěn)定,并且被認為可以成為核心發(fā)行版中一個有用的功能,那么它通常在重大的版本變更時被添加進來。根據這條規(guī) 則,從 PHP V5.3 開始,下面的擴展會成為核心 PHP 發(fā)行版中的一部分。
- FileInfo
- 提供幫助檢測文件的內容類型和編碼的函數,這些函數通過查看文件中的某些魔術字節(jié)字符序列進行檢測。
- intl
- International Components for Unicode(ICU)庫的一個包裝器,提供用于 unicode 和全球化支持的函數。
- Phar
- 第 4 部分 中討論過的一個 PHP 歸檔工具。
- mysqlnd
- 用于 MySQL 數據庫訪問的一個本地 PHP 驅動程序,是早期利用 libmysql 庫的 MySQL 和 MySQLi 擴展的替代物。
- SQLite3
- 用于使用 SQLite V3 數據庫的一個庫。
當一個擴展不再受到積極的維護,或者被認為不值得隨核心 PHP 發(fā)行版一起發(fā)行時,它通常被轉移到 PECL。在 PHP V5.3 的改造過程中,下面這些擴展被踢出核心 PHP 發(fā)行版,而放在 PECL 中進行維護。
- ncurses
- 對 curses 的模擬,用于在命令行顯示圖形化的輸出。
- fpdf
- 用于在 PDF 文檔中構建和使用表單和表單數據。
- dbase
- 提供讀寫 dbase 兼容文件的支持。
- fbsql
- 支持 Frontbase 數據庫服務器上的數據庫訪問。
- ming
- 一個開源庫,用于創(chuàng)建 Flash 4 動畫。
Sybase 擴展已經被完全移除,取而代之的是 sybase_ct 擴展。sybase_ct 擴展與前者完全兼容,應該是一個簡易替代者(drop-in replacement)。這個更新的功能將使用 Sybase client 庫,需要將這些庫安裝在 Web 服務器上。
![]() ![]() |
![]() |
PHP V5.3 著重改善了構建過程,因此更容易在所有平臺上構建 PHP。為了維護 PHP 構建之間的一致性,并提供一組可靠的組件,在構建中不再禁用 PCRE、Reflection 和 SPL 擴展。現(xiàn)在,可以構建可分發(fā)的 PHP 應用程序,它們將使用這些擴展并且保證這些擴展是可用的。
一個新的團隊在去年接管了 PHP Windows 構建。這個小組將為 Windows 上的用戶提供一些改進。新的構建將以 586 架構(Intel® Pentium® 或更高型號)為目標,并要求 Windows 2000/XP 或更高版本,另外去掉了對 Windows 98/NT 及之前版本的支持。將構建使用 Microsoft® Visual Studio® 2008 構建的 PHP 構建和針對 x86-64 架構的構建。當和 Microsoft IIS Web 服務器上的 FastCGI 或者和 Apache 一起使用時,在使用相同的編譯器和架構進行構建的情況下,它們可以提供更高的性能。Windows 安裝程序也將有所改進,以便更好地在 Microsoft IIS Web 服務器上配置 PHP。該團隊專門為 Windows 上的 PHP 建立了一個網站(參見 參考資料)。
![]() ![]() |
![]() |
PHP 的一個重要特性是,可以使用 .ini 文件配置它的行為。在 PHP V5.3 中,與這個文件有關的一些有問題的指令已經被刪除,例如 zend.ze1_compatibility_mode。現(xiàn)在,在使用這個文件時,靈活性有了巨大的提高。
對于 php.ini 文件有兩個重大的改進:
- 在 php.ini 文件中可以使用變量。這對于減少該文件的冗余非常方便,必要時更新文件也更加方便。清單 5 顯示了一個例子。
清單 5. php.ini 文件中的變量
foo = bar
[section]
newfoo = ${bar}
foo 和 newfoo 有相同的值。 - 和用 Apache 配置文件進行設置一樣,可以進行 per-directory 和 per-site PHP ini 設置。這樣做的優(yōu)點是,在所有不同的可運行 PHP 的 SAPI 中,語法都是一致的。清單 6 顯示了如何進行 PHP ini 設置。
清單 6. per-site 和 per-directory .ini 設置
[PATH=/var/www/site1]
; directives here only apply to PHP files in the /var/www/site1 directory
[HOST=www.example.com]
; directives here only apply to PHP files requested from the www.example.com site.
還可以像對待 Apache HTTP Web 服務器上的 .htaccess 文件一樣,在用戶指定的、位于文件系統(tǒng)的 .ini 文件中創(chuàng)建這些 .ini 指令。這個文件的默認文件名由 user_ini.filename 指令指定。通過將這條指令設置為空值,可以禁用該特性。在用戶指定的 .ini 文件中,任何 per-site 和 per-directory 指令都不能被覆蓋。
![]() ![]() |
![]() |
PHP V5.3 開始正式放棄一些較舊的函數,將來版本的 PHP 中將不再提供它們。當使用這些函數時,會遇到 E_DEPRECATED
錯誤。以下函數在 PHP V5.3 中被遺棄:
- tick(
declare(ticks=N)
和register_tick_function()
),之前用于在declare()
塊中當解析器每執(zhí)行 n 條語句時就進行一個函數調用。它們將被廢除,因為它們的函數中有很多的中斷,而且該特性不大常用。 define_syslog_variables()
,該函數初始化所有與 syslog 相關的變量。該函數不是必需的,因為它定義的常量已經被全局定義。廢除這個函數調用應該是有必要的。ereg
正則表達式函數。建議使用 PCRE 正則表達式函數替代,因為它們更快,并且與其他語言和應用程序中使用的正則表達式更加一致。對ereg
函數的支持將被廢除,以使 PHP 可以標準化地使用一個正則表達式引擎。
建議在遷移到 PHP V5.3 時移除這些特性。將來主要的 PHP 發(fā)行版將取消對上述特性的支持。
![]() ![]() |
![]() |
PHP V5.3 有很多新的特性,同時也 “清除” 了一些內容。另外也存在一些向后兼容的問題。本文為將 Web 應用程序遷移到 PHP V5.3 提供了一些指南。要了解最新的關于 PHP V5.3 的詳細信息,請參閱 PHP wiki,其中提供了可能影響到應用程序的任何其他變化的說明。