首页  >  文章  >  后端开发  >  关于zendframework的种自动加载

关于zendframework的种自动加载

WBOY
WBOY原创
2016-06-13 13:01:11875浏览

关于zendframework的类自动加载
目录结构

<br />
zf-demo <br />
  application<br />
    controller<br />
      IndexController.php<br />
    models<br />
      User.php<br />
    services<br />
    views<br />
   Bootstrap.php<br />

其中user.php的类名是Model_User,在IndexController.php中有这么一句调用$user = new Model_User();
执行时会报错
Fatal error: Class 'Model_User' not found in D:\lamp\sites\zf-demo\application\controllers\IndexController.php on line 132
上网搜索后得到答案
在Bootstarp.php中加入_initAutoload方法
Bootstrap.php代码
<br />
<?php<br />
<br />
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {<br />
	protected function _initAutoload() {<br />
        $moduleLoader = new Zend_Application_Module_Autoloader(array(<br />
        'namespace' => '',<br />
        'basePath' => APPLICATION_PATH));<br />
        <br />
        /** auto load */<br />
        $autoloader = Zend_Loader_Autoloader::getInstance();<br />
        $autoloader->setFallbackAutoloader(true);<br />
        return $moduleLoader;<br />
    }<br />
  <br />
}<br />
<br />


再次执行,就能成功加载user类了.

问题:
按我的理解,zend的自动加载机制,是把类名中的下划线替换成路径分隔符,然后根据include_path的顺序去加载类
如果是这样的话,Model_User会转换成Model/User.php来进行加载,但是目录中没有model这个文件夹,只有models,为什么也能加载成功?,_initAutoload到底做了什么?谁能解释一下?
------解决方案--------------------

引用:
引用:

你可以看代码。

Application_Model_User 正常应该是这样的。你的路径不正确。

自动加载,一种是根据上面的自动转换路径。 二是根据目录搜索所有相关类。

controller里的自动加载和bootstrap里的自动加载用的可能是同一个类,你不过你指定了路径。


你是说user.php的类名应该是Applic……


可以!这是一种默认吧! 至少quick start的例子孓是这样的。 命令行 create model user 自动创建就是样的。 用的models文件夹。
------解决方案--------------------
通常这种不规则的命名空间是用Zend_Loader_Autoloader_Resource的。为了方便,框架应用本身的结构继承实现了Zend_Application_Module_Autoloader,简化了操作,看源代码就知道了
以下类的源代码

/**
 * Resource loader for application module classes
 *
 * @uses       Zend_Loader_Autoloader_Resource
 * @category   Zend
 * @package    Zend_Application
 * @subpackage Module
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Application_Module_Autoloader extends Zend_Loader_Autoloader_Resource
{
    /**
     * Constructor
     *
     * @param  array
------解决方案--------------------
Zend_Config $options
     * @return void
     */
    public function __construct($options)
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn