- ベストアンサー
ZendとSmarty3の組込で発生したエラー
- ZendとSmarty3を組み合わせて使用する際に、表示されるエラーについて解決方法を教えてください。
- Smarty3を使用している場合、フォルダ名がInternalではなくsyspluginsに変更されていることが原因でエラーが発生することがあります。
- エラーメッセージに表示されるファイルを確認し、変更されたフォルダ名に合わせてファイルを修正してください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
PHPには、autoloadといって、未定義のクラスのインスタンスを生成しようとした場合に、自動的にそのクラスがあるファイルを取得する記述が出来ます。 <?php spl_autoload_register('my_autoload'); function my_autoload($class_name){ require_once $class_name . ".php"; } $instance = new MyClassName(); ?> このようにすると、スクリプト中未定義であるMyClassNameをnewすると、存在しないので、autoloaderとして登録してある、my_autoload関数が呼ばれ、その中に記述してあるように、[MyClassName.php]をインクルードするように処理しています。 (当然、MyClassName.phpファイルが存在しなければエラーでこける。) また、複数のautoloadが登録されている場合、 <?php spl_autoload_register('my_autoload_one'); spl_autoload_register('my_autoload_two'); //こんな感じで。 ?> 最初に登録されたものから順番に実行されます。 っていう前提のもと、ZendFrameworkは、Zend_Loaderとかそんなクラスでautoloadを登録しています。 そして、Zendはどの様に呼ぶかというと、 Zend_Http_Clientというクラスがあったとすると、「_」を「/」に変更して、拡張子をつけた物、つまり、 Zend/Http/Client.php というディレクトリを探してくるように記述されています。 ソレとは全く別のルールでSmarty3は、自分のプラグインを呼ぶときに、例えば、テンプレート中にdataというプラグインを呼ぶ場合、 Smarty_Internal_Dataクラスを呼びます。そうすると、Smarty3が自前で実装しているautoloadでは、 sysplugin/smarty_internal_data.php というディレクトリを探してくるように記述されています。 以上のことから、結論として、Zendがもっているautoloadが、最初に登録されてしまっているために、Smarty3のもっているautoloadが後回しにされてしまっているため、エラーが出ているものと推測出来ます。 従って、 dcx147さんが参考にされたURLに記載の15行目、 Zend_Loader::registerAutoload(); と記述のある部分よりも前に、23行目にある require_once( SMARTY_DIR .'Smarty.class.php' ); を持ってくると、改善しそうです。 如何でしょうか。
お礼
的確な回答ありがとうございます。 おかげさまで問題解決です!本当にありがとうございました!