CI框架学习笔记(二) -入口文件index.php


Posted in PHP onOctober 27, 2014

上一节(CI框架学习笔记(一) - 环境安装、基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考:

CI框架学习笔记(二) -入口文件index.php

作为CI框架的入口文件,源码阅读,自然由此开始。在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现。

1. 设置应用程序环境

define('ENVIRONMENT', 'development');

这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中,对设定的环境做相关的错误控制,否则,CI框架会认为你没有配置好相应的环境,从而退出进程并给出对应的错误信息:

default:   exit('The application environment is not set correctly.');

为什么一开始就要配置ENVIRONMENT?这是因为,CI框架中很多组件都依赖于ENVIRONMENT的配置,我们看一下system中,引用ENVIRONMENT的地方:

CI框架学习笔记(二) -入口文件index.php

可以看到,很多组件都依赖于ENVIRONMENT.例如,查看system/config/Common.php, 这其中有一段引入配置文件的代码,是这样实现的:

if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
{
  $file_path = APPPATH.'config/config.php';
}

在CI框架中,很多配置文件都是通过这种方式引入的,因此ENVRIONMENT对于CI框架的正确运行时必须的,所以需要在开始的时候配置好ENVIRONMENT。设置ENVIRONMENT的一个好处是:可以很方便的切换系统的配置而不必修改系统代码。例如,在系统进入测试阶段时,database配置为测试的数据库,而在系统测试完毕时,database切换到线上的数据库。这好比是用一个开关控制了系统的环境切换,自然是非常方便的。

2.

配置系统目录和应用程序目录

CI框架允许你将系统核心源码和应用程序代码分开放置,但是你必须设定好系统的system文件夹和application文件夹(同样,文件夹名字可以是任何合法的文件夹名称,而不一定使用'system'和'application'):

$system_path = 'system';
$application_folder = 'application';

接下来,有这么一段代码:

if (defined('STDIN'))
{
   chdir(dirname(__FILE__));
}

这段代码是干嘛的呢?首先,STDIN、STDOUT、STDERR是PHP以 CLI(Command Line Interface)模式运行而定义的三个常量,这三个常量类似于Shell的stdin,stdout,stdout,分别是PHP CLI模式下的标准输入、标准输出和标准错误流。也就是说,这三行代码是为了保证命令行模式下,CI框架可以正常运行。关于PHP CLI的更多细节可以参考:http://www.php-cli.com/

3. system目录的正确性验证和application目录验证

(1). system目录的正确性验证

Realpath返回的是目录或文件的绝对目录名(没有最后的/)

if (realpath($system_path) !== FALSE)
{
  $system_path = realpath($system_path).'/';
}
$system_path = rtrim($system_path, '/').'/';
if ( ! is_dir($system_path))
{ 
  exit("xxxxxxxx");
}

几个定义的常量(PATH结尾的常量表示目录路径,DIR结尾的变量表示目录名):
a. SELF(这里指index.php文件)
b. EXT(deprecated,废弃的,不必关注)
c. BASEPATH(system文件夹的路径)
d. FCPATH(前端控制器的路径)
e. SYSDIR(系统system目录名)
f. APPPATH(应用程序路径)
查看所有定义的常量的方法:

Print_r(get_defined_constants());

CI框架学习笔记(二) -入口文件index.php

(2)application的目录验证。

代码较简单,不做过多的解释:

if (is_dir($application_folder))
{
  define('APPPATH', $application_folder.'/');
}
else
{
  if ( ! is_dir(BASEPATH.$application_folder.'/'))
  {
    exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
  }

  define('APPPATH', BASEPATH.$application_folder.'/');
}

入口文件的最后一行,引入CodeIgniter.php(也是下一步阅读的关键)。CodeIgniter.php被称为bootstrap file,也就是它是一个引导文件,是CI框架执行流程的核心文件。

require_once BASEPATH.'core/CodeIgniter.php';

总结一下,index.php并没有做太多复杂的工作,而是类似一个后勤,为CI框架的运行提供了一系列配置参数和正确性验证,而这些配置和验证,是CI框架能够正常运行的关键。

最后,按照惯例,贴一下整个文件的源码(简化注释版):

<?php

define('ENVIRONMENT', 'development');

if (defined('ENVIRONMENT'))
{
  switch (ENVIRONMENT)
  {
    case 'development':
      error_reporting(E_ALL);
    break;
  
    case 'testing':
    case 'production':
      error_reporting(0);
    break;

    default:
      exit('The application environment is not set correctly.');
  }
}

/*
 * SYSTEM FOLDER NAME
 */
$system_path = 'system';

/*
 * APPLICATION FOLDER NAME
 */
$application_folder = 'application';

/*
 * Resolve the system path for increased reliability
 */
if (defined('STDIN'))
{
  chdir(dirname(__FILE__));
}

if (realpath($system_path) !== FALSE)
{
  $system_path = realpath($system_path).'/';
}

$system_path = rtrim($system_path, '/').'/';

if ( ! is_dir($system_path))
{
  exit("xxxxxxxx");
}

/*
 * set the main path constants
 */
// The name of THIS file
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));

// this global constant is deprecataaed.
define('EXT', '.php');

// Path to the system folder
define('BASEPATH', str_replace("\\", "/", $system_path));

// Path to the front controller (this file)
define('FCPATH', str_replace(SELF, '', __FILE__));

// Name of the "system folder"
define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));

// The path to the "application" folder
if (is_dir($application_folder))
{
  define('APPPATH', $application_folder.'/');
}
else
{
  if ( ! is_dir(BASEPATH.$application_folder.'/'))
  {
    exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
  }

  define('APPPATH', BASEPATH.$application_folder.'/');
}

require_once BASEPATH.'core/CodeIgniter.php';
PHP 相关文章推荐
php中的一个中文字符串截取函数
Feb 14 PHP
PHP写MySQL数据 实现代码
Jun 15 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
php循环检测目录是否存在并创建(循环创建目录)
Jan 06 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 #PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 #PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 #PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 #PHP
Windows下的PHP安装pear教程
Oct 24 #PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 #PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 #PHP
You might like
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
JS判断数组那点事
2017/10/10 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
本科毕业生自我鉴定
2013/11/02 职场文书
三年级语文教学反思
2014/02/01 职场文书
大学生社会实践评语
2014/04/25 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
一起来学习Python的元组和列表
2022/03/13 Python
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技