spl_autoload_register() 函數實現的自動加載


和Python用module來區分代碼塊不同,PHP按照命名空間來區分,開始學PHP的時候一心認定了如果想用 use 關鍵字來導入(Python的習慣說法)一個類或者函數或者其他對象的話,必須先include該對象所在的文件,或者require該文件.相當於是把該文件代碼加載到內存代碼塊中,從而能夠搜索代碼塊並使用.

但是看了thinkPHP框架和guthub上一些項目后發現他們的代碼挺瀟灑的,居然不用include/require.這讓我對自己的認識產生了質疑...

少廢話了,自動加載使用的是PHP的

spl_autoload_register

函數,該函數的作用是用於注冊一些搜索規則*

當代碼需要引用某些變量,類等的時候,如果當前內存代碼塊中沒有,那么就會從這些注冊的規則中取挨個的套用匹配,直到找不到,然后報錯.

函數使用方式:

spl_autoload_register(function, throw, prepend)  // throw 全都找不到是否拋錯 prepend 是否將規則加在隊列最前面(如果你的規則十分個性獨特,就可以放在最前面)

也可以用匿名函數的方式:

<?php

namespace spa;

spl_autoload_register(function ($class) {
    echo "wanted " . $class . "\n";
    if ($class == "spa\Space") {
        $class = "Space.php";
    } elseif ($class == "spa\Ele") {
        $class = __DIR__."/../learn_php/Ele.php";
    }
    include_once $class;
});

通過測試發現,每次需要執行本文件本命名空間不存在的代碼塊的時候,都會執行一遍如上注冊的函數,然后echo出的信息,當然項目框架最好是按照嚴格的命名規范來,這樣也容易寫出匹配規則,然后把該函數在項目的必經之路上執行一遍,就可以和那些瀟灑的代碼一樣,直接 use ,不用include/require 文件了.

*注意:

注冊規則的代碼一定要最先執行,或者至少要在你本應當執行include/require之前被執行.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM