>  기사  >  백엔드 개발  >  关于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으로 문의하세요.