- 相關(guān)推薦
PHP use類文件中的命名空間問題
PHP的類文件在被其他文件include的時候不能直接使用其他文件中的已定義的別名。對于此你了解多少呢?下面是相關(guān)的知識,歡迎閱讀。
比如有三個文件。
test.php 一個簡單的腳本運(yùn)行文件
NameSpaceClass.php 一個類文件,定義了一個命名空間
UseNameSpace.php,一個類文件,使用了NameSpaceClass命名空間里的類方法
問題描述
如果在test.php文件中先定義了一個命名空間別名(use) ,且是NameSpaceClass的命名空間別名,然后直接include UseNameSpace.php,注意,先假設(shè)這里的UseNameSpace.php里不使用任何關(guān)于命名空間的東西。那么test.php代碼能正常運(yùn)行么。
實(shí)踐
我們先來看看這三個文件內(nèi)容
test.php
use UtilNameSpaceClass;
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 ";
}
}
UseNameSpace.php:
class UseNameSpace
{
public static function use_out_put()
{
echo NameSpaceClass::out_put();
}
}
從上面可以看出, NameSpaceClass.php里定義了一個命名空間Util, 并定義了類NameSpaceClass, 以及一個靜態(tài)方法out_put, 方法中只是輸出了一行字符串
UseNameSpace.php 中暫時未定義命名空間,但他的類方法直接調(diào)用了NameSpaceClass的方法,我們知道直接這么做是錯誤的,因?yàn)閮蓚根本不在一個命名空間內(nèi)。
test.php 直接靜態(tài)調(diào)用UseNameSpace的方法,最終希望輸出NameSpaceClass.php中的內(nèi)容
假設(shè)
如果就目前這種代碼,直接運(yùn)行test.php,會發(fā)生社么事情??
按照慣性思維,這種方式test從上到下,一次定義命名空間別名,加載類文件,輸出結(jié)果,雖然最終的UseNameSpace不在NameSpaceClass的命名空間內(nèi),但最開始已經(jīng)定義命名空間別名(use UtilNameSpaceClass;)了, 應(yīng)該會沒問題的了。
實(shí)踐結(jié)果
PHP Fatal error: Class 'NameSpaceClass' not found in /tmp/UseNameSpace.php on line 7
結(jié)果卻出現(xiàn)了錯誤
分析
慣性思維里,php的include操作類似于把要include的文件內(nèi)容直接插入到該include的位置, 被include的文件應(yīng)該直接能使用原有文件的已經(jīng)定義的任何內(nèi)容。
但實(shí)際上在命名空間這里卻不一樣, 不同類文件中的命名空間之間是相互分離的,即某個文件中定義的use的命名空間,在其他的類文件中不能使用。
以下來自一個大牛對我的指導(dǎo)(漲姿勢)
在包括其他的許多語言中,在定義類庫文件的時候,會在類庫中定義好本身的依賴關(guān)系,并做好不同情況下的兼容處理,而這也正式底層類庫的設(shè)計難點(diǎn)
我們PHP的命名空間正是這種依賴關(guān)系的一個體現(xiàn),在定義好了一個類庫后,我們應(yīng)該也要定義好他依賴的本類庫甚至是第三方的命名空間(用use),我們不能指望用戶在拿到這個類庫后還要自己去嘗試找到類的依賴命名空間,最起碼,我們應(yīng)該給他一個提示,使用了哪些命名空間,怎么加載等等。
解決
在UseNameSpace.php中添加依賴類庫的命名空間別名
use UtilNameSpaceClass;
【PHP use類文件中的命名空間問題】相關(guān)文章:
PHP中的命名空間介紹09-01
PHP中命名空間的方法05-07
PHP關(guān)鍵特性之命名空間實(shí)例09-27
php中目錄文件操作詳談09-20
PHP中讀取大文件的方法11-10
PHP語言的命名規(guī)則09-29
如何在PHP下載文件名中解決亂碼的問題08-02
如何打開php文件 php文件怎么打開09-06