Измените значение ранее определенной константы

Я определил константу в PHP, например

define('CONSTANT_NAME', 'constant_value'); 

Я хочу иметь возможность изменить значение этой константы позже в коде.

Это можно сделать? Если да, то как?

С http://php.net/manual/en/function.define.php (акцент мой):

define – определяет именованную константу

С http://www.php.net/manual/en/language.constants.php :

Как следует из названия, это значение не может измениться во время выполнения скрипта

Можно переопределить определение, когда оно было ранее определено как case_insensitive constant (3-й параметр).

Видеть:

 $ php -r "define('TEST','foo',true); var_dump(TEST); define('TEST','bar'); var_dump(TEST);" string(3) "foo" string(3) "bar" 

Протестировано с помощью PHP CLI 5.2.6 и 5.5.3.

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

Вместо этого вы должны использовать истинную переменную.

Потенциально вы можете переопределить функцию define() функции override_function() и использовать ниже adefine() замены adefine() , но вам нужно установить расширение apd PHP. Или переименуйте его, затем определите свой собственный (например, rename_function('define', 'old_define'); ).

Вот несколько примеров замены, которые вы можете использовать:

 <?php function adefine($constant_name, $value=null) { static $increment = 0; // 1 for bitmask if (is_null($value)) { define($constant_name, ++$increment); // $increment=$increment<<1 for bitmask } else { define($constant_name, $value); if (is_numeric($value)) { $increment = $value; } } } ?> 

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

 <?php adefine ('RULE_CALLBACK_FORMAT', 1); // 1 adefine ('RULE_CHANGE_CALLBACK_ON_ERROR'); // 2 adefine ('RULE_CHANGE_COMPARE_DATE'); // 3 adefine('KEYWORD', 'hodgepodge'); // hodgepodge <-- defined normally adefine ('RULE_CHANGE_ON_DATE'); // 4 adefine ('ERROR_DESC', 1); // 1 <-- Counter reset adefine ('ERROR_EXPECTED_RESULT'); // 2 ?>