關於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',