成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP use類(lèi)文件中的命名空間問(wèn)題解析

Zack / 2238人閱讀

摘要:但實(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)題的了。

實(shí)踐結(jié)果
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

相關(guān)文章

  • PHP命名空間

    摘要:命名空間的支持版本,。另外,在目錄外訪問(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ì)于...

    RaoMeng 評(píng)論0 收藏0
  • 【轉(zhuǎn)】php命名空間

    摘要:命名空間可以解決以下兩類(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)重要...

    Jrain 評(píng)論0 收藏0
  • 【解惑】由namespace引發(fā)的關(guān)于加載的思考

    摘要:命名空間到底解決了什么問(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ù)常量,命名空間的作用是為了解決重...

    yimo 評(píng)論0 收藏0
  • php易錯(cuò)筆記-類(lèi)與對(duì)象,命名空間

    摘要:類(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í)例 ...

    MartinHan 評(píng)論0 收藏0
  • PHP自動(dòng)加載功能原理解析

    摘要:前言在開(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...

    Imfan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<