php Разница между define и const для объявления констант
Primary tabs
Forums:
Решил вот заполнить пробел в знаниях и заодно сделать доброе дело и перевести вот этот пост (а если быть точнее, то лучший ответ на него) о различиях между объявлениями констант в PHP на русский. Если у кого-то будут замечания по переводу, пожалуйста указывайте на них, так как я далеко не переводчик ))
Фундаментальная разница между ними (const и define) состоит в том, что const объявляет константы во время компиляции, в то время как define объявляет их во время выполнения скрипта. Этот факт определяет большинство недостатков конструкции const. Вот некоторые из них:
Зачем нам в принципе может понадобится такое делать? Одно часто используемое применение состоит в том, чтобы проверять объявлена ли константа или еще нет:
Это была негативная «сторона медали». Теперь давайте посмотрим на причины, по которым лично я всегда использую const, если не возникает ни одной из вышеперечисленных ситуаций:
Хорошо известно, что define()ы медлительны, если используется большое количество констант. Люди даже изобрели такие вещи как apc_load_constants() и hidef чтобы обойти этот недостаток
const инициализирует константы приблизительно в два раза быстрее (На машинах для разработки с включённым XDebug даже больше). С другой стороны, время поиска не меняется (поскольку оба типа констант делят одну таблицу поиска )
Наконец, стоит отметить, что const также используется внутри класса или интерфейса, для объявления классовой константы или константы интерфейса. define() не может быть использована в подобных целях:
Подытоживая:
За исключением случаев динамического объявления или же объявления в виде выражения, используйте const вместо define() просто по причине лучшей читаемости!
Константы в PHP — const и define()
Объявлять константы в PHP можно двумя способами:
У каждого способа есть свои особенности, чтобы их понять, давайте рассмотрим все поэтапно, как и что менялось с каждой версией PHP.
Как создавать константы
PHP меньше 5.3
С версии PHP 5.3
Появилось ключевое слово const и теперь константу можно определять еще и с помощью него.
Однако, в const нельзя указать переменную, функцию или какое то выражение, а нужно передавать скаляр «напрямую»:
Тогда как для define() таких ограничений нет.
PHP 5.6
Стало возможным указывать в значения const примитивные PHP выражения (выражения из скаляров):
Стало возможным хранить массивы в константах:
Разница между define() и const
#1 const должны быть объявлены в верхней области
Потому что они определяются при компилировании скрипта. Это значит, что const нельзя использовать внутри функций/циклов/выражений if или try/catch блоков.
#2 const всегда регистрозависима
В то время как define() позволяет создать регистро-независимые константы:
#3 const понимает только скаляры
const нельзя передать переменные, функции, выражения, а define() можно:
С версии PHP 5.6 в const также можно указывать примитивные выражения, а не только скаляры.
#4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0
Итоги сравнения
Константы PHP класса
Объявленная константа принадлежит именно классу, она не принадлежит ни одному объекту и является общей на всех объектов (экземпляров) класса.
Константы для классов чем-то похожи на статические (static) свойства класса. Не углубляясь в подробности, разница в том, что константу нельзя изменить.
«Волшебные» константы
И в заключении вспомним про особые константы PHP.
В PHP есть девять волшебных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все «волшебные» константы разрешаются во время компиляции, в отличии от обычных констант, которые разрешаются во время исполнения. Специальные константы нечувствительны к регистру и их список приведен ниже:
define () против const
Довольно простой вопрос: в PHP, когда вы используете
и когда вы используете
Каковы основные различия между этими двумя?
Решение
Начиная с PHP 5.3 существует два способа определить константы : Либо используя const ключевое слово или используя define() функция:
Принципиальная разница между этими двумя способами заключается в том, что const определяет константы во время компиляции, тогда как define определяет их во время выполнения. Это вызывает большинство const Недостатки. Некоторые недостатки const являются:
const не может использоваться для условного определения констант. Чтобы определить глобальную константу, она должна использоваться во внешней области видимости:
Зачем тебе это делать? Одним из распространенных применений является проверка, была ли константа уже определена:
const принимает простое имя константы, тогда как define() принимает любое выражение в качестве имени. Это позволяет делать такие вещи:
const s всегда чувствительны к регистру, тогда как define() позволяет определять регистронезависимые константы, передавая true в качестве третьего аргумента:
Итак, это была плохая сторона вещей. Теперь давайте посмотрим на причину, почему я лично всегда использую const если не происходит одна из вышеуказанных ситуаций:
const определяет константу в текущем пространстве имен, в то время как define() должно быть передано полное имя пространства имен:
Начиная с PHP 5.6 const константы также могут быть массивами, в то время как define() пока не поддерживает массивы. Однако массивы будут поддерживаться в обоих случаях в PHP 7.
Наконец, обратите внимание, что const может также использоваться в классе или интерфейсе для определения константа класса или интерфейсная константа. define не может быть использован для этой цели:
Резюме
Если вам не нужен какой-либо тип условного или экспрессивного определения, используйте const с вместо define() с — просто ради читабельности!
Другие решения
До PHP 5.3, const не может быть использован в глобальном масштабе. Вы можете использовать это только внутри класса. Это следует использовать, когда вы хотите установить какой-то постоянный параметр или параметр, относящийся к этому классу. Или, может быть, вы хотите создать какое-то перечисление.
define может использоваться для той же цели, но может использоваться только в глобальной области. Его следует использовать только для глобальных настроек, которые влияют на все приложение.
Пример хорошего define Использование может указывать корневой путь вашего приложения или номер версии библиотеки.
Я знаю, что на этот вопрос уже дан ответ, но ни один из текущих ответов не содержит упоминаний о пространстве имен и о том, как оно влияет на константы и определения.
Начиная с PHP 5.3, константы и определения во многом похожи. Однако есть еще несколько важных отличий:
Код ниже должен иллюстрировать различия.
=== ОБНОВЛЕНИЕ ===
Вы по-прежнему не сможете определить константы в терминах переменных или возвратов функций, поэтому
Я считаю, что с PHP 5.3 вы можете использовать const вне классов, как показано здесь во втором примере:
define я использую для глобальных констант.
const я использую для констант класса.
Ты не можешь define в класс, и с const вы можете.
Излишне говорить, что вы не можете использовать const вне области видимости
Ответ NikiC — лучший, но позвольте мне добавить неочевидное предостережение при использовании пространств имен, чтобы вы не попали в неожиданное поведение. Следует помнить, что всегда в глобальном пространстве имен, если вы явно не добавите пространство имен как часть идентификатора определения. Что не очевидно в этом, так это то, что идентификатор пространства имен превосходит глобальный идентификатор. Так :
Для меня это делает бесполезным путаницу понятия const, поскольку идея const в десятках других языков заключается в том, что она всегда одинакова, где бы вы ни находились в коде, и PHP на самом деле не гарантирует этого.
Большинство из этих ответов неверны или рассказывают только половину истории.
Для создания переменных констант используйте define () примерно так:
Да, const определяются во время компиляции, и, поскольку никическим состояниям не может быть назначено выражение, как может определить define (). Но также const не может быть объявлен условно (по той же причине). то есть. Ты не сможешь это сделать:
В то время как вы могли бы с помощью define (). Таким образом, это не сводится к личным предпочтениям, есть правильный и неправильный способ использовать оба.
В качестве отступления … Я хотел бы увидеть некоторый класс const, которому можно присвоить выражение, своего рода define (), который можно выделить в классы?
define() vs. const
In PHP, when do you use
and when do you use
What are the main differences between those two?
11 Answers 11
As of PHP 5.3 there are two ways to define constants: Either using the const keyword or using the define() function:
The fundamental difference between those two ways is that const defines constants at compile time, whereas define defines them at run time. This causes most of const ‘s disadvantages. Some disadvantages of const are:
const cannot be used to conditionally define constants. To define a global constant, it has to be used in the outermost scope:
Why would you want to do that anyway? One common application is to check whether the constant is already defined:
const takes a plain constant name, whereas define() accepts any expression as name. This allows to do things like this:
const s are always case sensitive, whereas define() allows you to define case insensitive constants by passing true as the third argument (Note: defining case-insensitive constants is deprecated as of PHP 7.3.0 and removed since PHP 8.0.0):
So, that was the bad side of things. Now let’s look at the reason why I personally always use const unless one of the above situations occurs:
const simply reads nicer. It’s a language construct instead of a function and also is consistent with how you define constants in classes.
const defines a constant in the current namespace, while define() has to be passed the full namespace name:
Since PHP 5.6 const constants can also be arrays, while define() does not support arrays yet. However, arrays will be supported for both cases in PHP 7.
Finally, note that const can also be used within a class or interface to define a class constant or interface constant. define cannot be used for this purpose:
Summary
