1.命名空間+類自動加載+yii2+psr-4標準

1.命名空間

PHP 命名空間可以解決以下兩類問題:
1) 用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突峦萎。
2) 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱攒射,提高源代碼的可讀性朗和。

2.類自動加載

spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
autoload_function:
欲注冊的自動裝載函數(shù)。如果沒有提供任何參數(shù)料滥,則自動注冊 autoload 的默認實現(xiàn)函數(shù)spl_autoload()
throw:
此參數(shù)設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常躺涝。
prepend:
如果是 true,spl_autoload_register() 會添加函數(shù)到隊列之首扼雏,而不是隊列尾部坚嗜。

3.psr4

1.此處的“類”泛指所有的class類夯膀、接口、traits可復用代碼塊以及其它類似結構苍蔬。
2.一個完整的類名需具有以下結構:
???? <命名空間>(<子命名空間>)*<類名>
????1)完整的類名必須要有一個頂級命名空間诱建,被稱為 "vendor namespace";
???? 2)完整的類名可以有一個或多個子命名空間碟绑;
????3)完整的類名必須有一個最終的類名俺猿;
????4)完整的類名中任意一部分中的下滑線都是沒有特殊含義的;
????5)完整的類名可以由任意大小寫字母組成格仲;
????6)所有類名都必須是大小寫敏感的押袍。
3.當根據(jù)完整的類名載入相應的文件……
????1)完整的類名中,去掉最前面的命名空間分隔符凯肋,前面連續(xù)的一個或多個命名空間和子命名空間谊惭,作為“命名空間前綴”,其必須與至少一個“文件基目錄”相對應否过;
????2)緊接命名空間前綴后的子命名空間必須與相應的”文件基目錄“相匹配午笛,其中的命名空間分隔符將作為目錄分隔符。
????3)末尾的類名必須與對應的以 .php 為后綴的文件同名苗桂。
????4)自動加載器(autoloader)的實現(xiàn)一定不能拋出異常药磺、一定不能觸發(fā)任一級別的錯誤信息以及不應該有返回值

使用PSR4,有2個好處:1. 減少代碼目錄的深度;2. 可以通過前綴快速找到映射目錄煤伟,提高自動加載的效率
ps:psr0與psr4主要區(qū)別:1.psr0比4多了 一條類名的_下劃線轉換成目錄癌佩。2.psr4比0多了一個 命名空間前綴和目錄的替換關系 當加載類的時候類名空間指定的前綴會被替換成路徑再加上后面的子空間和類名 構成實際加載地址。而0沒有這個對應關系便锨。命名空間直接轉換為目錄再加上指定的目錄前綴構成實際的加載地址围辙。

4.yii2

index.php

require($_SERVER['ENV_FRAMEWORK_DIR'] . 'autoload.php');//yii2的自動加載文件
require($_SERVER['ENV_FRAMEWORK_DIR'] . 'yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');



$config = require(__DIR__ . '/../ordinary/config/main.php');

autoload.php

require_once __DIR__ . '/composer' . '/autoload_real.php';

return ComposerAutoloaderInitcf708c3c6363e39b2b6c83d3e69ad060::getLoader();

autoload_real.php

        spl_autoload_register(array('ComposerAutoloaderInitcf708c3c6363e39b2b6c83d3e69ad060', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInitcf708c3c6363e39b2b6c83d3e69ad060', 'loadClassLoader'));

        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

ClassLoader.php

       // PSR-4 lookup
        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
        $first = $class[0];
        if (isset($this->prefixLengthsPsr4[$first])) {
            foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
                        if (is_file($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
                            return $file;
                        }
                    }
                }
            }
        }

        // PSR-4 fallback dirs
        foreach ($this->fallbackDirsPsr4 as $dir) {
            if (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
                return $file;
            }
        }

yii2 通過require加載自身的autoload.php文件,導入autoload_real.php放案,這個文件將文件autoload_classmap.php,autoload_files,autoload_namespaces.php,autoload_psr4.php注入到類Classloader中姚建,ClassLoader通過psr-4,namaspace,files(直接require),classmap(類名=>文件所在路徑)四種方式來加載文件,順序依次是判斷classmap中有沒有這個類吱殉,有直接require他的文件路徑掸冤,然后根據(jù)psr4規(guī)則拼接路徑尋找文件,最后根據(jù)psr0規(guī)則拼接路徑尋找文件友雳,

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稿湿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子押赊,更是在濱河造成了極大的恐慌饺藤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涕俗,居然都是意外死亡罗丰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門咽袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸卷,“玉大人,你說我怎么就攤上這事询刹∶占担” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵凹联,是天一觀的道長沐兰。 經(jīng)常有香客問我,道長蔽挠,這世上最難降的妖魔是什么住闯? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮澳淑,結果婚禮上比原,老公的妹妹穿的比我還像新娘。我一直安慰自己杠巡,他們只是感情好量窘,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氢拥,像睡著了一般蚌铜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫩海,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天冬殃,我揣著相機與錄音,去河邊找鬼叁怪。 笑死审葬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奕谭。 我是一名探鬼主播耳璧,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼展箱!你這毒婦竟也來了?” 一聲冷哼從身側響起蹬昌,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤混驰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栖榨,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡昆汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了婴栽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片满粗。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡颤专,死狀恐怖青扔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凉敲,我是刑警寧澤轰枝,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布捅彻,位于F島的核電站,受9級特大地震影響鞍陨,放射性物質(zhì)發(fā)生泄漏步淹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一诚撵、第九天 我趴在偏房一處隱蔽的房頂上張望缭裆。 院中可真熱鬧,春花似錦寿烟、人聲如沸澈驼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盅藻。三九已至,卻和暖如春畅铭,著一層夾襖步出監(jiān)牢的瞬間氏淑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工硕噩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留假残,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓炉擅,卻偏偏與公主長得像辉懒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谍失,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容