自動載入
每次使用類或繼承時,沒有人想要 require
或 include
。因為它可能很痛苦並且容易忘記,所以 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_Post
和 User_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.php
,foo.php
,hello/world.php
和 demo/classes.php
的類。