關於zendframework的類自動載入,該如何處理

來源:互聯網
上載者:User
關於zendframework的類自動載入
目錄結構
HTML code
zf-demo   application    controller      IndexController.php    models      User.php    services    views   Bootstrap.php

其中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代碼
PHP code
 '',        'basePath' => APPLICATION_PATH));                /** auto load */        $autoloader = Zend_Loader_Autoloader::getInstance();        $autoloader->setFallbackAutoloader(true);        return $moduleLoader;    }  }


再次執行,就能成功載入user類了.

問題:
按我的理解,zend的自動載入機制,是把類名中的底線替換成路徑分隔字元,然後根據include_path的順序去載入類
如果是這樣的話,Model_User會轉換成Model/User.php來進行載入,但是目錄中沒有model這個檔案夾,只有models,為什麼也能載入成功?,_initAutoload到底做了什嗎?誰能解釋一下?

------解決方案--------------------
探討

引用:

你可以看代碼。

Application_Model_User 正常應該是這樣的。你的路徑不正確。

自動載入,一種是根據上面的自動轉換路徑。 二是根據目錄搜尋所有相關類。

controller裡的自動載入和bootstrap裡的自動載入用的可能是同一個類,你不過你指定了路徑。


你是說user.php的類名應該是Applic……

------解決方案--------------------
通常這種不規則的命名空間是用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)
{
parent::__construct($options);
$this->initDefaultResourceTypes();
}

/**
* Initialize default resource types for module resource classes
*
* @return void
*/
public function initDefaultResourceTypes()
{
$basePath = $this->getBasePath();
$this->addResourceTypes(array(
'dbtable' => array(
'namespace' => 'Model_DbTable',
'path' => 'models/DbTable',
),
'mappers' => array(
'namespace' => 'Model_Mapper',
'path' => 'models/mappers',
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms',
),
'model' => array(
'namespace' => 'Model',
'path' => 'models',
),
'plugin' => array(
'namespace' => 'Plugin',
'path' => 'plugins',
),
'service' => array(
'namespace' => 'Service',
'path' => 'services',
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.