В настоящее время я пишу свой собственный PHP-фреймворк в качестве учебного упражнения с использованием шаблона проектирования HMVC.Все это работает :), но я много раз читал, что это плохая привычка ссылаться на статические классы в вашем PHP-коде, что я и делаю в своей функции автозагрузки:
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()
, что, по мнению многих, плохо, так как оно вводит зависимости.Я также могу получить applicationName, используя debug_backtrace()
, поскольку класс, который инициирует модель, содержит 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);
}
}