Переопределение констант в PHP

Можно ли переопределить константу в php, которая была определена функцией define ? У меня есть класс с несколькими константами, который содержит данные пользователя. Я пытаюсь использовать этот класс для нескольких пользователей.

 define('ALLEGRO_ID', 'id'); define('ALLEGRO_LOGIN', 'login'); define('ALLEGRO_PASSWORD', 'passwd'); define('ALLEGRO_KEY', 'key'); define('ALLEGRO_COUNTRY', 123); $allegro = new AllegroWebAPI( ); $allegro -> Login(); 

Я не писал этот класс, но я использую его из-за ограничений по времени. Я не знаю, почему создатель этого класса defined пользовательские данные, а не использовал переменные в экземпляре.

Я знаю, что константы должны быть постоянными (очевидно!), Но я ищу трюк, чтобы переопределить их.

Если у вас установлено расширение runkit_constant_redefine() , вы можете использовать runkit_constant_redefine() :

 runkit_constant_redefine("name", "value"); 

Однако в большинстве случаев было бы лучше пересмотреть, почему вы используете константы, а не что-то более подходящее.

Нет, вы не можете переопределить константу (кроме как runkit_constant_redefine ),
поэтому называется CONSTANT.

То, что вы ищете в классе, на самом деле является переменной объекта в формате массива:

 class user { public $user = array(); function load($user_id) { // etc $this->$user[$user_id] = something_else; } } 

Значение константы после определения остается неизменным во всей программе. Если у вас есть такое требование, когда вы хотите изменить значения в будущем, сохраните такие значения в переменных PHP.

В PHP 5.6+ вы можете импортировать константы под псевдонимом. Такой псевдоним может перезаписать уже существующую константу.

Следующий фрагмент напечатает int(5) :

 define('ALLEGRO_ID', 3); define('NEW_ALLEGRO_ID', 5); use NEW_ALLEGRO_ID as ALLEGRO_ID; var_dump(ALLEGRO_ID); 

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

Наконец, это поведение позволяет создавать очень запутывающие ситуации, такие как use const true as false; ,