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

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

define('CONSTANT_NAME', 'constant_value');

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

Можно ли это сделать? Если да, то как?

Ответы

Ответ 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
?>