Typecho源码分析(5)
上回说到在config.inc.php
文件里,执行了Typecho_Common::init()函数,自动加载了所有class,算是把Typecho启动起来了。
那么,接下来,就回到index.php文件里,接下来执行这个函数:
/** 初始化组件 */
Typecho_Widget::widget('Widget_Init');
这个函数做啥的呢?
上回说到在config.inc.php
文件里,执行了Typecho_Common::init()函数,自动加载了所有class,算是把Typecho启动起来了。
那么,接下来,就回到index.php文件里,接下来执行这个函数:
/** 初始化组件 */
Typecho_Widget::widget('Widget_Init');
这个函数做啥的呢?
自从Ubuntu18.04
之后,MySQL的root用户就自动用个什么其他方式连接,总之不是密码了,所以我其实已经有多个文章来解决这个问题,但还是再写一篇,以便自己加深记忆。
首先,mysql -u root
登录mysql;
其次,ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root-password';
更改root用户的密码,这个命令看着似乎也顺便把root用户的连接方式改为传统的密码连接了。
上回说到,在require 'Typecho/Common.php'
文件后,立刻做了Typecho::init()
这个操作。
这个从名字上来说,肯定就是启动Typecho了,但具体怎么启动呢?其实就是这样的代码:
class Typecho_Common {
/**
* 自动载入类
*
* @param $className
*/
public static function __autoLoad($className)
{
@include_once str_replace(array('\\', '_'), '/', $className) . '.php';
}
/**
* 程序初始化方法
*
* @access public
* @return void
*/
public static function init()
{
/** 设置自动载入函数 */
spl_autoload_register(array('Typecho_Common', '__autoLoad'));
// 删去了一些兼容性代码
/** 设置异常截获函数 */
set_exception_handler(array('Typecho_Common', 'exceptionHandle'));
}
}
这代码啥意思呢?
好,接着说怎么引入配置文件config.inc.php
。
这个文件是执行安装过程中,由程序生成的。所以有很多时候,安装会报错的一个原因,就是没有写入权限。
好,接下来,看这个配置文件干了什么。
首先是定义了一些全局变量,尤其是一些文件路径。比如:
/** 定义根目录 */
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));
/** 定义插件目录(相对路径) */
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');
/** 定义模板目录(相对路径) */
define('__TYPECHO_THEME_DIR__', '/usr/themes');
/** 后台路径(相对路径) */
define('__TYPECHO_ADMIN_DIR__', '/admin/');
然后,再依据这些已经定义好的路径,来引入相应的文件(依赖),尤其是最关键的一个:
/** 载入API支持 */
require_once 'Typecho/Common.php';
/** 程序初始化 */
Typecho_Common::init();
初始化之后,会连接数据库。
那么,接下来有2个问题:
Typecho
这个目录啊,怎么引入的呢?Typecho_Common::init()
这行代码,到底初始化了哪些东西?上篇文章讲到,会引入一个config.inc.php
文件,如果没有这个文件,就会开始执行安装步骤,install.php
。
关于怎么安装,这个事,暂且放一下。先看一下整体结构吧。
主要是这么几个目录和文件:
- admin/
- install/
- usr/
- var/
- index.php
- install.php
首先,第一次看源码,当然是看index.php
了。
那么,里面有这样的代码:
/** 初始化组件 */
Typecho_Widget::widget('Widget_Init');
/** 注册一个初始化插件 */
Typecho_Plugin::factory('index.php')->begin();
/** 开始路由分发 */
Typecho_Router::dispatch();
/** 注册一个结束插件 */
Typecho_Plugin::factory('index.php')->end();