程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP入門知識 >> PHP5.3新特性:名稱空間(Namespaces)

PHP5.3新特性:名稱空間(Namespaces)

編輯:PHP入門知識

之前陸續介紹了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,後文不再復述。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved