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

資訊專欄INFORMATION COLUMN

【解惑】由namespace引發(fā)的關(guān)于加載的思考

yimo / 2965人閱讀

摘要:命名空間到底解決了什么問(wèn)題在入了關(guān)鍵字以及魔術(shù)常量,命名空間的作用是為了解決重名問(wèn)題。發(fā)現(xiàn)了腳本情況下只引入命名空間是找不到類的這個(gè)事實(shí)??梢杂泻芏鄬懛ê筒煌挠梅ǎ蚣茉诖嘶A(chǔ)上可以添加命名空間的映射,實(shí)現(xiàn)根據(jù)命名空間加載對(duì)應(yīng)目錄的工作。

1.命名空間到底解決了什么問(wèn)題?

PHP在5.3.0入了namespace關(guān)鍵字以及__NAMESPACE__魔術(shù)常量,命名空間的作用是為了解決重名問(wèn)題。當(dāng)然,這也是它唯一的作用了。

2.使用命名空間需要注意的點(diǎn)在哪?

你在當(dāng)前文件下引入兩個(gè)名字相同,命名空間不同的類,你可以通過(guò)use命名空間時(shí),as出來(lái)兩個(gè)別名的方式使類實(shí)例化的時(shí)候區(qū)分開使用。但你如果沒(méi)有引入這兩個(gè)類,僅僅use命名空間了,那么這兩個(gè)類是不能實(shí)例化的。
這里你可以簡(jiǎn)單的測(cè)試一下,看看已有命名空間的情況下,引入類文件和沒(méi)有引入能否found到類文件。

3.我們使用ide(phpstorm)的時(shí)候,直接敲出來(lái)這個(gè)類,然后ide會(huì)use需要的類命名空間,似乎就完成類文件的引入了?

重點(diǎn):命名空間并沒(méi)有做include/require文件的工作。
你要知道使用框架和沒(méi)有使用框架是不一樣的,框架會(huì)幫助你完成很多事。
相信你在第二步的時(shí)候。發(fā)現(xiàn)了php腳本情況下只引入命名空間是找不到類的這個(gè)事實(shí)。
so,回歸php本身,甭管你有沒(méi)有use這個(gè)類,當(dāng)進(jìn)程運(yùn)行到需要使用到這個(gè)類的時(shí)候,php都會(huì)把它當(dāng)做一個(gè)陌生的類。如果框架沒(méi)有幫助引入類的設(shè)計(jì),那么就會(huì)直接報(bào)錯(cuò)not found class了。

4.命名空間use在何時(shí)解析?

先上例子:

test.php

Print1();

namespace1.php

namespace my
ame;
class A {
        public function Print1(){
                echo 11;
        }
}

雖然require_once在use下面,也是可以正常運(yùn)行的,因?yàn)槌绦蛑挥性趎ew mynameA()的時(shí)候才去加載命名空間myname,use相當(dāng)于一種聲明。

5.有命名空間的類,框架怎么實(shí)現(xiàn)引入的工作呢?

此時(shí)有兩個(gè)函數(shù)可以幫到你,__autoload()和spl_autoload_register().

當(dāng)你引用不存在的類時(shí),__autoload()就會(huì)被調(diào)用,并且你的類名會(huì)被作為參數(shù)傳送過(guò)去(當(dāng)你同時(shí)使用命名空間,包含命名空間部分會(huì)一起作為參數(shù)傳送)。

首先有一個(gè)類文件Aritst.class.php:

 

在你的index.php文件里有個(gè)全局函數(shù),可以簡(jiǎn)單的理解成這個(gè)樣子:

 function __autoload($classname){
     $classpath="./".$classname.".php";
     if(file_exists($classpath)){
     require_once($classpath);
     }
     else{
      echo "class file".$classpath."not found!";
     }
}

在index.php中去實(shí)例化Artist類

$obj = new Artist();
$obj->doThing();

運(yùn)行index.php后正常輸出hello aritst!。
在index.php中,由于沒(méi)有包含Aritst.class.php,在實(shí)例化Aritst時(shí),自動(dòng)調(diào)用__autoload函數(shù),參數(shù)$class的值即為類名Aritst,此時(shí)Aritst.class.php就被引進(jìn)來(lái)了。

__autoload可以有很多寫法和不同的用法,php框架在此基礎(chǔ)上可以添加命名空間的映射,實(shí)現(xiàn)根據(jù)命名空間加載對(duì)應(yīng)目錄的工作。

再看spl_autoload_register(),這個(gè)函數(shù)與__autoload有與曲同工之妙,當(dāng)看個(gè)簡(jiǎn)單的例子:

doPrint();
?>

它告訴PHP碰到?jīng)]有定義的類就執(zhí)行autoRequire()。

6.composer內(nèi)部的命名空間又是怎么維護(hù)的?

兄弟,引入幾個(gè)有現(xiàn)代php編碼風(fēng)格的開發(fā)包,然后打開你的composer.json文件,認(rèn)真的閱讀它,

"autoload": {
        "psr-4": {
            "App": "app/"
        }
    },
    

在這里,指明了命名空間和目錄結(jié)構(gòu)映射的關(guān)系,如果你想個(gè)性化定制命名空間,可以在這里添加上,比如:

"autoload": {
    "psr-4": {
        "App": "app/",
        "Martistcn" : "app/martistcn"
    } 
},

運(yùn)行composer命令:

composer dumpautoload

就會(huì)增加一條映射關(guān)系:

// vendor/composer/autoload_psr4.php
return array(
    "App" => array($baseDir . "/app"),
    / ***** /
    "Martistcn" => array($baseDir . "/app/martistcn"),
);    

so,有址可循。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23097.html

相關(guān)文章

  • 「Metaspace容量不足觸發(fā)CMS GC」從而引發(fā)思考

    摘要:第一個(gè)大陡坡是應(yīng)用發(fā)布,老年代內(nèi)存占比下降,很正常。但此時(shí)老年代內(nèi)存使用占比。因?yàn)楹笃诓⒉粫?huì)引發(fā)??梢钥闯?,由于到達(dá)時(shí)候,觸發(fā)了一次和一次。但觸發(fā)時(shí),占比并沒(méi)用明顯的規(guī)律。得出,擴(kuò)容導(dǎo)致這個(gè)說(shuō)法,其實(shí)是不準(zhǔn)確的。 轉(zhuǎn)載請(qǐng)注明原文鏈接:https://www.jianshu.com/p/468... 某天早上,毛老師在群里問(wèn)「cat 上怎么看 gc」。 showImg(https://...

    StonePanda 評(píng)論0 收藏0
  • 一個(gè)問(wèn)題引發(fā)關(guān)于對(duì)象和對(duì)象子類型思考

    摘要:答案核心對(duì)象和對(duì)象子類型先看一段解釋第一個(gè)代表對(duì)象。第二個(gè)代表對(duì)象子類型。那么問(wèn)題來(lái)了,什么是不嚴(yán)謹(jǐn)?shù)恼f(shuō),中的所有,都是由對(duì)象衍生出來(lái)的對(duì)象子類型包括,和。 問(wèn)題:如題 var obj=new Object(); Object.prototype.toString.call(obj);// [object Object] var arr=new Array(); Object.pro...

    hatlonely 評(píng)論0 收藏0
  • 專治前端焦慮學(xué)習(xí)方案

    摘要:不過(guò)今天我希望能夠更進(jìn)一步,不僅僅再抱怨現(xiàn)狀,而是從我個(gè)人的角度來(lái)給出一個(gè)逐步深入學(xué)習(xí)生態(tài)圈的方案。最后,我還是想提到下對(duì)于的好的學(xué)習(xí)方法就是回顧參照各種各樣的代碼庫(kù),學(xué)習(xí)人家的用法與實(shí)踐。 本文翻譯自A-Study-Plan-To-Cure-JavaScript-Fatigue。筆者看到里面的幾張配圖著實(shí)漂亮,順手翻譯了一波。本文從屬于筆者的Web Frontend Introduc...

    codeGoogle 評(píng)論0 收藏0
  • 你所不知道HelloWorld背后原理

    摘要:今日最佳對(duì)于程序員而言,所謂的二八定律指的是花百分之八十的時(shí)間去學(xué)習(xí)日常研發(fā)中不常見的那百分之二十的原理。 【今日最佳】對(duì)于程序員而言,所謂的二八定律指的是 花百分之八十的時(shí)間去學(xué)習(xí)日常研發(fā)中不常見的那百分之二十的原理。 據(jù)說(shuō)阿里某程序員對(duì)書法十分感興趣,退休后決定在這方面有所建樹。于是花重金購(gòu)買了上等的文房四寶。 一日,飯后突生雅興,一番磨墨擬紙,并點(diǎn)上了上好的檀香,頗有王羲之風(fēng)范,...

    lavor 評(píng)論0 收藏0
  • 文件導(dǎo)出亂碼引發(fā)對(duì)字符編碼思考

    摘要:參考的資料前輩們已經(jīng)對(duì)字符編碼講的很好了,通俗易懂。字符編碼的誕生是人類對(duì)科學(xué)技術(shù)妥協(xié)的結(jié)果。字符編碼為什么有很多方式。這是從計(jì)算機(jī)層面總體上對(duì)字符編碼的認(rèn)識(shí)。中的一些字符集字符編碼知識(shí) 以前在工作中遇到導(dǎo)出中文亂碼時(shí),就google一下,看見把utf-8編碼換成GBK之類的編碼,導(dǎo)出在Excel中打開就不會(huì)亂碼了。只是解決了當(dāng)前問(wèn)題。對(duì)字符編碼沒(méi)有很好的認(rèn)識(shí)。這次又遇到了,遂記錄之。...

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

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

0條評(píng)論

閱讀需要支付1元查看
<