1. 程式人生 > >php名稱空間namespace自動載入

php名稱空間namespace自動載入

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自動載入。