PHP自動(dòng)加載介紹(autoload)

參考
PHP中的自動(dòng)加載

什么叫Autoload?

在某個(gè)php執(zhí)行上下文中观蜗,在new某個(gè)類臊恋,或者靜態(tài)調(diào)用時(shí)如果某個(gè)類沒有找到,php默認(rèn)會(huì)首先觸發(fā)__autoload回調(diào)墓捻,由回調(diào)嘗試去加載類代碼文件抖仅。這個(gè)回調(diào)由用戶自己實(shí)現(xiàn),通過用戶規(guī)定的類名到代碼文件的映射規(guī)則得到代碼文件路徑砖第,并使用require/include函數(shù)去加載代碼文件撤卢。

比如:

<?php
__autoload($clsname) {
    require $clsname.'.php';
}

$a = new A();

但是,__autoload有一個(gè)不好的地方是只允許注冊(cè)一個(gè)回調(diào)梧兼。同時(shí)放吩,因?yàn)槲覀冊(cè)谑褂靡恍┑谌筋悗?kù)的時(shí)候,經(jīng)常需要維護(hù)各自的autoload調(diào)用規(guī)則羽杰。所以渡紫,這里在php5.1.2之后,我們大多使用spl_autoload_register來替代__autoload忽洛。

  • spl_autoload_register的用法很簡(jiǎn)單:
spl_autoload_register(function($clsname){
    $clspath = explode('\\',$clsname);
    if($clspath[0] === 'web') {
        $clspath[0] = 'src';
    }
    require dirname(__DIR__).DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR,$clspath).'.php';
});

它的參數(shù)其實(shí)就是一個(gè)__autoload回調(diào)腻惠,你可以多次調(diào)用spl_autoload_register來往隊(duì)列注冊(cè)多個(gè)回調(diào)。

這樣欲虚,使用autoload函數(shù)的好處是集灌,如果我一個(gè)代碼文件中需要使用100個(gè)類,我不需要一個(gè)個(gè)的將其require進(jìn)來复哆,我只需要將其按照一定的規(guī)范組織代碼文件欣喧。然后注冊(cè)一個(gè)autoload函數(shù),按照我們的規(guī)范來自動(dòng)的根據(jù)類名來找到對(duì)應(yīng)的類文件梯找,并require到當(dāng)前執(zhí)行環(huán)境唆阿。

關(guān)于PHP的Autoload,我們不得不提的是PSR0-PSR4規(guī)范锈锤。這兩個(gè)規(guī)范不是PHP的語(yǔ)言標(biāo)準(zhǔn)的一部分驯鳖,只是PHP使用自動(dòng)加載的代碼組織過程中的一個(gè)標(biāo)準(zhǔn)規(guī)范,當(dāng)然你可以完全不遵循這個(gè)規(guī)范久免,但是建議你最好能夠遵循浅辙。

  • 一個(gè)簡(jiǎn)單的AutoLoader實(shí)例
/**
 * 自動(dòng)加載器,遵循psr-4規(guī)范
 * @author fangl
 *
 */
class Autoloader {

    static $_namespaces = [
        'web' => 'src',
    ];

    /**
     * 增加命名空間到路徑的映射(以幫助自動(dòng)加載器能夠找到對(duì)應(yīng)的路徑)
     * 注意對(duì)應(yīng)的代碼里面的命名空間要和聲明一致阎姥,否則即使文件正確引入记舆,也會(huì)報(bào)找不到類文件錯(cuò)誤
     * @param string $namespace 命名空間(只接受一個(gè)字符串)
     * @param string $path 命名空間對(duì)應(yīng)的路徑
     */
    static function addNameSpace($namespace,$path) {
        self::$_namespaces[trim($namespace,'\\/')] = trim($path,'\\/');
    }

    /**
     * 獲取命名空間的加載路徑,如果命名空間不存在呼巴,返回原值
     * @param string $namespace
     * @return Ambigous <unknown, multitype:string , string>
     */
    static function getPath($namespace) {
        return isset(self::$_namespaces[$namespace])?self::$_namespaces[$namespace]:$namespace;
    }

    /**
     * 自動(dòng)加載回調(diào)函數(shù)
     * @param string $clsname
     */
    static function autoload($clsname) {
        $clsname = trim($clsname,'\\/');
        $clspath = explode('\\',$clsname);
        $clspath[0] = self::getPath($clspath[0]);
        require APP_ROOT.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR,$clspath).'.php';
    }
}

//注冊(cè)自動(dòng)加載
spl_autoload_register(__NAMESPACE__.'\Autoloader::autoload');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泽腮,一起剝皮案震驚了整個(gè)濱河市御蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诊赊,老刑警劉巖厚满,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異豪筝,居然都是意外死亡痰滋,警方通過查閱死者的電腦和手機(jī)摘能,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門续崖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人团搞,你說我怎么就攤上這事严望。” “怎么了逻恐?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵像吻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我复隆,道長(zhǎng)拨匆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任挽拂,我火速辦了婚禮惭每,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亏栈。我一直安慰自己台腥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布绒北。 她就那樣靜靜地躺著黎侈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闷游。 梳的紋絲不亂的頭發(fā)上峻汉,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音脐往,去河邊找鬼休吠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钙勃,可吹牛的內(nèi)容都是我干的蛛碌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼辖源,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔚携!你這毒婦竟也來了希太?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤酝蜒,失蹤者是張志新(化名)和其女友劉穎誊辉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亡脑,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕澄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霉咨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛙紫。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖途戒,靈堂內(nèi)的尸體忽然破棺而出坑傅,到底是詐尸還是另有隱情,我是刑警寧澤喷斋,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布唁毒,位于F島的核電站,受9級(jí)特大地震影響星爪,放射性物質(zhì)發(fā)生泄漏浆西。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一顽腾、第九天 我趴在偏房一處隱蔽的房頂上張望近零。 院中可真熱鬧,春花似錦崔泵、人聲如沸秒赤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)入篮。三九已至,卻和暖如春幌甘,著一層夾襖步出監(jiān)牢的瞬間潮售,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工锅风, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酥诽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓皱埠,卻偏偏與公主長(zhǎng)得像肮帐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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