自動載入

每次使用類或繼承時,沒有人想要 requireinclude。因為它可能很痛苦並且容易忘記,所以 PHP 提供了所謂的自動載入。如果你已經在使用 Composer,請閱讀使用 Composer 進行自動載入的內容

什麼是自動載入?

這個名字基本上都說明了一切。你沒有得到所請求的類儲存在檔案中,但 PHP 自動 matically 負荷這樣。

如何在沒有第三方程式碼的基本 PHP 中執行此操作?

__autoload 的功能,但使用 spl_autoload_register 被認為是更好的做法。每次在給定空間內未定義類時,PHP 都會考慮這些函式。因此,將 autoload 新增到現有專案是沒有問題的,因為定義的類(通過 require ie)將像以前一樣工作。為了準確起見,以下示例將使用匿名函式,如果使用 PHP <5.3,則可以定義函式並將其名稱作為引數傳遞給 spl_autoload_register

例子

spl_autoload_register(function ($className) {
    $path = sprintf('%s.php', $className);
    if (file_exists($path)) {
        include $path;
    } else {
        // file not found
    }
});

上面的程式碼只是嘗試使用 sprintf 包含一個帶有類名的檔名和附加的副檔名“.php” 。如果需要載入 FooBar,它看起來是否存在 FooBar.php,如果包含它。

當然,這可以擴充套件到適合專案的個人需求。如果類名中的 _ 用於分組,例如 User_PostUser_Image 都引用 User,則兩個類都可以儲存在名為 User 的資料夾中,如下所示:

spl_autoload_register(function ($className) {
    //                        replace _ by / or \ (depending on OS)
    $path = sprintf('%s.php', str_replace('_', DIRECTORY_SEPARATOR, $className) );
    if (file_exists($path)) {
        include $path;
    } else {
        // file not found
    }
});

User_Post 現在將從“User / Post.php”等載入。

spl_autoload_register 可根據不同需求量身定製。所有帶有類的檔案都被命名為“class.CLASSNAME.php”?沒問題。各種巢狀(User_Post_Content =>“User / Post / Content.php”)?沒問題。

如果你想要更復雜的自動載入機制 - 並且仍然不想包含 Composer - 你可以在不新增第三方庫的情況下工作。

spl_autoload_register(function ($className) {
    $path = sprintf('%1$s%2$s%3$s.php',
        // %1$s: get absolute path
        realpath(dirname(__FILE__)),
        // %2$s: / or \ (depending on OS)
        DIRECTORY_SEPARATOR,
        // %3$s: don't wory about caps or not when creating the files
        strtolower(
            // replace _ by / or \ (depending on OS)
            str_replace('_', DIRECTORY_SEPARATOR, $className)
        )
    );

    if (file_exists($path)) {
        include $path;
    } else {
        throw new Exception(
            sprintf('Class with name %1$s not found. Looked in %2$s.',
                $className,
                $path
            )
        );
    }
});

使用這樣的自動載入器,你可以愉快地編寫如下程式碼:

require_once './autoload.php'; // where spl_autoload_register is defined

$foo = new Foo_Bar(new Hello_World());

使用類:

class Foo_Bar extends Foo {}
class Hello_World implements Demo_Classes {}

這些例子將包括 foo/bar.phpfoo.phphello/world.phpdemo/classes.php 的類。