PHP的命名空間(namespace)是PHP 5.3中加入最重要的一個新特性,這個概念在C#中已經很早就有了,php中的namespace其實和c#的概念是一樣的。
一.動態訪問命名空間的元素
namespace me\poet; function test() { echo '1111'; } $fun = 'test';//不能這麼用,最後$fun()無法動態調用到test():Fatal error: Call to undefined function test() $fun = '\me\poet\test';//正確 //$fun = 'me\poet\test';//正確 $fun();
也就是說,動態調用必須是 限定名稱 或 完全限定名稱(概念參考:PHP命名空間的使用基礎)
二.魔術常量 和 操作符
namespace me\poet; function test() { echo '1'; } echo __NAMESPACE__; //魔術常量:命名空間的名稱(輸出 me\poet) //namespace操作符:顯式訪問當前命名空間或子命名空間中的元素,等價於類中的self操作符 \me\poet\test(); namespace\test(); //上兩行代碼等價。
三.別名、導入 和 全局空間(含多個例子)
namespace ws\weichen\www; use ws\weichen\www as poet;//定義別名poet //use ws\weichen\www; //不加as,則取最後的作為別名(www) function demo() { echo '1'; } \ws\weichen\www\demo(); poet\demo(); //www\demo(); //不加as的情況,則這樣調用
以上三行代碼效果一樣。
按規則(ws\weichen\www)命名的好處:若更換域名,只要把前綴名稱改了就可以,不影響後面代碼中別名www的使用。
/* 導入 */ include 'hello.class.php'; use \ws\weichen\www; use \Hello; /*--------------------------------------------------------*/ /* 支持多個use語句 */ use \nihao\shijie as hello, \ws\weichen\www; /*--------------------------------------------------------*/ /* 全局空間:反斜線調用 */ namespace A\B\C; //這個函數是 A\B\C\fopen(); function fopen() { $f = \fopen('demo.txt');//調用全局fopen函數 return $f; }
語法上沒有任何問題。
你的PHP版本是多少?PHP在5.3.0版本以後開始支持命名空間。你的PHP版本可能比較低。
1. namespace Zend\Http\PhpEnvironment;
這句代碼定義了一個命名空間,你可以理解為定義一個名稱為 Zend\Http\PhpEnvironment 的域名。
在定義了之後,下面所申明的class, interface, const等都是在申明的這個“域”裡面的。當引用一個申明了命名空間的包含文件,想要調用這個裡面的東西,那就必須:
調整當前腳本也到這個域名裡,否則,就得用namesapce的全稱。
比如,inc.php 文件:
namespace Zend\Http\PhpEnvironment;
class Bar {}//定義了一個類
則其他文件調用時:
// 訪問Foo的第一種方法,用全稱
require 'inc.php';
$foo = new \Zend\Http\PhpEnvironment\Bar();
// 訪問Foo的第二種方法
namespace Foo; // 調整當前腳本到Foo這個ns域,而且namespace申明必須在第一句
require 'inc.php';
$foo = new Bar();
2. use關鍵字目的是使用ns的別名:
比如說,上面的
// 訪問Foo的第一種方法,用全稱
require 'inc.php';
$foo = new \Zend\Http\PhpEnvironment\Bar();
用uses後,寫法如下:
use \Zend\Http\PhpEnvironment as pe; //定義別名
$foo = new \pe\Bar(); //用短的別名來代替原來的
如果省略後面的as ....,那麼,就可以直接用最後一節的文字來代替,比如,上面的:
use \Zend\Http\PhpEnvironment; //定義別名
$foo = new \PhpEnvironment\Bar(); //用短的別名來代替原來的
================================================
php官方手冊中的相關內容:
在PHP中,namespace命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
1. 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
2. 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑。
PHP 命名空間支持有兩種使用別名或導入方式:為類名稱使用別名,或為命名空間名稱使用別名, 別名通過操作符 use 來實現。...余下全文>>