Yii 1.x 預設靠 Yii::import() 按路徑別名載入類,大量第三方庫需手動 import 或配置 import 數組,啟動開銷大、維護麻煩。
Yii 基類定義靜態屬性 $classMap,鍵為類名,值為文件路徑。框架自動加載器優先查找此映射,命中則直接 include,無需路徑解析。
<?php
require_once($yii);
$config = require(dirname(__FILE__).'/protected/config/main.php');
$app = Yii::createWebApplication($config);
// 類映射註冊(在 run() 之前)
Yii::$classMap = [
'JPhpMailer' => Yii::getPathOfAlias('ext.phpmailer.JPhpMailer'),
'PHPExcel' => Yii::getPathOfAlias('ext.phpexcel.PHPExcel'),
'Swift_Mailer' => Yii::getPathOfAlias('ext.swiftmailer.lib.Swift_Mailer'),
// 更多...
];
$app->run();
<?php
// 控制器/模型中直接 new,無需 Yii::import()
$mailer = new JPhpMailer();
$excel = new PHPExcel();
$swift = new Swift_Mailer($transport);
| 方式 | 優點 | 缺點 |
|---|---|---|
| Yii::import() | 按需載入、路徑別名靈活 | 每次調用解析路徑、易忘寫、批量引入繁瑣 |
| config/main.php import[] | 啟動時預載入 | 啟動慢、內存佔用大、無條件載入 |
| Yii::$classMap | O(1) 精確映射、零解析、按需 include、集中管理 | 需手動維護映射表 |
protected/extensions/,以廠商/库名為目錄classmap.php 返回數組,Yii::$classMap = require('classmap.php');vendor/autoload.php,Yii 1.x 可共存(Yii::registerAutoloader())extensions/ 目錄下所有 *.php,提取類名生成映射表<?php
// build_classmap.php
$dir = __DIR__ . '/protected/extensions';
$map = [];
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($iterator as $file) {
if ($file->isFile() && $file->getExtension() === 'php') {
$source = file_get_contents($file->getPathname());
if (preg_match_all('/^(class|interface|trait)\s+(\w+)/m', $source, $m)) {
foreach ($m[2] as $class) {
$rel = str_replace([$dir, '/', '.php'], ['', '.', ''], $file->getPathname());
$map[$class] = Yii::getPathOfAlias('ext.' . $rel);
}
}
}
}
file_put_contents(__DIR__ . '/classmap.php', '