PHP use類文件中的命名空間問題解析


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

{

   public static function out_put()

   {

      echo "This is a Utils namespace \n";

   }

}

 

UseNameSpace.php

 

class UseNameSpace

{

        public static function use_out_put()

        {

                echo NameSpaceClass::out_put();

        }

}

從上面可以看出, 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

結果卻出現了錯誤

分析

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

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

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

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

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

解決

UseNameSpace.php中添加依賴類庫的命名空間別名

use Util\NameSpaceClass;

以上就是今天遇到的關於php命名空間的一個坑,謹記於此。正在學習PHP的朋友可以去麥子學院官網找找學習資料哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM