defined()
Функция defined() в PHP проверяет, определена ли константа с заданным именем.
Что делает функция defined()
defined() — встроенная функция PHP, которая проверяет, существует ли уже константа с заданным именем. Она возвращает true, если константа определена, и false, если нет. На этой странице описаны синтаксис функции, способы проверки констант классов и пространств имён, распространённая ошибка — путаница с isset(), — а также случаи, когда действительно нужна эта функция.
Константа — это имя, значение которого не может изменяться в течение одного запроса. Она создаётся с помощью define() или ключевого слова const. Поскольку обращение к неопределённой константе вызывает ошибку (исключение Error в PHP 8+ и предупреждение в более старых версиях), defined() позволяет заранее проверить наличие константы и избежать этого.
Синтаксис
defined(string $constant_name): bool$constant_name— string, содержащая имя константы, которую нужно найти. Обратите внимание: передаётся имя в виде строки ("GREETING"), а не сама константа (GREETING).- Возвращает
true, если константа с таким именем существует, иfalseв противном случае.
Передача голой константы вместо её имени —
defined(GREETING)— приводит к тому, что PHP сначала пытается вычислитьGREETING, что завершится ошибкой, если она не определена. Всегда заключайте имя в кавычки.
Базовый пример
Поскольку GREETING была создана строкой выше, defined("GREETING") возвращает true и скрипт выводит Hello, world!.
Проверка констант классов и пространств имён
defined() также работает с константами классов и пространств имён. Используйте полное квалифицированное имя в виде строки:
<?php
const PI = 3.14;
class Circle {
const SHAPE = "round";
}
var_dump(defined("PI")); // bool(true)
var_dump(defined("Circle::SHAPE")); // bool(true) — class constant
var_dump(defined("Circle::MISSING"));// bool(false) — no such constant
var_dump(defined("UNDEFINED")); // bool(false)Для констант класса используется синтаксис "ClassName::CONSTANT_NAME". Для константы пространства имён указывается полный путь, например defined("App\\Config\\VERSION").
defined() и isset(): распространённая путаница
defined() проверяет константы; isset() проверяет переменные (а также ключи массивов и свойства объектов). Эти функции не взаимозаменяемы:
<?php
$name = "Alex"; // a variable
define("APP_NAME", "W3"); // a constant
var_dump(isset($name)); // bool(true) — variable exists
var_dump(defined("name")); // bool(false) — no constant called "name"
var_dump(defined("APP_NAME")); // bool(true) — constant existsЕсли вы собираетесь использовать defined("$variable"), скорее всего, вам нужна функция isset().
Когда использовать
- Защита необязательных конфигурационных констант. Фреймворки нередко позволяют заранее определять константы вроде
DEBUGилиAPP_ENV; используйтеdefined(), чтобы задать значение по умолчанию только тогда, когда пользователь его не установил. - Предотвращение повторного определения. Повторный вызов
define()для уже существующей константы генерирует предупреждение, поэтому оберните его:if (!defined("API_KEY")) { define("API_KEY", "..."); }. - Обнаружение возможностей. Библиотеки публикуют маркерные константы (например,
PHP_VERSION_ID);defined()подтверждает, что функциональность, основанная на константах, доступна, прежде чем на неё полагаться.
Чтобы прочитать значение константы, когда вы знаете, что она существует, используйте defined() вместе с constant(). Для более широкого понимания создания констант обратитесь к разделам PHP Constants и Class Constants.