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

CI的解构疑问

[复制链接]
发表于 2009-7-1 13:37:26 | 显示全部楼层 |阅读模式
CI中一个控制器的新类需要继承已有的controller类(废话)。
CI为了兼容php4,没有用PHP5中的__construct来解构。而是用了与类同名的方法来表示。
为了这点我理解,可是奇怪的是为何还要写 parent::Controller(); 继承了不就能用父类中的属性,
方法了么,既然已经继承了:Controller为何还要说parent::Controller();?例如下例。

PHP复制代码
 
class Upload extends Controller {    //就像是说 我controller生的
 
 function Upload()
 {
  parent::Controller();                    //   就像说我爹是controller。与第一句不重复么?
  $this->load->helper(array('form', 'url'));
 }
 
复制代码

国内的THINKPHP,I-F,QeePHP都没见parent::Controller();  

问题问得很弱,见笑了。
发表于 2009-7-1 14:04:32 | 显示全部楼层
这是因为 PHP4 下子类不会自动调用父类的构造函数(PHP5 是不是也这样我忘了,呵呵)。
所以需要手动调用父类的构造函数,也就是 parent::Controller();

控制器父类的构造函数里有一些是必须执行的代码,你可以看一下控制器父类的源码,很简单的,呵呵。
 楼主| 发表于 2009-7-1 14:20:51 | 显示全部楼层
也就是parent是PHP4的父类如果有构造函数,在写继承类时候,才需要手动添加。如果父类仅仅有普通方法,就可以省去这这一步了。
个人感觉PHP5中是自动加载父类的__ controller了,但论坛有个翻译老外的教程中却还是用了parent.

CodeIgniter 分页教程(Pagination)
http://codeigniter.org.cn/forums/thread-17-1-2.html

PHP复制代码
 
class Books extends Controller {
  function __construct() {
    parent::Controller();
    $this->load->helper('url');
    $this->load->database();
  }
 
复制代码


类的构造函数 有如 框架的index.php,都是单入口,是用来预处理一些必须执行的代码的,例如初始化,加载库文件。是必须的东西,还是自动加载的好。
发表于 2009-7-1 14:28:22 | 显示全部楼层
根据 CI 的情况来说,不管是 PHP5 还是 PHP4 都需要执行 parent::Controller();

不执行的话可能会产生未知的错误,请根据手册来编写 CI 的代码,呵呵。
 楼主| 发表于 2009-7-1 14:32:43 | 显示全部楼层
谢谢热情的“十六进制”。
发表于 2009-7-1 14:44:32 | 显示全部楼层
谢谢热情的“十六进制”。
tmnh168 发表于 2009-7-1 14:32

 楼主| 发表于 2009-7-1 15:04:29 | 显示全部楼层
HEX意味十六进制,但也表示”不吉祥的东西“ ”邪恶“的意思。
PHP中十六进制用Ox表示,Ox又表示"牛"的意思。

综上,建议楼主改名。名字真的很重要。。。。。。。。
楼主可以一下


说到CI的名字。
    CI是舶来品,我们自然是无法为其易名,但对于国内用户来说,因为igniter这个单词真的很多人都不知道什么意思(我也是在背托福词汇时才遇到),对CI的普及不太有利。相比下zend,THINKPHP,QEEPHP容易记住。
    话说回来名字不过一个符号,内容才是本质。
发表于 2009-7-1 15:08:55 | 显示全部楼层
哈哈,楼上说的很有趣,我一直都叫 Hex,就是取十六进制的意思,嘿嘿。

不过,CI 的名字无法改,貌似是有版权问题的。
发表于 2009-7-1 19:48:43 | 显示全部楼层
controller的构造函数完成了CI的autoload功能,将默认的几个物件和config/autoload.php里面配置的创建,且映射到controller->xxx, 如果不用构造函数,那就要使用丑陋的外部调用过程完成autoload,rick大叔不喜欢啦,所以就整到构造函数里面了

本版积分规则