PHP use類檔案中的命名空間問題解析

2021-09-20 04:03:44 字數 2304 閱讀 8194

(沒想好title,見諒)

php的類檔案在被其他檔案include的時候不能直接使用其他檔案中的已定義的別名。

比如有三個檔案。

test.php 乙個簡單的指令碼執行檔案

namespaceclass.php 乙個類檔案,定義了乙個命名空間

usenamespace.php,乙個類檔案,使用了namespaceclass命名空間裡的類方法

如果在test.php檔案中先定義了乙個命名空間別名(use) ,且是namespaceclass的命名空間別名,然後直接include usenamespace.php,注意,先假設這裡的usenamespace.php裡不使用任何關於命名空間的東西。那麼test.php**能正常執行麼。

我們先來看看這三個檔案內容

test.php

use util\namespaceclass;

include("./namespaceclass.php");

include("./usenamespace.php");

usenamespace::out_put();

namespaceclass.php

namespace util;

class namespaceclass

}

usenamespace.php:

class usenamespace

}

從上面可以看出,namespaceclass.php裡定義了乙個命名空間util, 並定義了類namespaceclass, 以及乙個靜態方法out_put, 方法中只是輸出了一行字串

usenamespace.php中暫時未定義命名空間,但他的類方法直接呼叫了namespaceclass的方法,我們知道直接這麼做是錯誤的,因為兩個根本不在乙個命名空間內。

test.php直接靜態呼叫usenamespace的方法,最終希望輸出namespaceclass.php中的內容

如果就目前這種**,直接執行test.php,會發生社麼事情??

按照慣性思維,這種方式test從上到下,一次定義命名空間別名,載入類檔案,輸出結果,雖然最終的usenamespace不在namespaceclass的命名空間內,但最開始已經定義命名空間別名(use util\namespaceclass;)了, 應該會沒問題的了。

php fatal error:  class 'namespaceclass' not found in /tmp/usenamespace.php on line 7
結果卻出現了錯誤

慣性思維裡,php的include操作類似於把要include的檔案內容直接插入到該include的位置, 被include的檔案應該直接能使用原有檔案的已經定義的任何內容。

但實際上在命名空間這裡卻不一樣, 不同類檔案中的命名空間之間是相互分離的,即某個檔案中定義的use的命名空間,在其他的類檔案中不能使用。 

以下來自乙個大牛對我的指導(漲姿勢)

在包括其他的許多語言中,在定義類庫檔案的時候,會在類庫中定義好本身的依賴關係,並做好不同情況下的相容處理,而這也正式底層類庫的設計難點

我們php的命名空間正是這種依賴關係的乙個體現,在定義好了乙個類庫後,我們應該也要定義好他依賴的本類庫甚至是第三方的命名空間(用use),我們不能指望使用者在拿到這個類庫後還要自己去嘗試找到類的依賴命名空間,最起碼,我們應該給他乙個提示,使用了哪些命名空間,怎麼載入等等。

usenamespace.php中新增依賴類庫的命名空間別名

use util\namespaceclass;
以上就是今天遇到的關於php命名空間的乙個坑,謹記於此。

類命名空間 物件的命名空間 查詢順序

類命名空間與物件的命名空間 類的命名空間 建立乙個類就會建立乙個類的命名空間,用來儲存類中定義的所有名字,這些名字稱為類的屬性 類有兩種屬性 靜態屬性和動態屬性 靜態屬性 直接在類中定義的變數 動態屬性 定義在類中的方法 其中類的資料屬性是共享給所有物件的 id egg.role 434159407...

c 中regex的命名空間 c 命名空間

system.transactions 命名空間 注意 此命名空間在 net framework 2.0 版中是新增的。使用 system.transactions 命名空間包含的類可以編寫自己的事務應用程式和資源管理器。具體地說,可以建立和參與 與乙個或多個參與者 本地或分布式事務。system....

類的成員和命名空間

class a country 中國 靜態變數 靜態屬性 儲存在類的命名空間裡的 def init self,name,age 繫結方法 儲存在類的命名空間裡的 self.name name self.age age def func1 self pass def func2 self passcl...