天天看點

php5.3 PHP5.4 PHP5.5 php5.6 新特性/使用PHP5.5/PHP5.6要注意的1.PHP 5.3中的新特性 2.PHP 5.4中的新特性3.PHP 5.5中的新特性4.PHP5.6

因為用到php新版本,一些新特性必須要了解,且有些可以在開發時就使用,如果不使用,那麼何必更新php版本呢,顯得有些得不償失了!

是以整理了一下 一些特性,有可能不全,待添加

毫無疑問,命名空間是php5.3所帶來的最重要的新特性。

在php5.3中,則隻需要指定不同的命名空間即可,命名空間的分隔符為反斜杆\。 

select.php 

這樣即使其它命名空間下存在名為select的類,程式在調用時也不會産生沖突。代碼的可讀性也有所增加。 

調用方法 

call.php

在php5中,我們可以在類中通過self關鍵字或者__class__來判斷或調用目前類。但有一個問題,如果我們是在子類中調用,得到的結果将是父類。因為在繼承父類的時候,靜态成員就已經被綁定了。 例如: 

以上代碼輸出的結果是: 

這和我們的預期不同,我們原來想得到子類的相應結果。 

php 5.3.0中增加了一個static關鍵字來引用目前類,即實作了延遲靜态綁定: 

多數計算機程式設計語言中都支援無條件轉向語句goto,當程式執行到goto語句時,即轉向由goto語句中的标号指出的程式位置繼續執行。盡管goto語句有可能會導緻程式流程不清晰,可讀性減弱,但在某些情況下具有其獨特的友善之處,例如中斷深度嵌套的循環和 if 語句。 

閉包(closure)函數和lambda函數的概念來自于函數程式設計領域。例如javascript 是支援閉包和 lambda 函數的最常見語言之一。 

在php中,我們也可以通過create_function()在代碼運作時建立函數。但有一個問題:建立的函數僅在運作時才被編譯,而不與其它代碼同時被編譯成執行碼,是以我們無法使用類似apc這樣的執行碼緩存來提高代碼執行效率。

在php5.3中,我們可以使用lambda/匿名函數來定義一些臨時使用(即用即棄型)的函數,以作為array_map()/array_walk()等函數的回調函數。 

php中原本有一個魔術方法__call(),當代碼調用對象的某個不存在的方法時該魔術方法會被自動調用。新增的__callstatic()方法則隻用于靜态類方法。當嘗試調用類中不存在的靜态方法時,__callstatic()魔術方法将被自動調用。 

以上代碼執行後輸出如下: 

調用對象方法'runtest' –- 通過對象調用調用靜态方法'runtest' –- 靜态調用 

以函數形式來調用對象時,__invoke()方法将被自動調用。 

用法和heredoc類似,但使用單引号。heredoc則需要通過使用雙引号來聲明。 

nowdoc中不會做任何變量解析,非常适合于傳遞一段php代碼。 

支援通過heredoc來初始化靜态變量、類成員和類常量。 

原本格式為是(expr1) ? (expr2) : (expr3) 

如果expr1結果為true,則傳回expr2的結果。

php5.3新增一種書寫方式,可以省略中間部分,書寫為expr1 ?: expr3 

如果expr1結果為true,則傳回expr1的結果 

1.1.1. 修複了大量bug 

1.1.2. php性能提高 

1.1.3. php.ini中可使用變量 

1.1.4. mysqlnd進入核心擴充 理論上說該擴充通路mysql速度會較之前的mysql 和 mysqli 擴充快(參見http://dev.mysql.com/downloads/connector/php-mysqlnd/) 

1.1.5. ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等擴充預設随php綁定釋出。其中phar可用于打包php程式,類似于java中的jar機制。 

1.1.6. ereg 正規表達式函數 不再預設可用,請使用速度更快的pcre 正規表達式函數

詳細的請看 http://blog.csdn.net/baiwz/article/details/9077825

php 5.3.0 新增了兩個錯誤等級: e_deprecated 和 e_user_deprecated. 錯誤等級 e_deprecated 被用來說明一個函數或者功能已經被棄用. e_user_deprecated 等級目的在于表明使用者代碼中的棄用功能, 類似于 e_user_error 和 e_user_warning 等級.

下面是被棄用的 ini 指令清單. 使用下面任何指令都将導緻 e_deprecated 錯誤.

define_syslog_variables

register_globals

register_long_arrays

safe_mode

magic_quotes_gpc

magic_quotes_runtime

magic_quotes_sybase

棄用 ini 檔案中以 '#' 開頭的注釋.

棄用函數:

call_user_method() (使用 call_user_func() 替代)

call_user_method_array() (使用 call_user_func_array() 替代)

define_syslog_variables()

dl()

ereg() (使用 preg_match() 替代)

ereg_replace() (使用 preg_replace() 替代)

eregi() (使用 preg_match() 配合 'i' 修正符替代)

eregi_replace() (使用 preg_replace() 配合 'i' 修正符替代)

set_magic_quotes_runtime() 以及它的别名函數 magic_quotes_runtime()

session_register() (使用 $_session 超全部變量替代)

session_unregister() (使用 $_session 超全部變量替代)

session_is_registered() (使用 $_session 超全部變量替代)

set_socket_blocking() (使用 stream_set_blocking() 替代)

split() (使用 preg_split() 替代)

spliti() (使用 preg_split() 配合 'i' 修正符替代)

sql_regcase()

mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)

