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

[优化] 不知何时可以抛弃load->手工调用

[复制链接]
发表于 2013-3-15 15:26:24 | 显示全部楼层 |阅读模式
    CI升级到2.X之后,不再支持PHP4,这是好事儿,但是这种革命并不彻底。PHP5的一些先进特性到现在都没有用起来,最典型的就是load,要使用哪个功能还必须手动加载哪个模块,或者是设定到autoload里面进行预加载。

    手动load,至少要多键入一行代码,而且在Netbeans之类的高级编辑器下面代码的自动完成功能也不好用起来。
   设定在autoload算是预加载,一些不常用的模块也加载进来,无疑让系统臃肿,影响运行效率。

    这个问题kohana框架早已经用__autoload魔术方法实现了免手工load,CI也有改造版的,但是没有被官方采纳。而且改造版的虽然可以实现不用load就可以加载方法,但是老的load代码就会失效了,也是个老大难问题。


    希望众CIer好好想想办法,撺掇作者在代码自动完成和调用的简易性上下下功夫,让CI用得更爽。
发表于 2013-3-15 19:34:10 | 显示全部楼层
俺感觉挺好的。
 楼主| 发表于 2013-3-16 08:44:52 | 显示全部楼层
代码自动完成对团队开发意义重大,因为你调用的不一定是自己开发出来的娃儿,有了提示,才能更方便地了解和调用别人的类和方法。
发表于 2013-3-16 15:46:25 | 显示全部楼层
我只能说,无语。
 楼主| 发表于 2013-3-16 23:27:55 | 显示全部楼层
真的弱爆了,如果用过代码自动完成,简直有受不了的感觉。
发表于 2013-3-17 19:05:33 | 显示全部楼层
估计是指使用spl_autoload_register。

网上有不少在CodeIgniter中使用spl_autoload_register进行autoload的方法,未听闻这些方法会令原来load失效的说法。加入autoload功能根本不必修改CodeIgniter,是谁聪明得去修改CI?


网上多的是例子。这里有个用hooks来加载autoload class的方法。

http://acairns.co.uk/2011/05/autoloading-resources-in-codeigniter/


要调用autoload,先要有class not found exception,处理exception时要到不同的目录中去找文件,省了一句load的语句,但系统要多耗额外开销去找文件。

PHP自行找文件时,不会知道是model,core还是libraries,要一一去找,若使用HMVC,要找的目录数目可能更多。值不值得,各有看法。


意义重大?

要娃儿,但生娃儿时,还要娃儿自己爬出来罢了。
 楼主| 发表于 2013-3-18 14:10:08 | 显示全部楼层
    如果你的方法能够混合用当然最好不过了,我回头试试。
    我讲的使用__autoload之后就不能$this->load是指的这个帖子里面讲到的方法:
http://codeigniter.org.cn/forums ... thread&tid=4443
(1)自动加载models——php5风格
这个技巧希望达到的目标是:
在左边,你会看到在controller里面通常加载model的方法。使用这个技巧以后,我们将能够直接创建这个model对象。
这个代码是简洁的并且容易理解对象。
使用这个技巧以后会有2个影响。首先你不再需要继承model类了。这个技巧,我们需要做的就是添加一个php5风格的 autolader 函数,添加这些代码到system/application/config/config.php:

<?php  
// ...  
function __autoload($class) {  
    if (file_exists(APPPATH."models/".strtolower($class).EXT)) {  
        include_once(APPPATH."models/".strtolower($class).EXT);  
    }  
}  
?>
如果你也有兴趣运用这个技巧到controller,你只需要添加以下代码来代替上面的代码。
<?php  
// ...  
function __autoload($class) {  
    if (file_exists(APPPATH."models/".strtolower($class).EXT)) {  
        include_once(APPPATH."models/".strtolower($class).EXT);  
    } else if (file_exists(APPPATH."controllers/".strtolower($class).EXT)) {  
        include_once(APPPATH."controllers/".strtolower($class).EXT);  
    }  
}  
?>
任何时候,你试着使用一个没有定义的类时候,这个__autoload函数将会被调用,它将会加载这个类文件。
 楼主| 发表于 2013-3-18 14:48:56 | 显示全部楼层
    关于不同程序员生出来娃儿,如果给这些娃儿一些自动名单(在代码完成时候列出来),会比把娃放在大幼儿园要好管理的多。因为代码自动完成可以让程序员非常方便地发现和使用别人的娃儿。
发表于 2013-3-19 13:54:15 | 显示全部楼层
我支持 @相知犹按剑 的想法,对于任何能提高开发效率的方案我都支持。

PS: 自动完成有问题,从根本上,我认为是IDE不够聪明导致的,但是解决起来最方便的还是让代码去适应IDE。。。虽然这有点本末倒置,呵呵~
 楼主| 发表于 2013-3-20 05:05:36 | 显示全部楼层
急盼hex等众高手开发流行ide的ci插件出来,解决这个问题。{:soso_e128:}{:soso_e128:}

本版积分规则