我们的MVC框架的入口文件中index.php中有样几行代码
// 加载框架文件 require(__DIR__ . '/../fastphp/Fastphp.php');
// 实例化框架类 (new fastphp\Fastphp($config))->run();
fastphp.php是我们mvc框架的核心文件,通过以下的代码片断,我们了解一下它主要完成的功能
class Fastphp
{
// 配置内容
protected $config = [];
public function __construct($config)
{
$this->config = $config;
}
// 运行程序
public function run()
{
spl_autoload_register(array($this, 'loadClass'));
$this->setReporting();
$this->removeMagicQuotes();
// $this->unregisterGlobals();
$this->setDbConfig();
$this->route();
}
}
构造方法主要完成配置文件中数组的传入。
run()方法主要是调用其它一些方法,下面我们就逐一学习。
spl_autoload_register(array($this, 'loadClass'));
注册自动加载的方法是本对象的loadClass
下面我们分析自动加载相关的代码
// 自动加载类
public function loadClass($className)
{
$classMap = $this->classMap();
if (isset($classMap[$className])) {
// 包含内核文件
$file = $classMap[$className];
} elseif (strpos($className, '\\') !== false) {
// 包含应用(application目录)文件
$file = APP_PATH . str_replace('\\', '/', $className) . '.php';
if (!is_file($file)) {
return;
}
} else {
return;
}
include $file;
// 这里可以加入判断,如果名为$className的类、接口或者性状不存在,则在调试模式下抛出错误
}
// 内核文件命名空间映射关系
protected function classMap()
{
return [
'fastphp\base\Controller' => CORE_PATH . '/base/Controller.php',
'fastphp\base\Model' => CORE_PATH . '/base/Model.php',
'fastphp\base\View' => CORE_PATH . '/base/View.php',
'fastphp\db\Db' => CORE_PATH . '/db/Db.php',
'fastphp\db\Sql' => CORE_PATH . '/db/Sql.php',
];
}
我们知道,当们使用一个不存在的类时,会触发自动加载方法的执行。
这些类主要分为两部分:核心框架类和用户自定义类,分别存放在fastphp和app目录中。
其中核心框架类这些文件都是早已写好的,固定不变的。所以我们把这些文件写在了classmap()这个方法中
而用户在app目录中自定义的控制器、模型等类文件,都是不固定的。
上面代码的运行原理:
被执行的未知类(包括命名空间)通过loadClass方法的参数className传进来:
1、首先我们要判断是否框架类,如果是,获取框架类的类文件
2、如果是用户自定义的类,根据约定构建类文件路径
4、判断类文件是否存在
5、不存在类文件,返回false
6、包含类文件