等了好一陣子,PHP 5.4 終於出來了 (泣)
簡單整理下自己感興趣的要點:
移除:
- Safe Mode
- Register Long Array / Global
- Magic Quotes
- y2k_compliance
- Pass by ref 現在要寫在函式定義裡了
- ext/sqlite 變成 PECL 模組
- 移除猜測時區的功能,改為預設使用 UTC;乖乖設定 date.timezone 吧!一勞永逸
修改:
- 增進運算效能與記憶體管理
- <?=$a?> 無須開啟 short_open_tag 就能使用
- zend-mbstring 改內建
如果手邊還有用 big5 編碼的專案,可以打開 - php.ini 內的預設編碼由 iso-8859-1 改為 utf-8 (德政!)
- 能以 [1,2,3] 的方式產生 array(1,2,3) 這樣的陣列;不過指定 key 還是要用 [‘a’=>1, ‘b’=>2] ,為何不乾脆採用 json 呢 XD
- 強化 method chaining 的能力:
- 針對回傳陣列的函式,可以直接提取值
$cb = function () {return [1,2,3];}; var_dump($cb()[2]); // 除了closure 以外,對一般函式也適用
- 針對新產生的物件,可以直接呼叫其方法
(new Obj)->method(); // 5.4 可以用了,之前要用 factory method 來繞過,例如 Obj::instance()->method(); - 加入二進位數值表示 0b01011101
- 陣列能夠比照字串作為 callable
以前可以:$f = "foo"; $f(); // calls foo();
現在可以
class Foo { function bar() {echo "bar\n";} static function baz() {echo "baz\n";} } function baz() {echo "zab\n";} $f = ["Foo", "bar"]; $f(); // 呼叫 Foo::bar() $g = [new Foo, 'bar']; $g(); // 呼叫 (new Foo)->bar()
但這邊有點弔詭,透過 $f() 呼叫時,不會初始化 Foo 因此在 bar() 裡若使用了 $this 會發生錯誤;當然也就不會呼叫 Foo::__construct()。
// 底下是各種不支援的語法 "baz"() ; ['Foo', 'bar'](); $j = 'Foo::baz'; $j() ;
- 增加 typehint : callable
以往 typehint 只支援 Class 與 array,曾經有風聲說這一版 PHP 要提供變數基本型別的支援,不過測試並未實裝;現在則加入了 callable 的支援。
簡單的說,Closure (anonymous function)、存在的函數名稱字串 、符合前述形式的陣列,能夠通過這類型別檢查;”Foo::bar” 或 “Foo::baz” (function / static function) 也能通過,但真的呼叫還是會產生錯誤(猜想會改掉) - 加強對物件取值/呼叫函式
舊版的 PHP 對於以 $obj->{…} 或 $obj->{…}() 取值或呼叫函式的規定相當寬鬆,只要記得用大括號,怎麼寫怎麼過;然而以 Foo::{bar()}() 直到 PHP 5.4 才搞定。
{…} 可以接受函式呼叫如 bar(), Foo::bar(), 或者是 Closure 如 $tmp();然而直接寫入 anonymous function 會發生 parse error。由於不致造成語法疑義,猜想遲早會更正。 - 能透過 $_SESSION 變數追蹤檔案上傳進度
- Closure / anonymous function :
- Anonymous function 現在可以帶有 scope
- 透過 bind(), bindTo(),可以讓 Closure 指向物件實體的方法;在這類 Anonymous function 裡可以使用 $this;或者說,透過這兩個方法,能夠建立 anonymouse function 內的 $this 物件。在 PHP::bind() 的範例裡,有人提出了這種用法對於破壞scope 的實例
新增:
- Trait
- 除了 class, abstract class, interface 以外的另一種物件繼承選擇
- 容許多重繼承,能夠提供 method, static method, abstract method, property;雖然不能寫 static property,但可以透過 method 裡的 static variable 頂著用
- static variable 的 scope 是以實作物件作為基準,在不同物件間獨立;無論該變數所在方法是否為 static
- 當物件自多重來源獲得方法時 (inherited class, trait),方法繼承優先順位是 自身實作 > trait > inherited class
- 若在物件方法或 trait 中使用了 parent 關鍵字,會以實作的物件作為基準點,而去調用其 parent class。
- trait::method() 會明確呼叫 trait 所實作方法
- 使用 use 關鍵字引入,後面可以接 {…} 決定引用 trait 的方式
class Foo use TraitA, TraitB { TraitA::methodA as private method; TraitA::conflicted_method insteadof TraitB; TraitB::conflicted_method as conflicted_method_B; }
- 自帶 web server
注意:
- (zip 下載) 的 extension_dir 選項預設關閉,要移除行首的 ‘;’ 才會載入 extension
- 我這邊的 Win7 / Apache2.2 / PHP5.4 偶而會中斷連線,原因不明 T_T 上面的東西都是辛苦在 cmdline 底下測的 T_T
No Comments Yet