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();
という記述があります。
を実行するとエラーが報告されます
致命的なエラー: クラス 'Model_User' が D:lampsiteszf-demoapplicationcontrollersIndexController.php の 132 行目に見つかりません
オンラインで検索して答えを見つけてください
_initAutoload メソッドを Bootstarp.php に追加します
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 />
ログイン後にコピー
再度実行すると、ユーザー クラスが正常にロードされます。
質問:
私の理解によれば、zend の自動ロードメカニズムは、クラス名のアンダースコアをパス区切り文字に置き換え、 include_path
の順序に従ってクラスをロードすることです。
この場合、Model_User はロードのために Model/User.php に変換されますが、ディレクトリにはモデル フォルダーがなく、モデルのみが正常にロードされるのはなぜですか?誰か説明してもらえますか?
------解決策---------
にするべきだということですか?
できる!これは一種のデフォルトです。少なくとも、クイック スタートの例ではこれが当てはまります。コマンドライン作成モデルユーザーは自動的にモデルを作成します。使用モデルフォルダー。
------解決策----------------------通常、この種の不規則な名前空間は Zend_Loader_Autoloader_Resource を使用します。便宜上、フレームワーク アプリケーション自体の構造継承には Zend_Application_Module_Autoloader が実装されており、ソース コードを見るとわかります
。
以下のクラスのソースコード
/**
* アプリケーション モジュール クラスのリソース ローダー
*
* @uses Zend_Loader_Autoloader_Resource
* @category ゼンド
* @package Zend_Application
* @subpackage モジュール
* @copyright 著作権 (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd 新しい BSD ライセンス
*/
class Zend_Application_Module_Autoloader extends Zend_Loader_Autoloader_Resource
{
/**
* コンストラクター
*
* @param array
-----解決策---------Zend_Config $options
* @return void
*/
パブリック関数 __construct($options)