Php изменить значение константы

Можно ли переопределить константы PHP?

@Porges Поргес Хе. Я бы не назвал рункит «переопределением» так сильно, как «избиением языка до крови».

Расширение PECL не связано с php, поэтому вам придется установить расширение runkit. Делать что-то подобное тоже плохо . это, вероятно, то, что вы использовали бы для тестирования / тестирования кода или других подобных вещей, но / никогда / в производстве (то же самое с отражением).

Отражение можно использовать, например, для RPC. Тем не менее, нет оснований для переопределения констант, особенно с такими хаки.

Вы не можете переопределить «константы», потому что они ограничены.

Если вы пытаетесь изменить константу, определенную во включенном файле, вы можете определить константу перед включением:

define ("PROCESS_NAME", "MIKE"); /* . code . */ include ("/path/to/included_file.php"); // also defines "PROCESS_NAME" /* . code . */ 

После прочтения многочисленных ответов на SO, большинство из которых проповедуют или утверждают очевидное, это, безусловно, самый полезный ответ для меня — он устранил проблему (с чужой популярной библиотекой кода, в которую я не хочу копаться). Я почти пропустил этот ответ из-за вступительного заявления, которое не только вписывается в категорию проповедь / очевидность, но также является неправильным. Меньше будет больше в этом случае.

Сначала: Нет, переопределить константы класса невозможно. Его невозможно на каждом языке, потому что иначе константа не будет постоянной.

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

runkit не является ядром PHP. Итак, да, вы можете переопределить константы — но только если вы установите расширение PECL.

Источник

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

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

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

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

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

Можно переопределить определение, когда оно было ранее определено как 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’); ).

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

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

Читайте также:  Html символ знак вопроса

Источник

Константы в PHP — const и define()

В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() . Константы в PHP — это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):

define('FOO', 'val'); define('FOO', 'val2'); // Notice: Constant already defined echo FOO; //> val
// 1 define( 'NAME', 'VALUE' ); // 2 const NAME = 'VALUE';

У каждого способа есть свои особенности, чтобы их понять, давайте рассмотрим все поэтапно, как и что менялось с каждой версией PHP.

Как создавать константы

PHP меньше 5.3

До 5.3 в PHP, константы можно было определять только через define() . Ключевое слово const появилось с версии 5.3.

Константы могут хранить только скаляры. Скалярные значения — это примитивы: integer , float , string и boolean . Типы array , object , resource и т.д. не являются скалярными.

// скаляры define( 'FOO', 10 ); define( 'FOO', 10.9 ); define( 'FOO', 'val' ); define( 'FOO', true ); // не скаляры define( 'FOO', array(1) ); // константа не установиться и получим Warning define( 'FOO', (object) array(1) ); // константа не установиться и получим Warning

С версии PHP 5.3

Появилось ключевое слово const и теперь константу можно определять еще и с помощью него.

Однако, в const нельзя указать выражение: переменную, функцию, конкатинацию, а нужно передавать только скаляр:

const FOO = 'val'; // нет ошибок const FOO = $var; // Parse error const FOO = home_url(); // Parse error const FOO = 5 + 10; // Parse error const FOO = 'foo'.'bar'; // Parse error

Тогда как для define() таких ограничений нет.

define( 'FOO', 'val' ); // нет ошибок define( 'FOO', $var ); // нет ошибок define( 'FOO', home_url() ); // нет ошибок define( 'FOO', 5 + 10 ); // нет ошибок define( 'FOO', 'foo'.'bar' ); // нет ошибок

PHP 5.6

Стало возможным указывать в значения const примитивные PHP выражения (выражения из скаляров):

const FOO = 1 + 2; const FOO = 'foo' . 'bar';

Стало возможным хранить массивы в константах:

const FOO = [1, 2, 3]; // работает define( 'FOO', [1, 2, 3] ); // не работает в PHP 5.6, работает в PHP 7.0

Разница между define() и const

#1 const должны быть объявлены в верхней области

Потому что они определяются при компилировании скрипта. Это значит, что const нельзя использовать внутри функций/циклов/выражений if или try/catch блоков.

#2 const всегда регистрозависима

В то время как define() позволяет создать регистро-независимые константы:

define( 'NAME', 'VALUE', true ); echo NAME; // VALUE echo name; // VALUE

#3 const понимает только скаляры, массивы и выражения из примитивов

const нельзя передать переменные, функции, выражения, а define() можно:

const FOO = $var; // Parse error const FOO = home_url(); // Parse error define( 'FOO', $var ); // нет ошибок define( 'FOO', home_url() ); // нет ошибок

С версии PHP 5.6 в const также можно указывать примитивные выражения и массивы, а не только скаляры.

#4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0

const FOO = [1, 2, 3]; // работает с PHP 5.6 define( 'FOO', [1, 2, 3] ); // работает с PHP 7.0

#5 const зависит от пространства имен, а define нет

Если мы создаем константу в namespace, то:

  • При использовании const — константа будет нахоидтся в этом прастранстве и не будет доступна вне его.
  • При использовании define — константа регистрируется как глобальная и будет доступна за пределами namespace.
namespace My\Space; const FOO = 'bar'; define( 'FOOO', 'baz' );

Теперь чтобы обратиться к этим константам за пределами пространства имен, например из другого файла, нужно писать так:

echo \My\Space\FOO; // bar echo FOOO; // baz
Итог сравнения

Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку. Исключения:

  • У вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .
  • Вам нужно, чтобы константа была не в глобальной видимости, а в видимости пространства имен (namespace).
Читайте также:  Тег TD

Константы PHP класса

Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения.

Объявленная константа принадлежит классу, она не принадлежит ни одному объекту, но является общей для всех объектов (экземпляров) класса.

