Примечание "Следует обратить внимание, что ключевое слово const используется только в классах, а для объявления констант вне классов предназначается функция define()." вводит в заблуждение.
На самом деле const можно использовать и вне классов, более того PHPStorm будет рекомендовать "Can be replaced with 'const' syntax" для каждой конструкции define(), если она находится на верхнем уровне (вне области видимости функции, условных ветвлений).
Основная разница:
ключевое слово const:
константа объявляется во время компиляции (поэтому не может использоваться в условных ветвлениях и функциях, только top-level scope и в теле некоторых ООП конструкций (классы, перечисления, интерфейсы))
значение должно быть литералом (1, 0,25, 'some_string', true, [1, 2, 'three']), не допускается присвоение переменной или выражения, но можно присвоить объект при помощи ключевого слова new:
const SOME_OBJ = new SomeObject('Test', 115);
только с помощью неё можно объявить константу принадлежащую классу (перечислению, интерфейсу, и.т.д) (при попытке использовать define(), например, в конструкторе, будет ошибка "Argument 1 ($constant_name) cannot be a class constant")
функция define():
константа объявляется во время выполнения (поэтому может использоваться в условных ветвлениях, области видимости функции, и.т.д.)
значение может быть вычисляемым (можно присвоить значение при помощи переменной или выражения)
может задавать динамические имена, т.к. является функцией, которая принимает в качестве первого аргумента строку с именем
Примечание "Следует обратить внимание, что ключевое слово const используется только в классах, а для объявления констант вне классов предназначается функция define()." вводит в заблуждение.
На самом деле const можно использовать и вне классов, более того PHPStorm будет рекомендовать "Can be replaced with 'const' syntax" для каждой конструкции define(), если она находится на верхнем уровне (вне области видимости функции, условных ветвлений).
Основная разница:
ключевое слово const:
функция define():