Я знаю, что на этот вопрос уже дан ответ, но ни один из текущих ответов не упоминает о пространстве имен и о том, как оно влияет на константы и определения.
Начиная с PHP 5.3, константы и определения во многом схожи. Однако есть еще несколько важных отличий:
- Констант нельзя определить из выражения.
const FOO = 4 * 3;
не работает, но define('CONST', 4 * 3);
работает.
- Имя, переданное
define
, должно включать пространство имен, которое должно быть определено в этом пространстве имен.
Код ниже должен иллюстрировать различия.
namespace foo
{
const BAR = 1;
define('BAZ', 2);
define(__NAMESPACE__ . '\\BAZ', 3);
}
namespace {
var_dump(get_defined_constants(true));
}
Содержимое пользовательского подмассива будет ['foo\\BAR' => 1, 'BAZ' => 2, 'foo\\BAZ' => 3]
.
=== ОБНОВЛЕНИЕ ===
Предстоящий PHP 5.6 позволит немного больше гибкости с const
. Теперь вы сможете определять константы в терминах выражений при условии, что эти выражения состоят из других констант или литералов. Это означает, что с 5.6 должно быть действительно следующее:
const FOOBAR = 'foo ' . 'bar';
const FORTY_TWO = 6 * 9; // For future editors: THIS IS DELIBERATE! Read the answer comments below for more details
const ULTIMATE_ANSWER = 'The ultimate answer to life, the universe and everything is ' . FORTY_TWO;
Вы по-прежнему не сможете определять константы в терминах переменных или возвратов функций, поэтому
const RND = mt_rand();
const CONSTVAR = $var;
все еще будет отсутствовать.