用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4569|回复: 10
收起左侧

[版本 3.x] 关于核心CI_Controller

[复制链接]
发表于 2016-12-11 23:34:26 | 显示全部楼层 |阅读模式
我想在扩展为MY_Controller ,然后User_Controller ,Public_Controller  在去继承MY_Controller   这三个文件都在Core下面  作为基础Controller 使用  并且在config中配置加载   但是在Controller下做继承使用时    只用MY_Controller 能用  ,有大神这么做吗?我用的CI3.0
发表于 2016-12-12 13:44:21 | 显示全部楼层
CI 只能支持一级继承。但你可以把 MY_Controller User_Controller 都放到 MY_Controller.php 里。编程时候脑子要灵活一些~
 楼主| 发表于 2016-12-12 14:12:52 | 显示全部楼层
Hex 发表于 2016-12-12 13:44
CI 只能支持一级继承。但你可以把 MY_Controller User_Controller 都放到 MY_Controller.php 里。编程时候 ...

1. 你说的方法我试过   但是不是想要的最佳效果  
2,我想弄明白的是 我做的为什么就行不通  
发表于 2016-12-12 14:20:37 | 显示全部楼层
exp 发表于 2016-12-12 14:12
1. 你说的方法我试过   但是不是想要的最佳效果  
2,我想弄明白的是 我做的为什么就行不通   ...

1、你可以说一下你要的最佳效果
2、你弄的在config中配置加载,行不通的原因只能是加载前后的关系,放在core里面是实例化控制器之前加载,你放到config中的话,控制器都已经实例完了,这时候再加载,那你是不是会报错?
 楼主| 发表于 2016-12-12 14:49:21 | 显示全部楼层
Michael锐生 发表于 2016-12-12 14:20
1、你可以说一下你要的最佳效果
2、你弄的在config中配置加载,行不通的原因只能是加载前后的关系,放在c ...

一个单独的功能模块 会用一个基础的Controller  User的话  User_Controller   admin 的话  Admin_Controller
我是在config中最后做的 __autoload()去加载core下的核心
发表于 2016-12-12 15:01:37 | 显示全部楼层
exp 发表于 2016-12-12 14:12
1. 你说的方法我试过   但是不是想要的最佳效果  
2,我想弄明白的是 我做的为什么就行不通   ...

为什么行不通,很简单,CI 不支持,CI 原本就只支持一级继承,你可以理解成功能限制。。。可能 CI 的作者认为一级继承已经足够了。。。。
发表于 2016-12-12 15:05:16 | 显示全部楼层
exp 发表于 2016-12-12 14:49
一个单独的功能模块 会用一个基础的Controller  User的话  User_Controller   admin 的话  Admin_Control ...

在 index.php 里增加 autoload 我觉得是可行的,index.php 本身就是可以自己随便修改的文件。
发表于 2016-12-15 14:27:11 | 显示全部楼层
Hex 发表于 2016-12-12 13:44
CI 只能支持一级继承。但你可以把 MY_Controller User_Controller 都放到 MY_Controller.php 里。编程时候 ...

并不是这样的喔,CI是支持多级继承的,我在实际中也是这么使用的。
core中有个MY_Controller是继承的CI_Controller,
core中还有个Admin_Controller继承了MY_Controller。
controllers里创建的控制器是可以继承Admin_Controller的。

但是有个注意的地方就是CI在加载时只会自动加载config配置文件中配置的这个前缀的文件:
$config['subclass_prefix'] = 'MY_';
所以需要在MY_Controller.php文件中加载一下Admin_Controller.php
像这样:require_once 'Admin_Controller.php';
然后就可以在创建Admin_Controller时使用中继承Admin_Controller了。

所以楼主这么做是没问题的,只是少了一个小步骤,就是需要在MY_Controller.php尾部中增加下两行代码:
require_once 'User_Controller.php';
require_once 'Public_Controller.php';

当然,另一个需要注意的就是集成的构造函数中要这样:
  1. public function __construct()
  2.     {
  3.        //必须的
  4.         parent::__construct();
  5.     }
复制代码
发表于 2016-12-15 18:26:40 | 显示全部楼层
lostincoding 发表于 2016-12-15 14:27
并不是这样的喔,CI是支持多级继承的,我在实际中也是这么使用的。
core中有个MY_Controller是继承的CI_C ...

你这样写肯定是可以搞定,但是这不是“CI本身就支持”,本身就支持的意思是不用写任何额外代码就能支持。比如你加载一个类库,根本不需要 include,这属于本身支持,所以,我才说 CI 本身是不支持多级继承的。
 楼主| 发表于 2016-12-27 11:31:01 | 显示全部楼层
lostincoding 发表于 2016-12-15 14:27
并不是这样的喔,CI是支持多级继承的,我在实际中也是这么使用的。
core中有个MY_Controller是继承的CI_C ...

是的 但是就是想的就是这样的
之前在国外看到的视频 是在config里面用autoload来加载另外的两个核心控制器的当然他拿的版本是CI2.0
但是3.0 好像不支持

本版积分规则