Почему define в php может принимать случайные значения?

Константы не могут принимать выражения, которые производят вычисления. Почему я могу объявить DEFINE с помощью random_int (1,4) и не получить фатальную ошибку? В этом случае значение константы будет изменяться каждый раз при загрузке страницы. Верно ли это для идеологии констант?

define('RANDOM_NUMBER', random_int(2,4));

Это вопрос идеологии. Почему это правильно в PHP? И почему можно использовать выражение в DEFINE, но не в константах?

как вы думаете, почему это не может быть выражением?

skyboyer 10.08.2018 17:29

Потому что define выполняется во время выполнения. Сначала выражение оценивается, а затем присваивается константе. В чем проблема?

lxg 10.08.2018 17:30

Константы должны быть постоянными при однократном вызове сценария, а не при каждом его вызове.

Alex Howansky 10.08.2018 17:31

Вы определяете его как генерируемое число. Не отличается от define ('RANDOM_NUMBER', 3). Случайное число вычисляется до его определения.

Chad K 10.08.2018 17:31

Возможный дубликат определить () против const

iainn 10.08.2018 17:47
1
5
58
3

Ответы 3

Constants can't accept expressions that make calculations.

Это неправда.

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

Ограничения для параметра value определения: (из руководство по эксплуатации)

value

The value of the constant. In PHP 5, value must be a scalar value (integer, float, string, boolean, or NULL). In PHP 7, array values are also accepted.


Конечно, константа не может быть определена дважды.

И - если я понимаю ваш вопрос - это "идеология" констант.

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

Конечно, если скрипт запускается во второй раз, константа может получить другое значение, как в вашем случае.


Стоит отметить, что это отличается от Константы класса - констант, которые вы объявляете внутри определения класса с ключевым словом const.

Из-за языкового дизайна / спецификаций

The value must be a constant expression, not (for example) a variable, a property, or a function call.

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

serezha93 10.08.2018 17:36

Потому что функция define получает только результат random_int(2,4) в качестве параметра и не может понять, был ли он создан случайным или детерминированным способом.

На самом деле программа:

$temp = random_int(2,4);
define("RANDOM_NUMBER", $x);

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

Официальная документация php гласит:

While it is possible to define resource constants, it is not recommended and may cause unpredictable behavior.

То же самое будет применяться к любым нескалярным значениям, присвоенным константе DEFINE. В документации PHP указано, что:

The value of the constant. In PHP 5, value must be a scalar value (integer, float, string, boolean, or NULL). In PHP 7, array values are also accepted.

Другие вопросы по теме