The Art of Readable Code && High Performance Comments

等了好一陣子,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 的能力:
    • 針對回傳陣列的函式,可以直接提取值
    • 針對新產生的物件,可以直接呼叫其方法
      (new Obj)->method(); // 5.4 可以用了,之前要用 factory method 來繞過,例如 Obj::instance()->method();
  • 加入二進位數值表示 0b01011101
  • 陣列能夠比照字串作為 callable
    以前可以:

    現在可以

    但這邊有點弔詭,透過 $f() 呼叫時,不會初始化 Foo 因此在 bar() 裡若使用了 $this 會發生錯誤;當然也就不會呼叫 Foo::__construct()。
  • 增加 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 的方式
  • 自帶 web server

注意:

  1. (zip 下載) 的 extension_dir 選項預設關閉,要移除行首的 ‘;’ 才會載入 extension
  2. 我這邊的 Win7 / Apache2.2 / PHP5.4 偶而會中斷連線,原因不明 T_T 上面的東西都是辛苦在 cmdline 底下測的 T_T

發表迴響

分類

%d 位部落客按了讚: