① 什麼是php命名空間
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑,有點類似於文件管理器中,按照不同的文件夾來管理文件。根據 PHP 手冊:
在PHP中,命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
② 關於php的命名空間的問題
PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和java,那命名空間就不算什麼新事物。 不過在PHP當中還是有著相當重要的意義。
PHP 命名空間可以解決以下兩類問題:
用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
默認情況下,所有常量、類和函數名都放在全局空間下,就和PHP支持命名空間之前一樣。
命名空間通過關鍵字namespace 來聲明。如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間。
PHP支持兩種抽象的訪問當前命名空間內部元素的方法,__NAMESPACE__ 魔術常量和namespace關鍵字。
常量__NAMESPACE__的值是包含當前命名空間名稱的字元串。在全局的,不包括在任何命名空間中的代碼,它包含一個空的字元串
③ PHP的命名空間使用方法,求寫實例
假設程序涉及文件的輸入和輸出,那麼就要引入system.io這樣一個命名空間。
命名空間的引入主要是為了寫程序時代碼書寫簡單。
比如說filestream這個類,他就是命名空間system.io下的一個類。如果不在文件開頭引入system.io這個命名空間,那麼在程序中用到這個類的時候就要寫成system.io.filestream,相反,如果已經引入了這個命名空間就可以直接寫filestream了。
命名空間就是將一類具有相似相關功能的類和介面等打包。
只要在文件的開頭寫上using
system.io;
就可以直接使用這個命名空間下的類。
④ PHP 為什麼要使用命名空間,命名空間的作用
命名空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函數或者類出現相同的名字,否則會產生一個致命的錯誤。這種情況下只要避免命名重復就可以解決,最常見的一種做法是約定一個前綴。
舉個栗子:項目中有兩個模塊:article和message board,它們各自有一個處理用戶留言的類Comment。之後我可能想要增加對所有用戶留言的一些信息統計功能,比如說我想得到所有留言的數量。這時候調用它們Comment提供的方法是很好的做法,但是同時引入各自的Comment類顯然是不行的,代碼會出錯,在另一個地方重寫任何一個Comment也會降低維護性。那這時只能重構類名,我約定了一個命名規則,在類名前面加上模塊名,像這樣:Article_Comment、MessageBoard_Comment
可以看到,名字變得很長,那意味著以後使用Comment的時候會寫上更多的代碼(至少字元多了)。並且,以後如果要對各個模塊增加更多的一些整合功能,或者是互相調用,發生重名的時候就需要重構名字。當然在項目開始的時候就注意到這個問題,並規定命名規則就能很好的避免這個問題。另一個解決方法可以考慮使用命名空間。
基礎
命名空間將代碼劃分出不同的空間(區域),每個空間的常量、函數、類(為了偷懶,我下邊都將它們稱為元素)的名字互不影響, 這個有點類似我們常常提到的『封裝'的概念。
創建一個命名空間需要使用namespace關鍵字,這樣:
復制代碼代碼如下:
<?php
//創建一個名為'Article'的命名空間
namespace Article;
?>
要注意的是,當前腳本文件的第一個命名空間前面不能有任何代碼,下面的寫法都是錯誤的:
復制代碼代碼如下:
//例一
//在腳本前面寫了一些邏輯代碼
<?php
$path = "/";
class Comment { }
namespace Article;
?>
//例二
//在腳本前面輸出了一些字元
<html></html>
<?php
namespace Article;
?>
為什麼要說第一個命名空間呢?因為同一腳本文件中可以創建多個命名空間。
下面我創建了兩個命名空間,順便為這兩個空間各自添加了一個Comment類元素:
復制代碼代碼如下:
<?php
//創建一個名為'Article'的命名空間
namespace Article;
//此Comment屬於Article空間的元素
class Comment { }
//創建一個名為'MessageBoard'的命名空間
namespace MessageBoard;
//此Comment屬於MessageBoard空間的元素
class Comment { }
?>
在不同空間之間不可以直接調用其它元素,需要使用命名空間的語法:
復制代碼代碼如下:
<?php
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
//調用當前空間(MessageBoard)的Comment類
$comment = new Comment();
//調用Article空間的Comment類
$article_comment = new \Article\Comment();
?>
可以看到,在MessageBoard空間中調用article空間里的Comment類時,使用了一種像文件路徑的語法: \空間名\元素名
除了類之外,對函數和常量的用法是一樣的,下面我為兩個空間創建了新的元素,並在MessageBoard空間中輸出了它們的值。
復制代碼代碼如下:
<?php
namespace Article;
const PATH = '/article';
function getCommentTotal() {
return 100;
}
class Comment { }
namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
return 300;
}
class Comment { }
//調用當前空間的常量、函數和類
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();
//調用Article空間的常量、函數和類
echo \Article\PATH; ///article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();
?>
然後我的確得到了Article空間的元素數據。
子空間
命名空間的調用語法像文件路徑一樣是有道理的,它允許我們自定義子空間來描述各個空間之間的關系。
⑤ php 命名空間為什麼類前要加\
//是誰告訴你一定要加????只有在完全限定名稱的情況下才需要加
//如果不加,將會在當前命名空間下尋找這個類
⑥ 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不同命名空間下不能使用include
php不同命名空間下不能使用include的原因是:php命名空間在第一個文件開關以namespace命名空間名,則當前的文件為該命名空間,當include其他文件的,其他文件的命名空間為文件的開頭namespace名,如沒有為全局,不因為include繼承,查看當前文件的命名空間可用echo,NAMESPACE;php,include,文件位置,第一個include文件為最初文件位置,與當前文件無關,與載入的第一個文件有關。
⑧ PHP 引入命名空間,類,方法,常量
PHP 引入命名空間,如果想要訪問命名空間中的類,方法,常量,則用引入的命名空間的最後一個空間名去中空限定
如果引入的直接是類,方法,常量,則可以直接使用,賣伏瞎並且當前空間不能定義同名的類,方法,常量
當前命名空間有同名的定義,則引入的類,方法,常量要用別名 as 別名
namespace 可廳前以區分類,函數,const常量 不能區分define常量
⑨ PHP 的use 命名空間 是什麼意思
有點類似於 java 中的包機制,用來解決重名問題的,每一個命名空間都是獨立的
給你舉個例子吧,比如我現在想寫兩個類,名字都叫 Action
<?php
namespaceA;//定義命名空間
classAction{
//..
}
namespaceB;//定義第二個命名空間
classAction{
//..
}
use 關鍵字用於導入某個命名空間下的類, 如果我在B空間內想使用A空間中的Action類,就需要導入這個類才能使用(當然也可以指明空間前綴來使用)
namespaceB;
//在本空間中需要使用A空間中的Action類,使用use導入
useAAction;//導入,如果本空間中也有一個Action會出現錯誤,因為類重名了
useAActionasA_Action;//通過取別名的方式解決
$var=newA_Action;