mysql_escape_string() (使用 mysql_real_escape_string() 替代)

廢棄以字元串傳遞區域設定名稱. 使用 lc_* 系列常量替代.

mktime() 的 is_dst 參數. 使用新的時區處理函數替代.

棄用的功能:

棄用通過引用配置設定 new 的傳回值.

調用時傳遞引用被棄用.

把目前目錄作為root document隻需要這條指令即可:

也可以指定其它路徑:

還可以指定路由:

traits提供了一種靈活的代碼重用機制,即不像interface一樣隻能定義方法但不能實作,又不能像class一樣隻能單繼承。至于在實踐中怎樣使用,還需要深入思考。

魔術常量為__trait__

我認為比數組簡短文法更友善的是dereferencing,以前我們需要這樣:

在php5.4中這樣就行了:

其他:

本例要注意一個要點 http://www.laruence.com/2011/12/19/2409.html

session提供了上傳進度支援,通過$_session["upload_progress_name"]就可以獲得目前檔案上傳的進度資訊,結合ajax就能很容易實作上傳進度條了。

實作了jsonserializable接口的類的執行個體在json_encode序列化的之前會調用jsonserialize方法,而不是直接序列化對象的屬性。

現在mysql, mysqli, pdo_mysql預設使用mysqlnd本地庫,在php5.4以前需要:

現在:

以上來自:http://www.hdj.me/php54

2.1.10.callable typehint

  則:

由于php是弱類型的語言,是以在php 5.0後,引入了函數類型提示的功能,其含義為對于傳入函數中的參數都進行類型檢查,舉個例子,有如下的類:

這個是用來統計服務請求時間的,并用ms來表示

廢除了register_globals, magic_quotes以及安全模式。 

另外值得一提的是多位元組支援已經預設啟用了,

default_charset從iso-8859-1已經變為utf-8. 

預設發送“content-type: text/html; charset=utf-8”,

你再也不需要在html裡寫meta tag,也無需為utf-8相容而傳送額外的header了。

删除的特性

最後,我們集中整理了幾年來标記為已棄用的多個特性。這些特性包括 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_compat42、session.bug_compat_warn 以及 y2k_compliance。

除了這些特性之外,magic_quotes 可能是最大的危險。在早期版本中,未考慮因 magic_quotes 出錯導緻的後果,簡單編寫且未采取任何舉措使自身免受 sql 注入攻擊的應用程式都通過 magic_quotes 來保護。如果在更新到 php 5.4 時未驗證已采取正确的 sqli 保護措施,則可能導緻安全漏洞。

其他改動和特性

有一種新的“可調用的”類型提示,用于某方法采用回調作為參數的情況。

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 應該極為順暢,但請閱讀遷移指南加以確定。如果您從早期版本更新,執行的操作可能稍多一些。請檢視以前的遷移指南再開始更新。

備受指責的 register globals 已從 php 中完全删除。十年來,該特性一直以其頻繁發生的安全漏洞而著稱。2002年該特性被設定為預設關閉。2009年釋出的 php5.3 将該特性标記為“棄用”,想必從那時起,大部分開發人員已經不再使用它。

從 php 中移除的另一個不讨喜的特性是 magic quotes。magic quotes 本意是對字元串進行自動轉義(escape)以試圖避免 sql 注入攻擊。但是由于字元串的轉義使用方法常與特定背景相關,是以,比起試圖解決的問題,它反而造成了更多的問題。該特性同 register globals 一樣,也在 2009 年被标記為“棄用”。

php 中的 break 和 continue 語句之後可以跟上一個參數用來指明跳出的循環層數。如果不指定參數,它會像 vb、c#或 java 一樣跳出最内層的循環。在 php 5.4 之前,開發人員可以向 break 語句傳遞一個變量,而現在隻能傳遞常量。

php 允許參數按引用傳遞。在早期版本中,你可以通過為調用點添加修飾來指明變量按引用傳遞。在 php 5.4 中,該選項已被移除。相反,現代 php 程式設計隻需要在函數聲明時指定按引用傳遞即可。與 c# 不同,你不需要同時在聲明和調用點指定按引用傳遞。

新特性及提案清單 都相當大,而且不是按重要性排序。是以,如果你不想通讀一遍的話,這裡有四個特點我個人是最興奮的: 

:一個簡單的密碼散列api

:标量類型提示

:getter和setter   

:生成器

現在,讓我們來看看php5.5 可能會新增的功能: 

e修飾符是訓示preg_replace函數用來評估替換字元串作為php代碼,而不隻是僅僅做一個簡單的字元串替換。不出所料,這種行為會源源不斷的出現安全問題。這就是為什麼在php5.5 中使用這個修飾符将抛出一個棄用警告。作為替代,你應該使用preg_replace_callback函數。你可以從rfc找到更多關于這個變化相應的資訊。

boolval()

