摘要:但實(shí)際上在命名空間這里卻不一樣,不同類(lèi)文件中的命名空間之間是相互分離的,即某個(gè)文件中定義的的命名空間,在其他的類(lèi)文件中不能使用。解決在中添加依賴類(lèi)庫(kù)的命名空間別名以上就是今天遇到的關(guān)于命名空間的一個(gè)坑,謹(jǐn)記于此。
(沒(méi)想好title,見(jiàn)諒)
導(dǎo)讀PHP的類(lèi)文件在被其他文件include的時(shí)候不能直接使用其他文件中的已定義的別名。
比如有三個(gè)文件。
test.php 一個(gè)簡(jiǎn)單的腳本運(yùn)行文件 NameSpaceClass.php 一個(gè)類(lèi)文件,定義了一個(gè)命名空間 UseNameSpace.php,一個(gè)類(lèi)文件,使用了NameSpaceClass命名空間里的類(lèi)方法問(wèn)題描述
如果在test.php文件中先定義了一個(gè)命名空間別名(use) ,且是NameSpaceClass的命名空間別名,然后直接include UseNameSpace.php,注意,先假設(shè)這里的UseNameSpace.php里不使用任何關(guān)于命名空間的東西。那么test.php代碼能正常運(yùn)行么。
實(shí)踐我們先來(lái)看看這三個(gè)文件內(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里定義了一個(gè)命名空間Util, 并定義了類(lèi)NameSpaceClass, 以及一個(gè)靜態(tài)方法out_put, 方法中只是輸出了一行字符串
UseNameSpace.php 中暫時(shí)未定義命名空間,但他的類(lèi)方法直接調(diào)用了NameSpaceClass的方法,我們知道直接這么做是錯(cuò)誤的,因?yàn)閮蓚€(gè)根本不在一個(gè)命名空間內(nèi)。
test.php 直接靜態(tài)調(diào)用UseNameSpace的方法,最終希望輸出NameSpaceClass.php中的內(nèi)容
假設(shè)如果就目前這種代碼,直接運(yùn)行test.php,會(huì)發(fā)生社么事情??
按照慣性思維,這種方式test從上到下,一次定義命名空間別名,加載類(lèi)文件,輸出結(jié)果,雖然最終的UseNameSpace不在NameSpaceClass的命名空間內(nèi),但最開(kāi)始已經(jīng)定義命名空間別名(use UtilNameSpaceClass;)了, 應(yīng)該會(huì)沒(méi)問(wèn)題的了。
PHP Fatal error: Class "NameSpaceClass" not found in /tmp/UseNameSpace.php on line 7
結(jié)果卻出現(xiàn)了錯(cuò)誤
分析慣性思維里,php的include操作類(lèi)似于把要include的文件內(nèi)容直接插入到該include的位置, 被include的文件應(yīng)該直接能使用原有文件的已經(jīng)定義的任何內(nèi)容。
但實(shí)際上在命名空間這里卻不一樣, 不同類(lèi)文件中的命名空間之間是相互分離的,即某個(gè)文件中定義的use的命名空間,在其他的類(lèi)文件中不能使用。
以下來(lái)自一個(gè)大牛對(duì)我的指導(dǎo)(漲姿勢(shì))
在包括其他的許多語(yǔ)言中,在定義類(lèi)庫(kù)文件的時(shí)候,會(huì)在類(lèi)庫(kù)中定義好本身的依賴關(guān)系,并做好不同情況下的兼容處理,而這也正式底層類(lèi)庫(kù)的設(shè)計(jì)難點(diǎn)
我們PHP的命名空間正是這種依賴關(guān)系的一個(gè)體現(xiàn),在定義好了一個(gè)類(lèi)庫(kù)后,我們應(yīng)該也要定義好他依賴的本類(lèi)庫(kù)甚至是第三方的命名空間(用use),我們不能指望用戶在拿到這個(gè)類(lèi)庫(kù)后還要自己去嘗試找到類(lèi)的依賴命名空間,最起碼,我們應(yīng)該給他一個(gè)提示,使用了哪些命名空間,怎么加載等等。
解決在UseNameSpace.php中添加依賴類(lèi)庫(kù)的命名空間別名
use UtilNameSpaceClass;
以上就是今天遇到的關(guān)于php命名空間的一個(gè)坑,謹(jǐn)記于此。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20945.html
摘要:命名空間的支持版本,。另外,在目錄外訪問(wèn)文件時(shí),我們必須將目錄名以及目錄分隔符放在文件名之前得到。定義命名空間命名空間通過(guò)關(guān)鍵字來(lái)聲明。常量常量的值是包含當(dāng)前命名空間名稱的字符串。 *命名空間的支持版本:PHP 5 > 5.3.0,PHP 7 。 什么是命名空間 從廣義上來(lái)說(shuō),命名空間是一種封裝事物的方法。在很多地方都可以見(jiàn)到這種抽象概念。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組,對(duì)于...
摘要:命名空間可以解決以下兩類(lèi)問(wèn)題用戶編寫(xiě)的代碼與內(nèi)部的類(lèi)函數(shù)常量或第三方類(lèi)函數(shù)常量之間的名字沖突。在命名空間內(nèi)部訪問(wèn)全局類(lèi)函數(shù)和常量調(diào)用全局函數(shù)訪問(wèn)全局常量實(shí)例化全局類(lèi)命名空間和動(dòng)態(tài)語(yǔ)言特征命名空間的實(shí)現(xiàn)受到其語(yǔ)言自身的動(dòng)態(tài)特征的影響。 PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學(xué)過(guò)C#和Java,那命名空間就不算什么新事物。 不過(guò)在PHP當(dāng)中還是有著相當(dāng)重要...
摘要:命名空間到底解決了什么問(wèn)題在入了關(guān)鍵字以及魔術(shù)常量,命名空間的作用是為了解決重名問(wèn)題。發(fā)現(xiàn)了腳本情況下只引入命名空間是找不到類(lèi)的這個(gè)事實(shí)。可以有很多寫(xiě)法和不同的用法,框架在此基礎(chǔ)上可以添加命名空間的映射,實(shí)現(xiàn)根據(jù)命名空間加載對(duì)應(yīng)目錄的工作。 1.命名空間到底解決了什么問(wèn)題? PHP在5.3.0入了namespace關(guān)鍵字以及__NAMESPACE__魔術(shù)常量,命名空間的作用是為了解決重...
摘要:類(lèi)與對(duì)象基本概念如果在之后跟著的是一個(gè)包含有類(lèi)名的字符串,則該類(lèi)的一個(gè)實(shí)例被創(chuàng)建。如果該類(lèi)屬于一個(gè)名字空間,則必須使用其完整名稱。如果一個(gè)類(lèi)被聲明為,則不能被繼承。命名空間通過(guò)關(guān)鍵字來(lái)聲明。 類(lèi)與對(duì)象 基本概念 new:如果在 new 之后跟著的是一個(gè)包含有類(lèi)名的字符串,則該類(lèi)的一個(gè)實(shí)例被創(chuàng)建。如果該類(lèi)屬于一個(gè)名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個(gè)實(shí)例 ...
摘要:前言在開(kāi)始之前,歡迎關(guān)注我自己的博客這篇文章是對(duì)自動(dòng)加載功能的一個(gè)總結(jié),內(nèi)容涉及的自動(dòng)加載功能的命名空間的與標(biāo)準(zhǔn)等內(nèi)容。要實(shí)現(xiàn)第一步,第二步的功能,必須在開(kāi)發(fā)時(shí)約定類(lèi)名與磁盤(pán)文件的映射方法,只有這樣我們才能根據(jù)類(lèi)名找到它對(duì)應(yīng)的磁盤(pán)文件。 前言 在開(kāi)始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn 這篇文章是對(duì)PHP自動(dòng)加載功能的一個(gè)總結(jié),內(nèi)容涉及PHP的自動(dòng)加載功能、P...
閱讀 2842·2021-11-18 10:02
閱讀 3714·2021-11-15 17:59
閱讀 2336·2021-09-06 15:00
閱讀 3371·2019-08-29 16:58
閱讀 1089·2019-08-26 10:34
閱讀 1615·2019-08-26 10:15
閱讀 1323·2019-08-26 10:11
閱讀 2747·2019-08-23 18:33