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自动加载器
- 在CI根目录执行命令
composer require smarty/smarty
。Smarty
是个php的模板引擎,这里仅用作测试。 修改文件
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
。 为方便对比,防止改错,假设修改前的文件内容为
{ "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.*" } }
修改后的文件内容(注意在前一项末尾加个英文逗号)
{ "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/" } } }
解释配置项
autoload
"autoload": { "psr-4": { "app\\": "application/" } }
- 键名为顶级命名空间
app\
。这里使用app\\
,第一个\
是转义符 - 键值为命名空间对应的目录
application/
更新composer
在CI根目录执行命令composer update
测试
浏览器访问index.php/demo
,如果正常显示This is a msg from class Base.
则说明配置成功。
文件下载
- 本文中所述配置好
composer
自动加载器以及命名空间的示例源码打包。 - CI3-Composer-Autoload.7z