Переопределение констант в PHP - PullRequest
33 голосов
/ 11 декабря 2011

Можно ли переопределить константу в 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 использует данные пользователя, а не использует переменные в экземпляре.

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

Ответы [ 4 ]

58 голосов
/ 11 декабря 2011

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

runkit_constant_redefine("name", "value");

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

23 голосов
/ 11 декабря 2011

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

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

class user
{
  public $user = array();

  function load($user_id)
  {
    // etc
    $this->$user[$user_id] = something_else;
  }
}
7 голосов
/ 24 декабря 2017

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

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

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

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

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

5 голосов
/ 16 октября 2015

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

...