之前陸續介紹了php 5.3的一些新特性,正好上周看到ZendCon關於5.3的ppt,介紹的更為詳細,那麼這裡做個歸總或者說翻譯:)
Namespaces
php 5.3最大的改動,毫無疑問就是Namespaces(此前有一篇相關的PHP Namespaces FAQ)。這給php開發人員帶來的好處不少,廣為人們所诟病的函數命名問題也得到了解決。
代碼更清晰
5.3之前常見的代碼,需要自定義前綴區分函數和類名
CODE:
function MY_wrapper() {}
class MY_DB { }
define('MY_CONN_STR', '');
MY_wrapper();
new MY_DB();
MY_CONN_STR;
使用名稱空間之後,代碼看上去更加clean。
CODE:
namespace MY;
function wrapper() {}
class DB { }
const CONN_STR = '';
use MY AS MY;
wrapper();
new DB();
CONN_STR;
一個文件中定義了多個namespace
如果一個文件中定義了多個namespace,應該怎樣處理?
CODE:
namespace LIB;
class MySQL {}
class SQLite {}
$b = new SQLite();
namespace LIB_EXTRA;
class MScrypt {}
$a = new MScrypt();
var_dump(
get_class($a),
get_class($b)
);
以上代碼輸出為:
CODE:
string(18) "LIB_EXTRA::MScrypt"
string(11) "LIB::SQLite"
php是解釋執行的語言,以上結果合情合理。
namespace的優先級
namespace中定義的函數,類和常量優先,其次才是全局的。
CODE:
namespace foo;
function strlen($foo) { return htmlentities($foo); }
echo strlen("test"); // test
echo ::strlen("test"); // 4
echo namespace::strlen("test"); // test
namespace和autoload的友情
autoload會根據namespace名稱以及class名稱來解析類文件位置
僅當namespace和全局范圍都沒找到class定義的情況下,autoload才會被觸發
在namespace中定義的__autoload不會被自動調用
CODE:
function __autoload($var) { var_dump($var); } // LIB::foo
require "./ns.php"; /*
<?php
namespace LIB;
new foo();
*/
namespace一些輔料
CODE:
namespace really::long::pointlessly::verbose::ns;
__NAMESPACE__; // 新增的魔法常量,表示當前namespace名稱
class a{}
get_class(new a()); // really::long::pointlessly::verbose::ns::a
use really::long::pointlessly::verbose::ns::a AS b; // 從名稱空間中引用一個類
注:這裡的內容節選自pdf Introduction to PHP 5.3 Slides,後文不再復述。