PHP use類文件中的命名空間問題
PHP的類文件在被其他文件include的時候不能直接使用其他文件中的已定義的別名。對於此你瞭解多少呢?下面是相關的知識,歡迎閲讀。
比如有三個文件。
一個簡單的腳本運行文件
一個類文件,定義了一個命名空間
,一個類文件,使用了NameSpaceClass命名空間裏的類方法
問題描述
如果在文件中先定義了一個命名空間別名(use) ,且是NameSpaceClass的命名空間別名,然後直接include ,注意,先假設這裏的裏不使用任何關於命名空間的東西。那麼代碼能正常運行麼。
實踐
我們先來看看這三個文件內容
use UtilNameSpaceClass;
include("./");
include("./");
UseNameSpace::out_put();
namespace Util;
class NameSpaceClass
{
public static function out_put()
{
echo "This is a Utils namespace";
}
}
:
class UseNameSpace
{
public static function use_out_put()
{
echo NameSpaceClass::out_put();
}
}
從上面可以看出, 裏定義了一個命名空間Util, 並定義了類NameSpaceClass, 以及一個靜態方法out_put, 方法中只是輸出了一行字符串
中暫時未定義命名空間,但他的類方法直接調用了NameSpaceClass的方法,我們知道直接這麼做是錯誤的,因為兩個根本不在一個命名空間內。
直接靜態調用UseNameSpace的方法,最終希望輸出中的內容
假設
如果就目前這種代碼,直接運行,會發生社麼事情??
按照慣性思維,這種方式test從上到下,一次定義命名空間別名,加載類文件,輸出結果,雖然最終的UseNameSpace不在NameSpaceClass的命名空間內,但最開始已經定義命名空間別名(use UtilNameSpaceClass;)了, 應該會沒問題的了。
實踐結果
PHP Fatal error: Class 'NameSpaceClass' not found in /tmp/ on line 7
結果卻出現了錯誤
分析
慣性思維裏,php的include操作類似於把要include的文件內容直接插入到該include的位置, 被include的文件應該直接能使用原有文件的已經定義的任何內容。
但實際上在命名空間這裏卻不一樣, 不同類文件中的命名空間之間是相互分離的',即某個文件中定義的use的命名空間,在其他的類文件中不能使用。
以下來自一個大牛對我的指導(漲姿勢)
在包括其他的許多語言中,在定義類庫文件的時候,會在類庫中定義好本身的依賴關係,並做好不同情況下的兼容處理,而這也正式底層類庫的設計難點
我們PHP的命名空間正是這種依賴關係的一個體現,在定義好了一個類庫後,我們應該也要定義好他依賴的本類庫甚至是第三方的命名空間(用use),我們不能指望用户在拿到這個類庫後還要自己去嘗試找到類的依賴命名空間,最起碼,我們應該給他一個提示,使用了哪些命名空間,怎麼加載等等。
解決
在中添加依賴類庫的命名空間別名
use UtilNameSpaceClass;
-
PHP中閉包的一些常見問題
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現,而且支持幾乎所有流行的數據庫以及操作系統。最重要的是PHP可以用C、C++進行程序的擴展!以下是小編為大家搜索整理的PHP中閉包的一些常見問題,希望能給大家帶來幫助!更多精彩內容請持續關注我們應屆畢業生考試...
-
php修改上傳文件大小限制實例詳解
php在默認情況下,只允許上傳一定大小的文件,當上傳文件大小超過這個值時,將會出錯。本文章將向大家講解中如何修改上傳文件大小限制。需要修改的設置有三個地方,請看下文:1、修改max_execution_time在php中,默認的頁面最久執行時間為30秒,超過30秒,該腳本就停止執行....
-
PHP工程師應該掌握的知識結構
作為一名合格的PHP工程師的知識結構是怎樣的?下面是本站小編精心為大家整理的PHP工程師應該掌握的知識結構,希望對大家有幫助,更多內容請關注應屆畢業生網!一x方面Linux常用命令1.文件處理命令2.權限管理命令3.幫助命令4.文件搜索命令5.壓縮解壓命令6.命令使用技...
-
PHP中Http協議post請求參數
本文給大家介紹PHP中Http協議post請求參數,具體內容如下所示,就跟隨本站小編一起去了解下吧,想了解更多相關信息請持續關注我們應屆畢業生考試網!WEB開發中信息基本全是在POST與GET請求與響應中進行,GET因其基於URL的直觀,易被我們瞭解,可POST請求因其信息的隱蔽,在...