• 本章继续学习\Typecho\Common::init()方法
 // 源文件 /var/Typecho/Common.php
191 /**
192 * 程序初始化方法
193 *
194 * @access public
195 * @return void
196 */
197 public static function init()
198 {
199    // init response
200    Response::getInstance()->enableAutoSendHeaders(false);
201 
202    ob_start(function ($content) {
203        Response::getInstance()->sendHeaders();
204        return $content;
205    });
206 
207    /** 设置异常截获函数 */
208    set_exception_handler(function (\Throwable $exception) {
209        echo '<pre><code>';
210        echo '<h1>' . htmlspecialchars($exception->getMessage()) . '</h1>';
211        echo htmlspecialchars($exception->__toString());
212        echo '</code></pre>';
213        exit;
214    });
215 }
  • 第197行:函数或方法定义。
  • 第198、215行:大括号内包含函数代码段。
  • 第200行:Response::getInstance()返回一个Response类的实例,->enableAutoSendHeaders(false)调用实例类中的函数。此函数做了什么操作请看下面两段代码的注释。
  • 第202~205行:此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(消息头除外),相反需要输出的内容被存储在内部缓冲区中。
  • 第208行:设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。
  • 第209~212行:输入异常消息。
  • 第213行:退出程序,不再执行后面的代码。
 // 源文件 /var/Typecho/Response.php
107    /**
108     * @var bool
109     */
110    private $enableAutoSendHeaders = true;
  • 第110行:给私有变量 $enableAutoSendHeaders 赋值为 true 了。
 // 源文件 /var/Typecho/Response.php
157    /**
158     * @param bool $enable
159     */
160    public function enableAutoSendHeaders(bool $enable = true)
161    {
162        $this->enableAutoSendHeaders = $enable;
163    }
  • 第162行:上面第200行代码传了一个参数 false 过来,看此行代码可知是给私有变量 $enableAutoSendHeaders 赋值为 false 了。

本章到此结束,下一章学习上面第203行的函数 Response::getInstance()->sendHeaders() 做了些什么事情。

  • 上一章学习了源文件index.php中第1到16行,本章学习源文件install.php中第1到24行。
// 源文件install.php
 1 <?php
 2
 3 if (!file_exists(dirname(__FILE__) . '/config.inc.php')) {
 4     // site root path
 5     define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));
 6
 7     // plugin directory (relative path)
 8     define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');
 9
10     // theme directory (relative path)
11     define('__TYPECHO_THEME_DIR__', '/usr/themes');
12
13     // admin directory (relative path)
14     define('__TYPECHO_ADMIN_DIR__', '/admin/');
15
16     // register autoload
17     require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php';
18 
19     // init
20     \Typecho\Common::init();
21 } else {
22     require_once dirname(__FILE__) . '/config.inc.php';
23     $installDb = \Typecho\Db::get();
24 }
  • 第1行:PHP标记。
  • 第3行:if控制语句,判断文件'/config.inc.php'是否存在,如果不存在就执行第4~20行代码。
  • 第4、7、10、13、16、19行:单行注释。
  • 第5行:定义常量'__TYPECHO_ROOT_DIR__'并赋值为当前文件所在的目录。
  • 第8、11、14行:定义常量。
  • 第17行:只包含一次文件'./var/Typecho/Common.php'
  • 第20行:调用或执行 命名空间 Typecho 中的 类 Common 中的 函数或方法 init()
  • 第21行:否则就执行第22~24行代码。
  • 第22行:只包含一次文件'./config.inc.php'
  • 第23行:给变量 $installDb 赋值为 命名空间 Typecho 中的 类 Db 中的 函数或方法 get() 的返回值。

本章结束,下一章继续学习方法 \Typecho\Common::init()

  • 先说一下我写注释的逻辑:从入口文件开始按程序的执行过程进行分析、注释、学习。
  • 我的typecho源代码是1.2.0版本,入口文件是index.php
// 源文件/index.php
 1 <?php
 2 /**
 3 * Typecho Blog Platform
 4 *
 5 * @copyright  Copyright (c) 2008 Typecho team (http://www.typecho.org)
 6 * @license    GNU General Public License 2.0
 7 * @version    $Id: index.php 1153 2009-07-02 10:53:22Z magike.net $
 8 */
 9 
10 /** 载入配置支持 */
11 if (!defined('__TYPECHO_ROOT_DIR__') && !@include_once 'config.inc.php') {
12     file_exists('./install.php') ? header('Location: install.php') : print('Missing Config File');
13     exit;
14 }
  • 这里开始注释上面的代码
  • 第1行:PHP标记:<?php 代码段 ?>
  • 第2~8行:多行注释,第9行是空行为了让代码可读性更好,第10行是注释。
  • 第11行:是if控制语句:!是取反,defined('__TYPECHO_ROOT_DIR__')是判断'__TYPECHO_ROOT_DIR__'是否已定义,已定义返回true,未定义返回false。 && 是并且的意思。@是抑制程序报错、屏蔽程序错误信息,include_once 'config.inc.php'是包含并运行文件'config.inc.php'中的代码,如果已经包含过则不再包含并返回true。
  • 第一次运行时肯定是没有定义'__TYPECHO_ROOT_DIR__'并且没有包含'config.inc.php'的,两个表达式都做了取反操作,就变成了 (true && true) 所以会执行第12行到第14行代码。
  • 第12行:是一个三元表达式,file_exists('./install.php')判断文件'./install.php'是否存在,存在返回true不存在返回false。我这里文件'./install.php'是存在的所以会执行header('Location: install.php')跳转到install.php页面。如果文件'./install.php'不存在就会执行print('Missing Config File')在页面上显示Missing Config File
  • 第13行:退出并不再执行后面的代码。

本章到此结束,下一章开始分析install.php页面。