zendframeworkの自動クラスローディングについて
ディレクトリ構造
HTMLコード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
zf-demo
application
controller
IndexController.php
models
User.php
services
views
Bootstrap.php
ログイン後にコピー
user.phpのクラス名はModel_Userで、IndexController.php内に$を呼び出すような文がありますuser = new Model_User();
実行時にエラーが報告されます
致命的なエラー: クラス 'Model_User' が D:lampsiteszf-demoapplicationcontrollersIndexController.php の 132 行目に見つかりません
オンラインで検索した後、回答
Bootstarp.php に _initAutoload メソッド
Bootstrap.php コード
PHP コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
protected function _initAutoload() {
$moduleLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH));
/** auto load */
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
return $moduleLoader;
}
}
ログイン後にコピー
を追加して再度実行すると、ユーザー クラスがロードされます
問題 :
私の理解によれば、zend の自動ロードメカニズムは、クラス名のアンダースコアをパス区切り文字に置き換えてから、include_path
の順序に従ってクラスをロードすることです。この場合、Model_User は Model/User.php に変換されてロードされますが、ディレクトリにはモデル フォルダーがなく、モデルのみが正常にロードされるのはなぜですか?誰か説明してもらえますか?
-----解決策--------------------------
------解決策----------------------通常、この種の不規則な名前空間は Zend_Loader_Autoloader_Resource を使用します。便宜上、フレームワーク アプリケーション自体の構造継承には Zend_Application_Module_Autoloader が実装されており、これは
次のクラスのソース コード
/***/
クラス Zend_Application_Module_Autoloader は Zend_Loader_Autoloader_Resource を拡張します
{
/**
* アプリケーション モジュール クラスのリソース ローダー
*
* @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 新しい BSD ライセンス
*/
public function __construct($options)
{
parent::__construct($options) );
$this-> ;initDefaultResourceTypes();
}
/**
* コンストラクター
*
* @param array|Zend_Config $options
* @return void
*/
public function initDefaultResourceTypes()
{
$basePath = $this->getBasePath();
$this->addResourceTypes(array(
'dbtable' => array(
'namespace' => 'Model_DbTable',
'パス' => 'models/DbTable' ,
),
'mappers' => array(
'namespace' => 'Model_Mapper',
'path' => /mappers',
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms',
) ,
'モデル' => ; array(
'名前空間' => 'モデル',
'パス' => 'モデル',
),
'プラグイン' = > array(
'名前空間' => 'プラグイン',
'パス' => 'プラグイン',
),
'サービス' =>名前空間' => 'サービス',
'パス' => 'サービス',