(1)自动加载models——php5风格
使用这个技巧以后,我们将能够直接创建这个model对象。
这个代码是简洁的并且容易理解对象。
使用这个技巧以后会有2个影响。首先你不再需要继承model类了。
这个技巧
我们需要做的就是添加一个php5风格的 autolader 函数
添加这些代码到system/application/config/config.php:
// ...
function __autoload($class) {
if (file_exists(APPPATH."models/".strtolower($class).EXT)) {
include_once(APPPATH."models/".strtolower($class).EXT);
}
}
?>
如果你也有兴趣运用这个技巧到controller,你只需要添加以下代码来代替上面的代码。
// ...
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函数将会被调用,它将会加载这个类文件。
(2)防止model-controller名字冲突
使用这个技巧要达到的目标:
一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。
class Post extends Model {
// ...
}
现在你就不能有一个像这样的url:
http://www.mysite.com/post/display/13
这个原因是因为你也需要有一个名字为post的controller,如果创建了这样的一个类的话将会引起致命错误。
但是使用了这个技巧一般,一切皆有可能。那个url的控制器看起来是这样的:
// application/controllers/post.php
class Post_controller extends Controller {
// ...
}
注意这个“__controller”后缀
技巧:
为了避免这个问题,通常大多数人都是添加‘_model’后缀到model名字(例如命名Post_model)。
在所有的应用程序中Model对象都被创建和引用,所以在所有的model名字后面跟上‘_model’有些无聊。
我认为最好的办法就是在controller上来添加后缀,因为在代码中controller的名字几乎从来不会被引用。
首先我们需要继承Router class。创建这样一个文件:"application/libraries/MY_Router.php"
class MY_Router extends CI_Router {
var $suffix = '_controller';
function MY_Router() {
parent::CI_Router();
}
function set_class($class) {
$this->class = $class . $this->suffix;
}
function controller_name() {
if (strstr($this->class, $this->suffix)) {
return str_replace($this->suffix, '', $this->class);
}
else {
return $this->class;
}
}
}
现在编辑"system/codeigniter/CodeIgniter.php"
第153行
if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT))
然后第158行
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT);
然后编辑"system/libraries/Profiler.php"的第323行
$output .= "<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."