Zend Framework自动加载类由模型扩展

时间:2010-01-19 22:36:55

标签: zend-framework

我是zend框架的新手所以也许这个问题很愚蠢......

我有一个默认的层次结构

站点
| --bootstrap.php
| --application
| --models
| - Item.php
| - ModelAbstract.php
| --...

在Item.php里面有

<?php
    //TODO: trying to remove this require...
    require_once('ModelAbstract.php');

    class CF_Model_Flower extends CF_Model_Abstract
    {
      ...

在'ModelAbstract.php'里面有

<?php

    class CF_Model_Abstract
    {
     ...

我的应用程序Bootstrap.php看起来像

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'CF',
            'basePath'  => dirname(__FILE__),
        ));
        return $autoloader;
    }
  ...

如果我删除了Item.php中的'require_once',我会得到

Fatal error: Class 'CF_Model_Abstract' not found in /Mysite/application/models/Item.php on line 6

为什么?如果没有这个require_once,我怎么能使用自动加载?

事实上,将'ModelAbstract.php'重命名为'Abstract.php'是有效的。有人能解释我为什么吗?

THX

3 个答案:

答案 0 :(得分:0)

我不熟悉Zend_Application_Module_Autoloader等。但如果它们像早期的ZF自动加载机制那样工作,自动加载器将在以下位置寻找类CF_Model_Abstract:

CF/Model/Abstract.php

或者可能使用此命名空间/ basePath配置:

models/Model/Abstract.php

或:

models/CF/Model/Abstract.php

但可能不在:

models/ModelAbstract.php

换句话说,下划线代表子目录。

答案 1 :(得分:0)

尝试在命名空间中指定_。

 $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'CF_',
            'basePath'  => dirname(__FILE__),
 ));

答案 2 :(得分:0)

将以下内容放入引导程序文件中:

protected function _initAutoLoad()
{
    $loader = new Zend_Loader_Autoloader_Resource(array(
        'basePath'  => APPLICATION_PATH,
        'namespace' => 'CF',
    ));

    $loader->addResourceType('form', 'forms', 'Form')
        ->addResourceType('model', 'models', 'Model')
        ->addResourceType('mapper', 'models/mappers', 'Model_Mapper')
        ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');
    return $loader;
}

这将为您加载模型,表单,dbtables和映射器。希望这可以解决问题。