defined(string $constant_name): bool
Расскажите об этой функции всё, что знаете.
defined() — это функция для проверки существования константы (объявленной через define() или const или перечисления enum). Она возвращает true или false и не генерирует ошибок для несуществующих констант. Стандартная практика — использовать if (!defined('NAME')) перед define('NAME', value) для избежания дублирования.
Полный ответ:
1. Основное назначение и синтаксис
defined() — это встроенная функция, которая проверяет, определена ли указанная константа с помощью директивы define() или ключевого слова const или перечисления enum (с PHP8.1+).
defined(string $constant_name): bool
- Принимает один аргумент — строку с именем константы.
- Возвращает
true, если константа существует, иfalse— если нет.
define('APP_VERSION', '1.0.0');
const DEBUG_MODE = true;
var_dump(defined('APP_VERSION')); // bool(true)
var_dump(defined('DEBUG_MODE')); // bool(true)
var_dump(defined('UNDEFINED_CONST')); // bool(false)
2. Ключевые особенности
- Работает только с константами. Это главное отличие от
isset(), которая работает с переменными. Путать их — частая ошибка новичков.$variable = 'value'; define('CONSTANT', 'value'); var_dump(isset($variable)); // true (для переменной) var_dump(defined('CONSTANT')); // true (для константы) var_dump(defined('variable')); // false (переменная - не константа) var_dump(isset(CONSTANT)); // Ошибка! (использование константы как имени переменной) - Регистрозависимость. По умолчанию имена констант регистрозависимы. Функция
defined()ищет точное совпадение по имени.define('MY_CONST', 123); var_dump(defined('my_const')); // false - Проверка перед определением. Стандартная практика — использовать
defined()перед определением константы, чтобы избежать предупреждения о повторном объявлении.if (!defined('APP_PATH')) { define('APP_PATH', dirname(__DIR__)); } - Проверка встроенных и магических констант. С помощью
defined()можно проверить существование любых констант, включая встроенные (PHP_VERSION), но исключая магические (__FILE__).var_dump(defined('PHP_VERSION')); // true var_dump(defined('__LINE__')); // false (магические константы не определены) -
Использование с Enums (PHP 8.1+). С появлением перечислений (Enums) в PHP 8.1, функция
defined()обрела еще один важный контекст использования.Enum-case по своей природе является константой объекта класса-перечисления. Поэтому
defined()может проверять существование конкретного case’а в enum.enum Status: string { case DRAFT = 'draft'; case PUBLISHED = 'published'; case ARCHIVED = 'archived'; } // defined() проверяет, существует ли case с таким именем в указанном enum var_dump(defined('Status::DRAFT')); // bool(true) var_dump(defined('Status::PUBLISHED')); // bool(true) var_dump(defined('Status::PENDING')); // bool(false) - такого case нет
3. Практическое применение
- Условное определение констант:
// Определяем константу отладки, только если она еще не задана if (!defined('DEBUG')) { define('DEBUG', false); } - Проверка доступности расширений: Многие расширения PHP определяют константы для своей настройки.
// Проверяем, установлено ли расширение PDO if (defined('PDO::ATTR_DRIVER_NAME')) { echo 'PDO доступно'; } - Проверка перечислений:
$requestedStatus = 'PUBLISHED'; // Допустим, пришло из запроса // Динамически проверяем, что такой case действительно существует в enum if (defined("Status::$requestedStatus")) { // Безопасно используем $status = constant("Status::$requestedStatus"); // Получаем объект case echo $status->value; // 'published' } else { throw new InvalidArgumentException("Invalid status: $requestedStatus"); }
4. Отличие от isset() и function_exists()
| Функция | Проверяет | Пример |
|---|---|---|
defined() |
Существование константы | defined('CONST_NAME') |
isset() |
Существование переменной и не-null значение |
isset($variable) |
function_exists() |
Существование функции | function_exists('function_name') |
5. Нюансы и лучшие практики
- Используйте
defined()для проверки констант, аisset()для переменных. - Всегда проверяйте существование константы перед её определением — это предотвращает предупреждения и конфликты.
Итог:
defined() — это функция для проверки существования константы (объявленной через define() или const или перечисления (Enum) начиная с PHP 8.1). Она возвращает true или false и не генерирует ошибок для несуществующих констант. Ключевое отличие от isset() — defined() работает только с константами, а isset() — только с переменными. Стандартная практика — использовать if (!defined('NAME')) перед define('NAME', value) для избежания дублирования.