php已經實作了strval、intval和floatval的函數。為了達到一緻性将添加boolval函數。它完全可以作為一個布爾值計算,也可以作為一個回調函數。 

hash_pbkdf2()

pbkdf2全稱“password-based key derivation function 2”,正如它的名字一樣,是一種從密碼派生出加密密鑰的算法。這就需要加密算法,也可以用于對密碼哈希。更廣泛的說明和用法示例

array_column()

intl 擴充 

将有許多改進 intl的擴充。例如,将會有新的intlcalendar,intlgregoriancalendar,intltimezone,intlbreakiterator,intlrulebasedbreakiterator,intlcodepointbreakiterator類。之前,我竟然不知道有這麼多關于intl擴充,如果你想知道更多,我建議你去最新公告裡找 calendar和 breakiterator。 

常量引用

“常量引用”意味着數組可以直接操作字元串和數組字面值。舉兩個例子:

我不認為在實踐中會使用此功能,但它使語言更加一緻。請參閱 rfc。

目前,empty()語言構造隻能用在變量,而不能在其他表達式。

在特定的代碼像empty($this->getfriends())将會抛出一個錯誤。作為php5.5 這将成為有效的代碼

php5.3 中引入命名空間的别名類和命名空間短版本的功能。雖然這并不适用于字元串類名稱

為了解決這個問題采用新的foobar::class文法,它傳回類的完整類别名稱

如果你有一個函數接受多個可選的參數,目前沒有辦法隻改變最後一個參數,而讓其他所有參數為預設值。 

rfc上的例子,如果你有一個函數如下: 

那麼有沒有辦法設定$report_errors=false,而其他兩個為預設值。為了解決這個跳躍參數的問題而提出: 

我個人不是特别喜歡這個提議。在我的眼睛裡,代碼需要這個功能,隻是設計不當。函數不應該有12個可選參數。 

标量類型提示原本計劃進入5.4,但由于缺乏共識而沒有做。擷取更多關于為什麼标量類型提示沒有做進php的資訊,請參閱: 标量類型提示比你認為的更難。 

對于php5.5 而言,針對标量類型提示讨論又一次出現,我認為這是一個相當不錯的 提議。 

它需要通過輸入值來指定類型。例如:123,123.0,“123”都是一個有效的int參數輸入,但“hello world”就不是。這與内部函數的行為一緻。 

如果你從不喜歡寫這些getxyz()和setxyz($value)方法,那麼這應該是你最受歡迎的改變。提議添加一個新的文法來定義一個屬性的設定/讀取: 

當然還有更多的功能,比如隻讀屬性。如果你想要知道更多,請參閱 rfc。 

目前,自定義疊代器很少使用,因為它們的實作,需要大量的樣闆代碼。生成器解決這個問題,并提供了一種簡單的樣闆代碼來建立疊代器。 

例如,你可以定義一個範圍函數作為疊代器: 

上述xrange函數具有與内建函數相同的行為,但有一點差別:不是傳回一個數組的所有值,而是傳回一個疊代器動态生成的值。 

清單解析提供一個簡單的方法對數組進行小規模操作: 

上述清單解析相等于下面的代碼: 

也可以這樣過濾數組: 

生成器表達式也很類似,但是傳回一個疊代器(用于動态生成值)而不是一個數組。 

以上來自:http://www.oschina.net/question/157182_61259

這個和java中的finally一樣,經典的try ... catch ... finally 三段式異常處理。

對于“數組的數組”進行疊代,之前需要使用兩個foreach,現在隻需要使用foreach + list了,但是這個數組的數組中的每個數組的個數需要一樣。看文檔的例子一看就明白了。

使用opcache會提高php的性能,你可以和其他擴充一樣靜态編譯(--enable-opcache)或者動态擴充(zend_extension)加入這個優化項。

允許常量計算,允許使用包含數字、字元串字面值和常量的标量表達式

允許常量作為函數參數預設

代替 func_get_args()

在調用函數的時候,通過 ... 操作符可以把數組或者可周遊對象解包到參數清單,這和ruby等語言中的擴張(splat)操作符類似

輸出

php自帶了一個互動式調試器phpdbg,它是一個sapi子產品,更多資訊參考 phpdbg文檔 。

php://input 開始支援多次打開和讀取,這給處理post資料的子產品的記憶體占用帶來了極大的改善。

可以上傳超過2g的大檔案。

gmp 對象支援操作符重載和轉換為标量,改善了代碼的可讀性,如:

采用cryptopro s-box tables實作了 gost-crypto 雜湊演算法,詳情參考 rfc 4357, section 11.2 。

openssl擴充新增證書指紋的提取和驗證功能, openssl_x509_fingerprint()用于提取x.509證書的指紋,ssl stream context 選項: capture_peer_cert 用于擷取對方x.509證書; peer_fingerprint 用于斷言對方證書和給定的指紋比對。

另外,可以通過ssl流上下文選項 crypto_method 指定加密方法,如sslv3或tls,目前支援的選項值包括stream_crypto_method_sslv2_client, stream_crypto_method_sslv3_client, stream_crypto_method_sslv23_client (預設), or stream_crypto_method_tls_client。