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配置文件中加入命名空间的配置

  1. 修改CI根目录中的composer.json
  2. 为方便对比,防止改错,假设修改前的文件内容为

               {
                "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.*"
                }
                }        
    
  3. 修改后的文件内容(注意在前一项末尾加个英文逗号)

                {
                "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/"
                    }
                }
                }
           
    
  4. 解释配置项autoload

                "autoload": {
                      "psr-4": {
                       "app\\": "application/"
                    }
                }
    
  • 键名为顶级命名空间app\。这里使用app\\,第一个\是转义符
  • 键值为命名空间对应的目录application/

更新composer

在CI根目录执行命令composer update

测试

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

文件下载

参考文章

最后修改:2023 年 07 月 25 日
您的赞赏是对我最大的支持。