CodeIgniter3中是没有使用命名空间的,但是不代表它就不能使用命名空间。根本上讲,命名空间是php的一项功能,从php5.3.0开始就支持了这一功能。CodeIgniter只是没有实现根据命名空间来实现类库的自动加载,但是可以通过第三方类库如composer来实现其他类库的自动加载。

安装composer

这里只简单介绍一下windows下通过composer安装程序安装。也许以后会写一篇文章来总结composer的安装和使用 下载Composer-Setup.exe,然后按照提示一步步的安装就行了。可参考Download Composer 检测composer是否已经安装成功:新建一个命令行窗口,然后执行命令composer -V,如果能正确输出composer的版本,那就说明安装成功了。

在CodeIgniter中启用composer自动加载器

CodeIgniter安装配置是按照CI官方文档的安装说明配置的,且没有进行个性化设置,即没有设置$system_path $application_folder$view_folder

用composer安装依赖

在命令行中切换到CI的根目录,即composer.json所在的目录,执行命令composer install。执行完成后,会出现vendor目录,vendor目录下有文件autoload.php

修改composer配置文件

修改文件application/config/config.php中的配置项$config['composer_autoload']。修改它的值为上述autoload.php的路径(相对于index.php的路径),例如:

$config['composer_autoload'] = 'vendor/autoload.php';

测试composer自动加载器

  1. 在CI根目录执行命令composer require smarty/smartySmarty是个php的模板引擎,这里仅用作测试。
  2. 修改文件application/controllers/Welcome.php,修改index方法如下:
public function index(){
    $smarty = new Smarty();
    var_dump($smarty);
}

如果没有提示找不到类Smarty,并且能正常输出$smarty的值(不是NULL)时,说明自动加载器已经正确启用了。

自定义带有命名空间的类

创建Base

application/controllers目录中创建文件Base.php。这是个自定义类,用来扩展CI_Controllers的类。顶级命名空间为app\,它对应的目录为application/。于是命名空间app\controlles\对应目录application/controllers/。(这应该是符合PSR-4的吧)内容如下

<?php
namespace app\controllers;
use CI_Controller;
defined('BASEPATH') OR exit('No direct script access allowed');
class Base extends CI_Controller{
    public function index(){
        echo 'This is a msg from class Base.';
    }
}

创建Demo

application/controllers目录中创建文件Demo.php。这个类用来作为CI中的控制器,要在浏览器中访问,因此不能给它设置命名空间,即不不能包含namaspace语句。其内容如下

<?php
use app\controllers\Base;
class Demo extends Base{
}

在composer配置文件中加入命名空间的配置

修改CI根目录中的composer.json

  1. 为方便对比,防止改错,假设修改前的文件内容为
{
    "description": "The CodeIgniter framework",
    "name": "codeigniter/framework",
    "type": "project",
    "homepage": "https://codeigniter.com",
    "license": "MIT",
    "support": {
        "forum": "http://forum.codeigniter.com/",
        "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki",
        "irc": "irc://irc.freenode.net/codeigniter",
        "source": "https://github.com/bcit-ci/CodeIgniter"
    },
    "require": {
        "php": ">=5.2.4",
        "smarty/smarty": "^3.1"
    },
    "suggest": {
        "paragonie/random_compat": "Provides better randomness in PHP 5.x"
    },
    "require-dev": {
        "mikey179/vfsStream": "1.1.*",
        "phpunit/phpunit": "4.* || 5.*"
    }
}
  1. 修改后的文件内容(注意在前一项末尾加个英文逗号)
{
    "description": "The CodeIgniter framework",
    "name": "codeigniter/framework",
    "type": "project",
    "homepage": "https://codeigniter.com",
    "license": "MIT",
    "support": {
        "forum": "http://forum.codeigniter.com/",
        "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki",
        "irc": "irc://irc.freenode.net/codeigniter",
        "source": "https://github.com/bcit-ci/CodeIgniter"
    },
    "require": {
        "php": ">=5.2.4",
        "smarty/smarty": "^3.1"
    },
    "suggest": {
        "paragonie/random_compat": "Provides better randomness in PHP 5.x"
    },
    "require-dev": {
        "mikey179/vfsStream": "1.1.*",
        "phpunit/phpunit": "4.* || 5.*"
    },
    "autoload": {
        "psr-4": {
            "app\\": "application/"
        }
    }
}
  1. 解释配置项autoload
"autoload": {
    "psr-4": {
        "app\\": "application/"
    }
}
  • 键名为顶级命名空间app\。这里使用app\\,第一个\是转义符
  • 键值为命名空间对应的目录application/

更新composer

在CI根目录执行命令composer update

测试

浏览器访问index.php/demo,如果正常显示This is a msg from class Base.则说明配置成功。

参考文章