Измените значение ранее определенной константы
Я определил константу в PHP, например.
define('CONSTANT_NAME', 'constant_value');
Я хочу иметь возможность изменить значение этой константы позже в коде.
Можно ли это сделать? Если да, то как?
Ответы
Ответ 1
Из http://php.net/manual/en/function.define.php (акцент мой):
define
- Определяет названную константу
Из http://www.php.net/manual/en/language.constants.php:
Как следует из названия, это значение не может измениться во время выполнения script
Ответ 2
Можно переопределить определение, когда оно было ранее определено как 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.
Ответ 3
Вы не создали переменную, вы создали константу. Точкой константы является то, что они не могут быть изменены.
Вместо этого вы должны использовать истинную переменную.
Ответ 4
Ну, есть способ изменить ранее определенные константы. Для этого вы должны включить расширение runkit PHP: http://php.net/manual/en/function.runkit-constant-redefine.php
Расширение runkit предоставляет средства для изменения констант, пользовательских функций и пользовательских классов. Он также предоставляет настраиваемые суперглобальные переменные и встраиваемые суб-интерпретаторы через песочницу.
Это дает вам возможность изменять любой аспект, который вы хотите изменить в PHP. Это продвинутый материал, хотя.
Обратите внимание, что обычно есть причина для определения констант как констант, поэтому изменение их для других целей, кроме тестирования, вероятно, не очень хорошая идея почти в любом случае.
Ответ 5
Потенциально вы можете переопределить функцию define()
с помощью override_function()
и использовать ниже код замены 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, и вы можете reset счетчик для нового набора констант.
<?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
?>