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