Запретить перезапись переменных в PHP

Можно ли предотвратить перезапись переменных в PHP? Я создаю систему с некоторыми зарезервированными переменными, и я не хочу, чтобы они были заменены чем-то другим после определенного момента. Это возможно? Если нет, что я могу сделать, чтобы приблизиться к чему-то близкому к этому?

Некоторые из этих переменных представляют собой экземпляры классов, поэтому я не могу определить их как константы.


person Vinicius Tavares    schedule 26.07.2012    source источник
comment
Как насчет пространств имен   -  person Musa    schedule 26.07.2012
comment
Что делает замена? Вы импортируете переменные из ненадежного пользовательского контента? Или это просто общая концепция защиты себя от себя в будущем?   -  person Matthew    schedule 26.07.2012
comment
Да, технически я защищаюсь, чтобы все испортить, но не только меня, потому что я не единственный, кто пишет сценарии, поэтому главные переменные могут столкнуться в какой-то момент.   -  person Vinicius Tavares    schedule 26.07.2012
comment
Мне не хочется печатать полный ответ, поэтому я просто скажу: избегайте глобальных переменных! Используйте классы и правильные методы инкапсуляции.   -  person Matthew    schedule 26.07.2012


Ответы (5)


Взгляните на этот вопрос. Также может оказаться полезной информация о константах в руководстве по PHP.

person n8schloss    schedule 26.07.2012
comment
он сказал, что не может использовать константы, хотя ссылка на static protected может быть полезной. - person Cymbals; 26.07.2012
comment
Я знаю, поэтому я сначала связался с другим вопросом. Тем не менее, чтение констант может быть полезным. (особенно некоторые примеры кода на странице руководства) - person n8schloss; 26.07.2012
comment
Он отлично сделал то, что мне нужно. Спасибо! - person Vinicius Tavares; 28.07.2012

Да, они называются константами.

Если вы не можете их использовать, при условии, что вы используете последнюю версию PHP, вы можете использовать пространства имен, используя пространства имен, вы можете иметь 2 переменные с одинаковым именем в разных пространствах имен. Чтобы у вас не было столкновений.

person Madara's Ghost    schedule 26.07.2012
comment
он сказал, что не может использовать константы - person Cymbals; 26.07.2012
comment
Спасибо, я просмотрел документацию, и пространства имен очень помогут мне в будущем, но, к сожалению, мне придется иметь дело с разными версиями PHP на многих серверах, и я не могу предположить, что все они могут быть обновлены до последняя версия, так что я выберу один из других вариантов - person Vinicius Tavares; 26.07.2012

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

person Cymbals    schedule 26.07.2012
comment
статический тоже вариант. но должно быть одинаковое значение для всех объектов. - person Cymbals; 26.07.2012

Невозможно выяснить, как это проще всего в ваших ситуациях, так как кода вообще нет, но одним из лучших вариантов, вероятно, будет

  1. скрыть их в классе как частные члены vars.
  2. выставить их через геттеры.

При необходимости сделайте их статичными

person Nanne    schedule 26.07.2012

Возможно, вы можете реализовать что-то вроде замороженного состояния, и если класс заморожен, его нельзя изменить:

class Test
{
    private $variable;
    private $frozen = false;

    public function freeze() {
        $this->frozen = true;
    }

    public function setVariable($value) {
        if ($this->frozen)
            throw new Exception("...");

        $this->variable = $value;
    }
}
person Fanda    schedule 26.07.2012