class My_Class < const NAME = 'VALUE'; // начиная с PHP 5.6 можно использовать математические выражения const SEC_PER_DAY = 60 * 60 * 24; function print_name() < // обращение к константе класса внутри метода через self (сам класс) echo self::NAME; >> // обращение к константе вне класса // можно вызывать из глобальной области видимости без инициализации экземпляра класса echo My_Class::NAME;

До PHP 7.1 постоянные класса всегда общедоступны — нет статуса private или protected . Однако с версии PHP 7.1 константам класса можно указать модификатор:

Константы для классов чем-то похожи на static свойства класса. Не углубляясь в подробности, разница в том, что константу нельзя изменить.

class My_Class < const NAME = 'VALUE'; static $name = 'VALUE'; >echo My_Class::NAME; echo My_Class::$name;

«Волшебные» константы

И в заключении вспомним про особые константы PHP.

В PHP есть девять волшебных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана.

Все «волшебные» константы разрешаются во время компиляции, в отличии от обычных констант, которые разрешаются во время исполнения. Специальные константы нечувствительны к регистру и их список приведен ниже:

Константа Описание
__LINE__ Текущий номер строки в файле.
__FILE__ Полный путь и имя текущего файла, в котором вызывается константа.
__DIR__ PHP 5.3.0. Директория файла, в котором используется константа. То же самое что dirname(__FILE__) . Не имеет слэша в конце, кроме корневой директории.
__FUNCTION__ Имя функции.
__CLASS__ Имя класса. Это имя содержит название пространства имен, в котором класс был объявлен (например, Foo\Bar). Также работает в трейтах. При использовании в методах трейтов является именем класса, в котором эти методы используется.
__TRAIT__ PHP 5.4.0. Имя трейта. Это имя содержит название пространства имен, в котором трейт был объявлен (например, Foo\Bar).
__METHOD__ Имя метода класса.
__NAMESPACE__ PHP 5.3.0. Имя текущего пространства имен.
ClassName::class PHP 5.5.0. Полное имя класса (с указанием пространства имен).
До этого из: PHP

Источник

Как изменить константы PHP?

Я работаю над созданием собственной пользовательской CMS в PHP вручную, и у меня есть несколько констант, которые я определил. Есть ли простой способ изменить константы? Я думал об использовании чего-то вроде fopen() , а затем менял его, но я никогда не использовал функции файловой системы.

Читайте также:  Php classes functions objects

Константы являются константами — вы не можете их изменять. Если, конечно, вы говорите о define (‘constant_name’, ‘constant_value’); Иначе объясните на примере, потому что похоже, что вы пытаетесь поговорить об изменении параметров конфигурации CMS в его конфигурационном файле, переписав его с помощью php-скрипта.

Я знаю, что означает константа. Я просто хочу знать, есть ли способ, которым я мог бы изменить их, или что-то подобное. Я не хочу продолжать редактировать их вручную через файл php. Мне жаль, что я думаю не о том.

Может быть, он не пытается изменить их во время реального времени выполнения, но он хочет использовать их в качестве конфигурации для своей CMS и хочет, чтобы его скрипт установки изменил их или что-то еще? (Все еще не хорошее решение, просто может иметь больше смысла из вопроса.)

8 ответов

Константа — это идентификатор (имя) для простого значения. Как имя предполагает, что значение не может измениться во время выполнения script(за исключением магических констант, которые на самом деле не являются константами). По умолчанию константа чувствительна к регистру. По соглашению постоянная идентификаторы всегда заглавные.

Имя константы следует тем же правилам, что и любая метка в PHP. действительное постоянное имя начинается с буквы или подчеркивания, а затем любое количество букв, цифр или символов подчеркивания. Как регулярный выражение, оно будет выражено следующим образом: [A-Za-Z_\x7f-\XFF] [A-Za-z0-9_\x7f-\XFF] *

Константы являются константами и поэтому не могут быть изменены. Если вы хотите изменить серверные константы, такие как allow_url_fopen, то есть ответственность за хост, спросите их. Если вы хотите изменить их в PHP, используйте переменные

В действительности, как утверждает Корбин, и вы хотите изменить их при установке, вы хотели бы сделать следующее: 0. Измените значения константы на sg. как %%constant1 . 1. прочитайте код в переменной. 2. Пусть пользователь задает переменные. 3. Используйте str_replace для всех из них, например str_replace ( «%% constant1», $_ POST [ «value1» ], $configfile). 4. Поместите $configfile в качестве содержимого файла.

ОБНОВЛЕНИЕ 2

Для вашей собственной CMS я предлагаю следующее: хранить все константы в одном файле, поэтому вам нужно будет отредактировать только один файл. И, возможно, предыдущее решение может работать для более легкого редактирования, но IDK, если это стоит времени.

Нет. Они константы, как в » constant — то, что является постоянным или неизменным» (Викисловарь). Как только они будут определены, их невозможно изменить. Чтобы процитировать The Fine Manual, раздел Константы:

Значение

[константа] не может меняться во время выполнения script.

Прошу прощения за неправильность . для меня константы — это просто значение, которое можно использовать на всем сайте без необходимости их постоянного определения. Я должен был быть более ясным, чего я пытался достичь. Я создаю свою собственную CMS только для собственного использования, и мне было интересно, как я мог бы создать способ изменения переменных или любой другой подходящий для них термин без ручного редактирования файла / файлов, которые их содержат. Я прошу прощения.

Хорошо. Каким будет лучший способ создать файл конфигурации? Я собираюсь добавить панель администратора в свою CMS, и я хочу, чтобы переменные были отредактированы оттуда.

Источник

Оцените статью