導航:首頁 > 編程語言 > php命名空間實例

php命名空間實例

發布時間:2023-12-03 01:37:59

『壹』 php命名空間的引入問題 include namespace

include函數是引入文件

命名空間解決的是同一腳本下相同函數重名,不同的命名空間命名,相當於處於不同的模塊,解決同一腳本下php函數重名的致命錯誤

  1. 你之前include引入的時候你的2個文件的相同函數處於不同命名空間下,就算在同一腳本也不會報錯

  2. 看你最後段代碼,你連續定義了2個命名空間,第1個就沒用了,相當於你在namespace FooBarsubnamespace;命名空間下寫了之後的代碼,但是之後的代碼處於namespace FooBarsubnamespace;下但是出現了2個相同名的函數,自然報錯

  3. 你要區分命名空間和include就要先懂得他們代表的意思,從你的問題可以看出你不太懂命名空間,建議你網路或者看下php手冊上的命名空間,自己捉摸比別人教理解得更加深刻

  4. 建議你把namespace FooBarsubnamespace;寫到const FOO = 2;上面

『貳』 PHP中不同文件夾使用相同的命名空間,相互之間應該如何調用呢能不能舉例說明一下。

那麼在不同文件中晌襲命名相同的命名空間就表示在一個容器下...不過在不同目錄下相同的命名空間我還不是太清楚.一般都是在一個項目文件下的...我去找找有答案在添激卜加宴鉛兄

命名空間可以解決下面兩個問題:

(1)用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。

(2)為很長的標識符創建一個別名,提高代碼的可讀性,減少代碼的編寫量。

『叄』 PHP 5.3 特性:命名空間

PHP 的一個新的重要特性就是 命名空間(namespace) 這一特性在 PHP x 時候就提出過 後來被取消並安排在 PHP 中實現 而此次又再次 提前 到了 PHP 發布 可見開發人員對其的重視以及謹慎的態度

官方發跡擾粗布時說明文檔的內容可能已過期(documentation maybe out dated) 所以在這里簡單的說明命名空間的用法 首先是聲明一個命名空間 加入了新的關鍵字 namespace 其應在類文件的開頭

<?php namespace Project::Mole; class User { const STATUS_OK = true; function register($data) { } } ?>

然後在控制器中(可能是其他文件)就可以這樣調用

$user = new Project::Mole::User(); $user >register($register_info);

的確與平常的並無兩樣 但是我們可以將兩個相互獨立的類聯系李逗起來 比如

Project::Mole::User; Project::Mole::Blog;

這樣就能從語言本身更容易描述和理解變數 類之間的關系 從而避免了 傳統 上的 Project_Mole_Blog 這樣冗長的命名方式 上面的說明可能很難說明使用命名空間帶來了什麼好處 新增加的 use 和 as 關鍵字或許能更好的說明問題 use 和 as 語句可以引用和聲明 命名空間的 別名 比如 上述的控制器中實例化類的代碼可以這樣寫

use Project::Mole; $user = new Mole::User(); $user >register($register_info);

甚至

use Project::Mole::User as MoleUser; $user = new MoleUser; $user >register($register_info);

類中的常量也可以通過命名空間訪問 比如上述類中的 STATUS_OK 就可以通過命名空間

Project::Mole::User::STATUS_OK

訪問 進一步的 也可以用別名簡化那麼長的 變數名稱

use Project::Mole::User::STATUS_OK as STATUS_OK; echo STATUS_OK;

順便提下 超空間(The Global Namespace) 的概念 所謂的 超空間 就是沒有指定命名空間的變數 類和函數 比如

function foo() { }

這的姿鎮函數 可以使用 foo() 執行的同時 也可以使用 ::foo(); 這樣執行

最後 配合使用 autoload 函數即可載入指定命名空間的類 簡單的函數如下

function __autoload( $classname ) { $classname = strtolower( $classname ); $classname = str_replace( :: DIRECTORY_SEPARATOR $classname ); require_once( dirname( __FILE__ ) / $classname class php ); }

這樣 比如調用

__autoload( Project::Mole::User );

lishixin/Article/program/PHP/201311/21303

『肆』 php不同命名空間下不能使用include

php不同命名空間下不能使用include的原因是:php命名空間在第一個文件開關以namespace命名空間名,則當前的文件為該命名空間,當include其他文件的,其他文件的命名空間為文件的開頭namespace名,如沒有為全局,不因為include繼承,查看當前文件的命名空間可用echo,NAMESPACE;php,include,文件位置,第一個include文件為最初文件位置,與當前文件無關,與載入的第一個文件有關。

『伍』 PHP怎麼自動載入同一目錄下同一命名空間的類文件

自動載入的,只有在實例化時才會真的載入。實例化時,調用公共空間的方式是直接在元素名稱前加
\
就可以了,否則PHP解析器會認為我想調用當前空間下的元素。

『陸』 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命名空間實例相關的資料

熱點內容
java獲取byte 瀏覽:55
eth對抗量子加密 瀏覽:877
vs2013可以用c編譯器嗎 瀏覽:376
下載的ios要解壓嗎 瀏覽:5
通達信pvi指標源碼 瀏覽:640
鄭州綠城通行app怎麼使用 瀏覽:314
雲南中文版伺服器託管雲空間 瀏覽:124
寬頻伺服器無響應是什麼情況 瀏覽:450
醫易時空醫學pdf 瀏覽:389
菠蘿筆記app怎麼樣 瀏覽:298
查看mysql表的命令 瀏覽:684
pomelo命令 瀏覽:840
51單片機音樂有延時 瀏覽:932
怎麼在appstore注銷 瀏覽:863
伺服器怎麼給別人發錢 瀏覽:94
路虎攬勝更換壓縮機 瀏覽:369
rediszset源碼解析 瀏覽:823
安卓如何設置自製鈴聲 瀏覽:573
java打開文件夾路徑 瀏覽:552
助眠視頻重度免疫者專用耳機解壓 瀏覽:936