Класс констант против глобальных констант

Я работаю над проектом, в котором все глобальные константы были определены в классе Constants, например

class Constants { const MIN_VALUE = 0.0; const MAX_VALUE = 1.0; public static function getMinValue() { return self::MIN_VALUE; } public static function getMaxValue() { return self::MAX_VALUE; } public static function getValueDependingOnURL() { if($_SERVER['REQUEST_URI'] == 'something') { return self::MIN_VALUE; } else { return self::MAX_VALUE; } } } 

Затем по всему коду что-то вроде Constants::getMaxValue() используется для получения значения константы. Это кажется очень странным подходом, почему бы вам просто не использовать функцию define во внешней области? Я знаю, что define() может быть довольно медленным, но, безусловно, необходимость вызова свойства класса не является наиболее эффективным способом?

EDIT: Также некоторые функции имеют в них условия, поэтому функции называются

Устраните вопрос: в чем преимущество контейнера конфигурации над глобальными define() ed contantants?

Преимущества – это все преимущества, которые предлагает ООП: абстракция данных и инкапсуляция , наследование , полиморфизм и лучшая интеграция шаблонов проектирования .

Читатели этой темы кажутся немного запутанными и сосредоточены на своем классе, а не на главном вопросе. Чтобы это сделать, позвольте мне привести пример:

 class Configuration { protected $someValue; } class ConfigurationDev extends Configuration { protected $baseUrl = 'http://devel.yoursite.com/'; } class ConfigurationLive extends Configuration { protected $baseUrl = 'http://www.yoursite.com/'; } 

index.php:

 <?php $config = new ConfigurationDev; $tracking = new Tracking($config); ... 

класс Отслеживание:

 class Tracking { public function __construct(\Configuration $config) { if ($config instanceof \ConfigurationLive) { // We are in live environment, do track } else { // Debug Notice: We are NOT in live environment, do NOT track } } } 

Объяснение сценария:

Представьте, что вы хотите отслеживать пользователей, но только в живой системе, а не в вашей системе разработки. Класс Tracking ожидает живую конфигурацию, но отменяет (без воздействия), если это не живая конфигурация.

Ваш класс с const не самый лучший, потому что const подразумевает, что вы не хотите изменять переменные. Не используйте переменную для значений, которые могут измениться. Вы не должны использовать статический материал, потому что он в основном конфликтует с инъекцией зависимостей. Передайте реальные объекты!

Ваша функция public static function getValueDependingOnURL() должна быть помещена в класс Helper, а не в контейнер Constant / Configuration.

 class Helper { protected $config; public function __construct(\Configuration $config) { $this->config = $config; return $this; } public function getValueByUrl($url) { if ($url == 'something') { return $config->getMinValue(); } else { return $config->getMaxValue(); } } } 

Теперь у вас могут быть разные наборы конфигурации, на которые опирается вспомогательный класс:

 $config = new ConfigurationLive; $helper = new Helper($config); $value = $helper->getValueByUrl($_SERVER['REQUEST_URI']); 

В моих примерах много примеров дизайна, стиля кода и ООП, узнайте о них, и вы получите гораздо более высокий уровень разработки программного обеспечения, чем читатели вашего вопроса. Удачи!

Вы можете сделать также короткий путь получения констант, таких как Constants::MIN_VALUE . Попробуйте сами.

Если вы спрашиваете о преимуществах констант класса и констант, определенных в глобальной области видимости, я бы сказал, что константа класса может быть более понятным подходом из-за ее ограниченного объема. Также имеет смысл иметь константу MAX_VALUE определенную в классе, который ее использует, а не где-то еще.

Но это не похоже на ваше дело, потому что ваш класс Constants похоже, действует как контейнер для некоторых случайных констант. MIN_VALUE что?