欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

CI框架源码阅读笔记3 全局函数Common.php

程序员文章站 2022-05-28 09:50:24
...

从本篇开始,将深入CI 框架 的内部,一步步去探索这个 框架 的实现、结构和设计。 Common.php文件定义了一系列的 全局 函数 (一般来说, 全局 函数 具有最高的加载优先权,因此大多数的 框架 中BootStrap引导文件都会最先引入 全局 函数 ,以便于之后的处理

  从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现、结构和设计。

  Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作)。

  打开Common.php中,第一行代码就非常诡异:

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

CI框架源码阅读笔记2 一切的入口 index.php)中,我们已经知道,BASEPATH是在入口文件中定义的常量。这里做这个判断的原因是:避免直接访问文件,而必须由index.php入口文件进入。其实不仅是Common.php,System中所有文件,几乎都要引入这个常量的判断,避免直接的脚本访问:

CI框架源码阅读笔记3 全局函数Common.php

本文件中定义的函数如下(查看方式 print_r(get_defined_functions())):

CI框架源码阅读笔记3 全局函数Common.php

CI中所有全局函数的定义方式都为:

if ( ! function_exists('func_name')){
    function func_name(){
     //function body
    }
}

这样做,是为了防止定义重名函数(之后如果我们要定义系统的全局函数,也都将使用这种定义方式)。下面,一个个展开来看:

1.  is_php

这个函数的命名很明显,就是判断当前环境的PHP版本是否是特定的PHP版本(或者高于该版本)

函数内部有一个static的$_is_php数组变量,用于缓存结果(因为在特定的运行环境中,PHP的版本是已知的且是不变的,所以通过缓存的方式,避免每次调用时都去进行version_compare。这种方式,与一般的分布式缓存(如Redis)的处理思维是一致的,不同的是,这里是使用static数组的方式,而分布式缓存大多使用内存缓存)。

为什么要定义这个函数呢?这是因为,CI框架中有一些配置依赖于PHP的版本和行为(如magic_quotes,PHP 5.3版本之前,该特性用于指定是否开启转义,而PHP5.3之后,该特性已经被废弃)。这就好比是针对不同的浏览器进行Css Hack一样(这里仅仅是比喻,实际上,PHP并没有太多的兼容性问题)。

具体的实现源码:

function is_php($version = '5.0.0')
{
    static $_is_php;
    $version = (string)$version;

    if ( ! isset($_is_php[$version]))
    {
        $_is_php[$version] = (version_compare(PHP_VERSION, $version) FALSE