文章轉自PHP5研究室,作者:John Mertic
------------------
“PHP V5.3 中的新特性” 系列文章將持續介紹該發行版提供的令人興奮的新特性。第 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 同時也是為進一步優化 PHP 而設計的。它構建在流行、穩定的 PHP V5.2 的基礎上,并對該語言作了增強,使之更加強大。在本文中,了解 PHP V5.3 中的變化,以及從 PHP V5.2 升級到 PHP V5.3 時需要考慮的一些事情。
語法變化
該語言新增了名稱空間和閉包,增加了更多的保留字。從 PHP V5.3 開始,namespace
不再用作標識符。closure
類現在是一個保留類,但它仍然可以作為有效的標識符。清單 1 顯示了一些例子,由于新增的保留字的緣故,有些語句在 PHP V5.3 中不再有效。
清單 1. 無效的 PHP 語句
// the function definition below will throw a fatal error in PHP 5.3, but is perfectly // valid in 5.2 function namespace() { .... }
// same with this class definition class Closure { .... }
|
PHP V5.3 中還增加了對 goto
語句的支持。現在,goto
是一個保留字。goto
語句在現代語言中不太常見(您也許記得在 BASIC 中如何使用 goto),但是有些情況下,goto 語句的確方便。清單 2 顯示了一個如何使用 goto 語句的例子。
清單 2. PHP 中的 goto
語句
echo "This text will get outputted"; goto a;
echo "This text will get skipped";
a: echo "This text will get outputted";
|
goto
的一個可能的用例是中斷深度嵌套的循環和 if
語句。這將使代碼閱讀起來清晰很多。
函數和方法的變化
在 PHP V5.3 中,函數和方法沒有大的變化,但還是有一些增強,以幫助解決 PHP 中的一些突出問題并提高性能。本節討論一些較為顯著的變化。
在之前版本的 PHP 中,數組函數 atsort
、natcasesort
、usort
、uasort
、uksort
、array_flip
和 array_unique
可以以參數形式傳遞對象而不是數組。然后,這些函數將對象的屬性當做數組的鍵和值。PHP V5.3 中不再支持這一點,所以需要首先將對象轉換成數組。清單 3 展示了如何修改代碼。
清單 3. 為某些函數修改代碼,將對象轉換成數組
$obj = new stdClass; $obj->a = '1'; $obj->b = '2'; $obj->c = '3';
print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2
print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2
|
魔術類方法現在受到更嚴格的限制。下面的方法必須具有公共可見性:
__get
__set
__isset
__unset
__call
現在,當在靜態上下文中使用 __call
時,為了應對上述變化,可以使用新的 __callStatic()
魔術方法。除了不接受參數的 __isString()
魔術方法以外,這些方法的必需參數都是強制性的,并且必須提供。清單 4 顯示了如何使用這些方法以及它們的必需參數。
清單 4. 使用魔術方法
class Foo { public function __get($key) {} // must be public and have one parameter public function __set($key,$val) {} // must be public and have two parameters
public function __toString() {} must be public and have no parameters }
|
在 Windows 上,有些函數之前在 PHP 中不受支持,現在在 PHP V5.3 中獲得支持。例如,getopt()
函數用于解析從命令行調用 PHP 腳本時使用的選項。用于編碼和解碼 Internet 地址的 inet_ntop()
和 inet_pton()
函數,現在也可以在 Windows® 上使用。還有一些數學函數,例如 asinh()
、acosh()
、atanh()
、log1p()
和 expm1()
,現在在 Windows 上也受支持。
擴展的變化
PHP Extension C Library(PECL)一直都是 PHP 中的新擴展的來源地。當一個擴展已經成熟和穩定,并且被認為可以成為核心發行版中一個有用的功能,那么它通常在重大的版本變更時被添加進來。根據這條規 則,從 PHP V5.3 開始,下面的擴展會成為核心 PHP 發行版中的一部分。
- FileInfo
- 提供幫助檢測文件的內容類型和編碼的函數,這些函數通過查看文件中的某些魔術字節字符序列進行檢測。
- intl
- International Components for Unicode(ICU)庫的一個包裝器,提供用于 unicode 和全球化支持的函數。
- Phar
- 第 4 部分 中討論過的一個 PHP 歸檔工具。
- mysqlnd
- 用于 MySQL 數據庫訪問的一個本地 PHP 驅動程序,是早期利用 libmysql 庫的 MySQL 和 MySQLi 擴展的替代物。
- SQLite3
- 用于使用 SQLite V3 數據庫的一個庫。
當一個擴展不再受到積極的維護,或者被認為不值得隨核心 PHP 發行版一起發行時,它通常被轉移到 PECL。在 PHP V5.3 的改造過程中,下面這些擴展被踢出核心 PHP 發行版,而放在 PECL 中進行維護。
- ncurses
- 對 curses 的模擬,用于在命令行顯示圖形化的輸出。
- fpdf
- 用于在 PDF 文檔中構建和使用表單和表單數據。
- dbase
- 提供讀寫 dbase 兼容文件的支持。
- fbsql
- 支持 Frontbase 數據庫服務器上的數據庫訪問。
- ming
- 一個開源庫,用于創建 Flash 4 動畫。
Sybase 擴展已經被完全移除,取而代之的是 sybase_ct 擴展。sybase_ct 擴展與前者完全兼容,應該是一個簡易替代者(drop-in replacement)。這個更新的功能將使用 Sybase client 庫,需要將這些庫安裝在 Web 服務器上。
構建的變化
PHP V5.3 著重改善了構建過程,因此更容易在所有平臺上構建 PHP。為了維護 PHP 構建之間的一致性,并提供一組可靠的組件,在構建中不再禁用 PCRE、Reflection 和 SPL 擴展。現在,可以構建可分發的 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 建立了一個網站(參見 參考資料)。
.ini 的變化
PHP 的一個重要特性是,可以使用 .ini 文件配置它的行為。在 PHP V5.3 中,與這個文件有關的一些有問題的指令已經被刪除,例如 zend.ze1_compatibility_mode。現在,在使用這個文件時,靈活性有了巨大的提高。
對于 php.ini 文件有兩個重大的改進:
- 在 php.ini 文件中可以使用變量。這對于減少該文件的冗余非常方便,必要時更新文件也更加方便。清單 5 顯示了一個例子。
清單 5. php.ini 文件中的變量
foo = bar
[section] newfoo = ${bar}
|
foo 和 newfoo 有相同的值。 - 和用 Apache 配置文件進行設置一樣,可以進行 per-directory 和 per-site PHP ini 設置。這樣做的優點是,在所有不同的可運行 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 文件一樣,在用戶指定的、位于文件系統的 .ini 文件中創建這些 .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()
塊中當解析器每執行 n 條語句時就進行一個函數調用。它們將被廢除,因為它們的函數中有很多的中斷,而且該特性不大常用。 define_syslog_variables()
,該函數初始化所有與 syslog 相關的變量。該函數不是必需的,因為它定義的常量已經被全局定義。廢除這個函數調用應該是有必要的。ereg
正則表達式函數。建議使用 PCRE 正則表達式函數替代,因為它們更快,并且與其他語言和應用程序中使用的正則表達式更加一致。對 ereg
函數的支持將被廢除,以使 PHP 可以標準化地使用一個正則表達式引擎。
建議在遷移到 PHP V5.3 時移除這些特性。將來主要的 PHP 發行版將取消對上述特性的支持。
結束語
PHP V5.3 有很多新的特性,同時也 “清除” 了一些內容。另外也存在一些向后兼容的問題。本文為將 Web 應用程序遷移到 PHP V5.3 提供了一些指南。要了解最新的關于 PHP V5.3 的詳細信息,請參閱 PHP wiki,其中提供了可能影響到應用程序的任何其他變化的說明。