Задать вопрос

Как создать класс с «глобальными константами»?

Взялся переписывать проект с процедурного стиля в объектно-ориентированный. Раньше был файл config, где были прописаны все глобальные константы, например, константа ROOT имеет значение $_SERVER['DOCUMENT_ROOT'];

Сейчас решил создать абстрактный класс abstract GlobalConfig и в нём прописать эти константы, чтобы потом тягать значения в другие классы, например так: GlobalConfig::ROOT.

Но теперь проклял всё на свете...

1, Присваивать константе или свойству значение $_SERVER['DOCUMENT_ROOT'] PHP не хочет - должно быть точное значение, видите ли.
2. Прописать метод __construct с присвоением $this->ROOT = $_SERVER['DOCUMENT_ROOT'] тоже нельзя, так как это абстрактный класс.
3. Прописывание __get с возвратом $_SERVER['DOCUMENT_ROOT'] при запросе GlobalConfig::$ROOT не помогает, так как сработает только при создании экземпляра класса (я специально создал абстрактный класс, чтобы не надо было создавать экземпляры), а объявить __get статическим нельзя!

Я просто в ауте. Можно как-то реализовать то, что я задумал??
  • Вопрос задан
  • 1377 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
mzcoding
@mzcoding
Web-Разработка
abstract class GlobalConfig{
	const ROOT = "DOCUMENT_ROOT";
	public function root(){
		return $_SERVER[self::ROOT];
	}
}
class A extends GlobalConfig{
	public function ttt(){
		return parent::root();
	}
}

$a = new A();
echo $a->ttt();

Вот тебе! Дальше, делай тоже самое, для remote_addr, http_host,http_referer etc.

А если серьезно, выше верно написали, почитай больше про ооп, потом пиши) А то ты пытаешься писать процедурно только с использованием классов :)
Ответ написан
Audiophile
@Audiophile Автор вопроса
Нашёл одно интересное решение.
Вы правы - кто говорил, что я фактически не использовал ООП подход, т. к. даже не создавал объекты. Вот, как задача решается с применением синглтона:

class Configurator
{
    static private $_instance = NULL;
    private $ROOT;
    
    private function __construct()
    {
        $this->ROOT = $_SERVER['DOCUMENT_ROOT'];
    }
    
    private function __clone()
    {
    }
    
    public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self;
        }
        return self::$_instance;
    }
    
    public final function __get($name)
    {
        return $this->$name;
    }
}


Далее пишем $config = Configurator::getInstance() и получаем нужные значение обычным способом: $config->ROOT.
Изменить значение переменной извне нельзя, так что это именно то, что я хотел, аналог констант в процедурном интерфейсе. И без создания лишних объектов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
belinskiy
@belinskiy
Учусь
Конечно можно) Вам скоро ответят на этот вопрос. Я просто не могу обьяснить.
Ответ написан
@skynetdev
А что трейты не пойдут в этом случае??
php.net/manual/ru/language.oop5.traits.php
Ответ написан
Hesed
@Hesed
Если создавать класс, который будет хранить все параметры конфигурации, то зачем его делать абстрактным? Вы собираетесь от него наследоваться и он будет хранить какие-то абстрактные методы, обязательные для переопределения? В таком случае, почему он называется GlobalConfig?

Если речь идёт о смене архитектуры приложения, то с неё и надо начинать. Отвяжитесь от констант, они тут (насколько я могу судить по условию) создают больше проблем. Начиная работать с ООП, пожалуй, проще будет создать что-то типа синглтона, который будет подгружать конфигурацию в какой-либо объект или массив. Нарисуйте прототип архитектуры на бумаге с областями видимости и контекстом и не придётся проклинать объектно-ориентированный подход.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы