Я определил константу в 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 ?>