Yii 應用的啟動始於入口腳本,通常為 index.php。以下是典型的入口代碼:
<?php
// 定義框架與配置路徑
$yii = dirname(__FILE__) . '/framework/yii.php';
$config = dirname(__FILE__) . '/protected/config/main.php';
// 開發模式下啟用調試
defined('YII_DEBUG') or define('YII_DEBUG', true);
// 載入框架核心並運行應用
require_once($yii);
Yii::createWebApplication($config)->run();
require_once($yii) 載入 yii.php,這是 Yii 的引導文件,內部包含 YiiBase 基礎類,Yii 類繼承自它:
<?php
require(dirname(__FILE__) . '/YiiBase.php');
class Yii extends YiiBase {
}
在 YiiBase 中定義了核心靜態方法:
createWebApplication($config):創建並初始化 Web 應用實例import($alias, $forceInclude):類別自動導入機制createComponent($config):組件工廠方法setApplication($app) / Yii::app():應用實例單例管理Yii 透過 spl_autoload_register(array('YiiBase', 'autoload')) 註冊自動加載器。核心 autoload 方法邏輯如下:
<?php
public static function autoload($className) {
// 1. 類別映射表優先
if (isset(self::$classMap[$className])) {
include(self::$classMap[$className]);
return true;
}
// 2. 核心類別映射
if (isset(self::$_coreClasses[$className])) {
include(YII_PATH . self::$_coreClasses[$className]);
return true;
}
// 3. 命名空間類別 (PHP 5.3+)
if (strpos($className, '\\') !== false) {
$namespace = str_replace('\\', '.', ltrim($className, '\\'));
if (($path = self::getPathOfAlias($namespace)) !== false) {
include($path . '.php');
return class_exists($className, false) || interface_exists($className, false);
}
return false;
}
// 4. 傳統類別名稱 (無命名空間)
if (self::$enableIncludePath === false) {
foreach (self::$_includePaths as $path) {
$classFile = $path . DIRECTORY_SEPARATOR . $className . '.php';
if (is_file($classFile)) {
include($classFile);
break;
}
}
} else {
include($className . '.php');
}
return class_exists($className, false) || interface_exists($className, false);
}
此機制支援類別映射、核心類別、命名空間別名路徑解析、以及傳統 include_path 查找,極大提升了類別載入效率與靈活性。