tmnh168 发表于 2009-7-1 13:37:26

CI的解构疑问

CI中一个控制器的新类需要继承已有的controller类(废话)。
CI为了兼容php4,没有用PHP5中的__construct来解构。而是用了与类同名的方法来表示。
为了这点我理解,可是奇怪的是为何还要写 parent::Controller(); 继承了不就能用父类中的属性,
方法了么,既然已经继承了:Controller为何还要说parent::Controller();?例如下例。


class Upload extends Controller {    //就像是说 我controller生的

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

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

问题问得很弱,见笑了。

Hex 发表于 2009-7-1 14:04:32

这是因为 PHP4 下子类不会自动调用父类的构造函数(PHP5 是不是也这样我忘了,呵呵)。
所以需要手动调用父类的构造函数,也就是 parent::Controller();

控制器父类的构造函数里有一些是必须执行的代码,你可以看一下控制器父类的源码,很简单的,呵呵。

tmnh168 发表于 2009-7-1 14:20:51

也就是parent是PHP4的父类如果有构造函数,在写继承类时候,才需要手动添加。如果父类仅仅有普通方法,就可以省去这这一步了。
个人感觉PHP5中是自动加载父类的__ controller了,但论坛有个翻译老外的教程中却还是用了parent.

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


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


类的构造函数 有如 框架的index.php,都是单入口,是用来预处理一些必须执行的代码的,例如初始化,加载库文件。是必须的东西,还是自动加载的好。

Hex 发表于 2009-7-1 14:28:22

根据 CI 的情况来说,不管是 PHP5 还是 PHP4 都需要执行 parent::Controller();

不执行的话可能会产生未知的错误,请根据手册来编写 CI 的代码,呵呵。

tmnh168 发表于 2009-7-1 14:32:43

谢谢热情的“十六进制”。

Hex 发表于 2009-7-1 14:44:32

谢谢热情的“十六进制”。
tmnh168 发表于 2009-7-1 14:32 http://codeigniter.org.cn/forums/images/common/back.gif
:L

tmnh168 发表于 2009-7-1 15:04:29

HEX意味十六进制,但也表示”不吉祥的东西“ ”邪恶“的意思。
PHP中十六进制用Ox表示,Ox又表示"牛"的意思。

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


说到CI的名字。
    CI是舶来品,我们自然是无法为其易名,但对于国内用户来说,因为igniter这个单词真的很多人都不知道什么意思(我也是在背托福词汇时才遇到),对CI的普及不太有利。相比下zend,THINKPHP,QEEPHP容易记住。
    话说回来名字不过一个符号,内容才是本质。

Hex 发表于 2009-7-1 15:08:55

哈哈,楼上说的很有趣,我一直都叫 Hex,就是取十六进制的意思,嘿嘿。

不过,CI 的名字无法改,貌似是有版权问题的。

visvoy 发表于 2009-7-1 19:48:43

controller的构造函数完成了CI的autoload功能,将默认的几个物件和config/autoload.php里面配置的创建,且映射到controller->xxx, 如果不用构造函数,那就要使用丑陋的外部调用过程完成autoload,rick大叔不喜欢啦,所以就整到构造函数里面了
页: [1]
查看完整版本: CI的解构疑问