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