php名稱空間namespace自動載入
阿新 • • 發佈:2019-02-11
php的名稱空間僅僅提供了一個邏輯上的類的隔離空間,我們在引用類時,仍要自己實現自動載入。思路就是使用一個未引入的類時,php自動觸發spl_autoload_register這個方法,然後就會根據名稱空間的結構解析為檔案路徑,引入相關的類檔案啦。
下面僅僅編寫一個簡單的自動載入方法。
(1).優先使用classMap載入基類。
建立classes.php基類對映檔案。當php自動載入時優先遍歷該檔案引入相關類檔案。
<?php
return [
'foo\base\Application' => 'base/Application.php',
'foo\base\Compiler' => 'base/Compiler.php',
'foo\base\Container' => 'base/Container.php',
'foo\base\Controller' => 'base/Controller.php',
'foo\base\Event' => 'base/Event.php',
'foo\base\Model' => 'base/Model.php',
'foo\base\Object' => 'base/Object.php',
'foo\base\Router' => 'base/Router.php' ,
'foo\base\Template' => 'base/Template.php',
];
(2)載入其他類。其他類在app名稱空間下,包括controllers,models兩個子名稱空間。
<?php
$classMap = require(__DIR__ . '/classes.php');
$dirList = ['controllers', 'models'];//強制僅有子兩個名稱空間
spl_autoload_register(function ($class) use ($classMap, $dirList){
if (!empty($classMap [$class])) {
require($classMap[$class]);
} else {
list($alias, $dir, $class) = explode('\\', $class);
if ($alias === 'app' && in_array($dir, $dirList)) {
$controllerFile = '../' . $dir . '/'. $class . '.php';
if (file_exists($controllerFile)) {
require($controllerFile);
} else {
throw new \Exception('控制器不存在!');
}
} else {
throw new \Exception('載入' . $class . '類檔案失敗!');
}
}
});
在某一類中使用using app\models\User;然後php就會自動載入models資料夾下的User類了。
要想使用第三方開發者的php類包,可以用composer自動載入。