帶小白理解php的自動加載

什麼是自動加載

自動加載是指在你想使用某個類,但你沒有require 對應的.php文件的時候,程序幫你自動加載了php文件。(require是件很痛苦的事情OvO)
在沒有自動加載之前,你的代碼可能是如下這樣的:

<?php
require "app/Database.php";
require "app/Models/User.php";
require "config/app.php";
......
$user = new Database();
$user = new User();

引入了好多的require,隨着項目的不斷迭代,會很亂。這樣的設計並不好。
php5.3之後,實現了自動加載,可以通過spl_autoload_register()方法進行php文件的的自動引入。spl_autoload_register()有三個參數。

spl_autoload_register('autoload1',true,true);
第一個參數是當需要創建的類不存在時,調用autoload1()這個方法。
第二個參數爲true時,當類的自動加載函數無法成功註冊時會拋出異常。
第三個參數爲true時,spl_autoload_register()方法會添加類的自動加載函數到隊列之首,而不是隊列尾部。

因此,我們最後的代碼會是這樣:

define('BASEDIR', __DIR__);
public static function autoload($class)
    {
        require BASEDIR . '/' . str_replace('\\', '/', $class) . '.php';
    }
spl_autoload_register('autoload');
$operation = new IMooc\Operation(10);

執行過程

圖片描述
首先定義了一個常量爲BASEDIR爲當前的目錄(根目錄),(1)當程序執行到&dollar;operation = new IMoocOperation(10);時,php引擎就會搜索作用域下是否有IMoocOperation這個類,如果有,則正常引入,如果沒有則(2)調用spl_autoload_register()方法,然後再執行(3)autoload方法,autoload的參數&dollar;class爲文件路徑,根據psr-4規範,文件名要與類名相互對應,(也就是說,User.php文件只能有一個class,而且class名字必須是User),所以你在引入了php文件後,相當於引入了這個類,就可以調用相應的方法了。
antuoload()在這個例子中被解析爲

public static function autoload($class)
    {
        require ‘imooc/IMooc/Operation.php’;
    }

引入了這個類,自然就可以使用new Operation()對象。
也就是說,只要你的代碼符合psr-4規範,不需要require就可以自動加載相應的類。想象一下,你並不需要引入對應的類就可以直接使用,這很棒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章