私は現在、HMVCデザインパターンを使用した学習演習として、独自のPHPフレームワークを作成しています。それはすべて機能します:)が、PHPコードで静的クラスを参照するのは悪い習慣だと何度も読んだことがあります。これは、autoload関数で行っていることとまったく同じです。
function __autoload($className) {
$path = SERVER_ROOT . DS . 'applications' . DS . Dispatcher::getApplicationName() . DS . 'models' . DS . 'class.' . strtolower($className) . '.php';
if (file_exists($path)) {
require_once($path);
} else {
throw new Exception('Can\'t find a model at "' . $path . '".');
}
}
ご覧のとおり、静的呼び出しを使用して現在のアプリケーションを取得しますDispatcher::getApplicationName()
。これは、依存関係を導入するため、多くの人にとっては悪いことです。debug_backtrace()
モデルを開始するクラスにはApplicationNameがプロパティとして含まれているため、を使用してapplicationNameを取得することもできます。それは良いですか、それとも私が考えていなかった他の選択肢がありますか?
ありがとう!
編集:上記のコードには別の問題があることを忘れてしまいました。HMVCデザインパターンを使用しているため、コントローラーのアプリケーションがディスパッチャーのアプリケーションと常に一致するとは限りません(コントローラーはコントローラー内と呼ばれます)。これは、を使用してのみ修正できますdebug_backtrace
。
Dispatcher::getApplicationName()
編集:私が今使用する代わりにRequest::getCurrentApplicationName()
。リクエストクラスがすべてのアプリケーションを保存するため、再び機能するようになりました。これは良いですか、それとももっと良い方法がありますか?
<?php
class Request {
private static $_controllers = array();
private static $_applicationsNames = array();
public static function _getCurrentApplicationName() {
return end(self::$_applicationsNames);
}
public static function _load($applicationName, $controllerName, $methodName) {
// Add the application the the array (for autoloading).
self::$_applicationsNames[] = $applicationName;
// Check if the controller has already been instantiated.
if (!isset(self::$_controllers[$applicationName . DS . $controllerName])) {
require_once(APPLICATIONS_ROOT . DS . $applicationName . DS . 'controllers' . DS . 'class.' . $controllerName . '.php');
self::$_controllers[$applicationName . DS . $controllerName] = new $controllerName($applicationName);
}
// Get the user arguments.
$arguments = array_slice(func_get_args(), 3);
// Call the method.
$result = call_user_func_array(array(self::$_controllers[$applicationName . DS . $controllerName], $methodName), $arguments);
// Remove the last value from the applications array.
array_pop(self::$_applicationsNames);
}
}