Создание констант в PHP — const и define(). Константы в PHP Задать выражение в константе php

Последнее обновление: 1.11.2015

Константы, как и переменные хранят определенное значение, только в отличие от переменных значение констант может быть установлено только один раз, и далее мы уже не можем его изменить. Например, определим числовую константу:

Для определения константы используется оператор define , который имеет следующую форму: define(string $name, string $value, bool $case_sen=false) . Параметр $name передает название константы, а параметр $value - ее значение. Третий необязательный параметр принимает логическое значение true или false . Если значение равно false, то при использовании константы будет учитываться ее регистр, если true - регистр не учитывается. В нашем случае третий параметр не использован, поэтому он по умолчанию равен false.

После определения константы мы можем ее использовать также, как и обычную переменную. Единственное исключение - мы не сможем изменить ее значение. Другое отличие от переменной - не надо использовать знак $ . То есть выражение NUMBER=33; работать не будет.

Предопределенные константы

Кроме создаваемых программистом констант в PHP имеется еще несколько встроенных констант:

    FILE__ : хранит полный путь и имя текущего файла

    LINE__ : хранит текущий номер строки, которую обрабатывает интерпретатор

    DIR__ : хранит каталог текущего файла

    FUNCTION__ : название обрабатываемой функции

    CLASS__ : название текущего класса

    METHOD__ : название обрабатываемого метода

    NAMESPACE__ : название текущего пространства имен

Например, выведем текущую выполняемую строку и название файла:

Проверка существования константы

Чтобы проверить, определена ли константы, мы можем использовать функцию bool defined(string $name) . Если константа $name определена, то функция будет возвращать значение true

Встречаются случаи, когда переменные довольно неудобно использовать для постоянного хранения каких либо определенных значений, которые не меняются в течение работы программы. Такими значениями могут быть математические константы, пути к файлам, разнообразные пароли и.т.д. Как раз для этих целей в PHP предусмотрена такая конструкция, как.

называется именованная величина, которая не изменяется в процессе выполнения программы (скрипта).

В РНР константы определяются функцией define() . Эта функция имеет следующий формат:

define ($name , $value , $case_sen ), где:

$name - имя константы;
$value - значение константы;
$case_sen - необязательный параметр логического типа,
указывающий, следует ли учитывать регистр букв (true) или нет (false).

Пример определения и использования констант в PHP:


echo pi ;
// Выводит 3.14
?>

Если параметр $case_sen равен true , то интерпретатор будет учитывать регистр символов при работе с константой. Обратите внимание, что константы используются без предваряющего знака $ .

Различия между константами и переменными:

    У констант нет приставки в виде знака доллара ($ );

    Константы можно определить только с помощью функции define() , а не присваиванием значения;

    Константы могут быть определены и доступны в любом месте без учета области видимости;

    Константы не могут быть определены или аннулированы после первоначального объявления;

    Константы могут иметь только скалярные значения.

Проверка существования констант

Для проверки существования константы можно использовать функцию defined() . Данная функция возвращает true , если константа объявлена. Приведем пример:

// Объявляем константу pi
define ("pi" , 3.14 , true );
if (defined ("pi" )== true ) echo "Константа pi объявлена!" ;
// Скрипт выведет "Константа pi объявлена!"
?>

Предопределенные константы PHP

В PHP существуют следующие предопределенные константы:

PHP предоставляет большой список предопределенных констант для каждого выполняемого скрипта. Многие из этих констант определяются различными модулями и будут присутствовать только в том случае, если эти модули доступны в результате динамической загрузки или в результате статической сборки.

Есть пять предопределенных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, константа __LINE__ зависит от строки в скрипте, на которой эта константа указана. Специальные константы нечувствительны к регистру и их список приведен ниже:

Имя Описание
__LINE__ Текущая строка в файле.
__FILE__ Полный путь и имя текущего файла.
__DIR__ The directory of the file. If used inside an include, the directory of the included file is returned. This is equivalent to dirname(__FILE__). This directory name does not have a trailing slash unless it is the root directory.
__FUNCTION__ Имя функции. (Добавлена в PHP 4.3.0.)
__CLASS__ Имя класса. (Добавлена в PHP 4.3.0.)
__TRAIT__ The trait name. The trait name includes the namespace it was declared in (e.g. Foo\Bar).
__METHOD__ Имя метода класса. (Добавлена в PHP 5.0.0)
__NAMESPACE__ The name of the current namespace.

Дополнительно

В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() .

Константы в PHP - это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):

Define("FOO", "val"); define("FOO", "val2"); // Notice: Constant already defined echo FOO; //> val

Объявлять константы в PHP можно двумя способами:

// 1 define("NAME", "VALUE"); // 2 const NAME = "VALUE";

У каждого способа есть свои особенности, чтобы их понять, давайте рассмотрим все поэтапно, как и что менялось с каждой версией PHP.

Как создавать константы

PHP меньше 5.3

До 5.3 в PHP, константы можно было определять только через define() . Ключевое слово const появилось с версии 5.3.

Константы могут хранить только скаляры . Скалярные переменные - это переменные с типами integer , float , string и boolean . Типы array , object и resource не являются скалярными.

// скаляры define("FOO", 10); define("FOO", 10.9); define("FOO", "val"); define("FOO", true); // не скаляры define("FOO", array(1)); // константа не установиться и получим Warning define("FOO", (object) array(1)); // константа не установиться и получим Warning

С версии PHP 5.3

Появилось ключевое слово const и теперь константу можно определять еще и с помощью него.

Однако, в const нельзя указать переменную, функцию или какое то выражение, а нужно передавать скаляр «напрямую»:

Const FOO = "val"; // нет ошибок const FOO = $var; // Parse error const FOO = home_url(); // Parse error const FOO = 5 + 10; // Parse error const FOO = "foo"."bar"; // Parse error

Тогда как для define() таких ограничений нет...

Define("FOO", "val"); // нет ошибок define("FOO", $var); // нет ошибок define("FOO", home_url()); // нет ошибок define("FOO", 5 + 10); // нет ошибок define("FOO", "foo"."bar"); // нет ошибок

PHP 5.6

Стало возможным указывать в значения const примитивные PHP выражения (выражения из скаляров):

Const FOO = 1 + 2; const FOO = "foo" . "bar";

Стало возможным хранить массивы в константах:

Const FOO = ; // работает define("FOO", ); // не работает PHP 5.6, работает в PHP 7.0

Разница между define() и const

#1 const должны быть объявлены в верхней области

В отличие define() , const должны быть объявлены в самой верхней области видимости, потому что они определяются при компилировании скрипта. Это значит, что их нельзя объявлять внутри функций/циклов/выражений if или try/catch блоков.

If (1) { const NAME = "VALUE"; // не работает } // но if (1) { define("NAME", "VALUE"); // работает }

#2 const всегда регистрозависима

const всегда регистро-зависима, в то время как define() позволяет сделать регистро-независимые константы:

Define("NAME", "VALUE", true); echo NAME; // VALUE echo name; // VALUE

#3 const понимает только скаляры

Это справедливо только для версий PHP 5.6 и ниже...

const нельзя передать переменные, функции, выражения, а define() можно:

Const FOO = $var; // Parse error const FOO = home_url(); // Parse error define("FOO", $var); // нет ошибок define("FOO", home_url()); // нет ошибок

#4 const может хранить массивы с версии PHP 5.6 а define с PHP 7.0

const FOO = ; // работает в PHP 5.6 define("FOO", ); // не работает PHP 5.6, работает в PHP 7.0
Итоги сравнения

Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку... Исключение - это когда у вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .

Константы PHP класса

Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения...

Постоянные класса всегда общедоступны - нет статуса private или protected .

Объявленная константа принадлежит именно классу, она не принадлежит ни одному объекту и является общей на все объекты (экземпляры) класса.

Class My_Class { const NAME = "VALUE"; // начиная с PHP 5.6 можно использовать математические выражения const SEC_PER_DAY = 60 * 60 * 24; function print_name() { // обращение к константе класса внутри метода через self (сам класс) echo self::NAME; } } // обращение к константе вне класса // можно вызывать из глобальной области видимости без инициализации экземпляра класса echo My_Class::NAME;

Константы для классов очень похожи на статические (static) свойства класса.

Class My_Class { const NAME = "VALUE"; static $name = "VALUE";; } echo My_Class::NAME; echo My_Class::$name;

«Волшебные» константы

И в заключении вспомним про особые константы PHP...

В PHP есть девять волшебных констант, которые меняют свое значение в зависимости от контекста, в котором они используются. Например, значение __LINE__ зависит от строки в скрипте, на которой эта константа указана. Все "волшебные" константы разрешаются во время компиляции, в отличии от обычных констант, которые разрешаются во время исполнения. Специальные константы нечувствительны к регистру и их список приведен ниже:

Константа Описание
__LINE__ Текущий номер строки в файле.
__FILE__ Полный путь и имя текущего файла, в котором вызывается константа.
__DIR__ PHP 5.3.0. Директория файла, в котором используется константа. То же самое что dirname(__FILE__) . Не имеет слэша в конце, кроме корневой директории.
__FUNCTION__ Имя функции.
__CLASS__ Имя класса. Это имя содержит название пространства имен, в котором класс был объявлен (например, Foo\Bar). Также работает в трейтах. При использовании в методах трейтов является именем класса, в котором эти методы используется.
__TRAIT__ PHP 5.4.0. Имя трейта. Это имя содержит название пространства имен, в котором трейт был объявлен (например, Foo\Bar).
__METHOD__ Имя метода класса.
__NAMESPACE__ PHP 5.3.0. Имя текущего пространства имен.
ClassName::class PHP 5.5.0. Полное имя класса (с указанием пространства имен). Также смотрите::class.

(PHP 5 >= 5.3.0, PHP 7)

Этот список вопросов разделен на две части: общие вопросы и некоторые особенности реализации, которые полезны для более полного понимания.

Сперва, общие вопросы.

  1. Если я не использую пространства имен, следует ли считать что-либо из этого важным?
  2. Как мне использовать внутренние или глобальные классы в пространстве имен?
  3. Как мне использовать функции классов в пространствах имен, или константы в их собственном пространстве имен?
  4. Как такое имя как \my\name или \name преобразуется?
  5. Как такое имя, как my\name преобразуется?
  6. Как неполное имя класса такое как name преобразуется?
  7. Как неполное имя функции или неполное имя константы такое как name преобразуется?

Некоторые детали реализации пространств имен, которые полезно понимать.

  1. Импортируемые имена не могут конфликтовать с классами, определенными в том же файле.
  2. Ни функции, ни константы не могут быть заимпортированы с помощью оператора use .
  3. Динамические имена пространств имен (идентификаторы, взятые в кавычки) должны экранировать символ обратного слеша.
  4. Ссылаться на неопределенные константы, используя обратный слеш, нельзя. Выводится фатальная ошибка
  5. Невозможно переопределить специальные константы, такие как NULL, TRUE, FALSE, ZEND_THREAD_SAFE или ZEND_DEBUG_BUILD

Если я не использую пространства имен, следует ли считать что-либо из этого важным?

Нет. Пространства имен не оказывают никакого влияния ни на какой существующий код ни в каком виде или на любой написанный код, который не содержит пространств имен. Вы можете написать такой код, если желаете:

Пример #1 Доступ к глобальным классам вне пространства имен

$a = new \ stdClass ;
?>

Это функционально эквивалентно следующему:

Пример #2 Доступ к глобальным классам вне пространства имен

$a = new stdClass ;
?>

Как мне использовать внутренние или глобальные классы в пространстве имен?

Пример #3 Доступ ко внутренним классам в пространствах имен

namespace foo ;
$a = new \ stdClass ;

function test (\ ArrayObject $typehintexample = null ) {}

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// расширение внутреннего или глобального класса
class MyException extends \ Exception {}
?>

Как мне использовать функции классов в пространствах имен или константы в их собственном пространстве имен?

Пример #4 Доступ ко внутренним классам, функциям или константам в пространствах имен

namespace foo ;

class MyClass {}

// использование класса из текущего пространства имен
function test (MyClass $typehintexample = null ) {}
// другой способ использовать класс из текущего пространства имен
function test (\ foo \ MyClass $typehintexample = null ) {}

// расширение класса из текущего пространства имен
class Extended extends MyClass {}

// доступ к глобальной функции
$a = \ globalfunc ();

// доступ к глобальной константе
$b = \ INI_ALL ;
?>

Как такое имя как \my\name или \name преобразуется?

Имена, которые начинаются с \ всегда преобразуются к тому как они выглядят, т.е. \my\name - это на самом деле my\name , и \Exception - это Exception .

Пример #5 Абсолютные имена

namespace foo ;
$a = new \ my \ name (); // создает экземпляр класса "my\name"
echo \ strlen ("hi" ); // вызывает функцию "strlen"
$a = \ INI_ALL ; // переменной $a присваивается значение константы "INI_ALL"
?>

Как такое имя, как my\name преобразуется?

Имена, которые содержат обратный слеш, но не начинаются с него, такие как my\name

my другого имени, то этот синоним применяется к my в my\name .

my\name .

Пример #6 Полные имена

namespace foo ;
use blah \ blah as foo ;

$a = new my \ name (); // создает экземпляр класса "foo\my\name"
foo \ bar :: name (); // вызывает статический метод "name" в классе "blah\blah\bar"
my \ bar (); // вызывает функцию "foo\my\bar"
$a = my \ BAR ; // присваивает переменной $a значение константы "foo\my\BAR"
?>

Как неполное имя класса такое как name преобразуется?

Имена классов, которые не содержат обратный слеш, такие как name могут быть преобразованы двумя различными способами.

Если присутствует импортирующее выражение, которое создает синоним name другого имени, то применяется этот синоним.

В ином случае, текущее имя пространства имен становится префиксом к my\name .

Пример #7 Неполные имена классов

namespace foo ;
use blah \ blah as foo ;

$a = new name (); // создает экземпляр класса "foo\name"
foo :: name (); // вызывает статический метод "name" в классе "blah\blah"
?>

Как неполное имя функции или неполное имя константы такое как name преобразуется?

Имена функций или констант, которые не содержат обратного слеша, такие как name могут быть преобразованы двумя различными способами.

Сперва, текущее имя пространства имен становится префиксом к name .

Затем, если константа или функция name не существует в текущем пространстве имен, используется глобальная константа или функция name , если она существует.

Пример #8 Неполные имена функций или констант

namespace foo ;
use blah \ blah as foo ;

const FOO = 1 ;

function my () {}
function foo () {}
function sort (& $a )
{
\ sort ($a ); // вызывает глобальную функцию "sort"
$a = array_flip ($a );
return $a ;
}

My (); // вызывает "foo\my"
$a = strlen ("hi" ); // вызывает глобальную функцию "strlen", потому что "foo\strlen" не существует
$arr = array(1 , 3 , 2 );
$b = sort ($arr ); // вызывает функцию "foo\sort"
$c = foo (); // вызывает функцию "foo\foo" - импорт не применяется

$a = FOO ; // присваивает переменной $a значение константы "foo\FOO" - импорт не применяется
$b = INI_ALL ; // присваивает переменной $b значение глобальной константы "INI_ALL"
?>

Импортируемые имена не могут конфликтовать с классами, определенными в том же файле.

Следующие комбинации скриптов допустимы:

namespace my \ stuff ;
class MyClass {}
?>

namespace another ;
class thing {}
?>

namespace my \ stuff ;
include "file1.php" ;
include "another.php" ;


$a = new MyClass ; // создает экземпляр класса "thing" из пространства имен "another"
?>

Конфликт имен отсутствует даже несмотря на то, что класс MyClass существует внутри пространства имен my\stuff , потому что определение MyClass находится в отдельном файле. Однако следующий пример приводит к фатальной ошибке с конфликтом имен, потому что класс MyClass определен в том же файле, где находится оператор use.

namespace my \ stuff ;
use another \ thing as MyClass ;
class MyClass {} // фатальная ошибка: MyClass конфликтует с выражением импорта
$a = new MyClass ;
?>

Вложенные пространства имен недопустимы.

PHP не позволяет вложение пространств имен одно в другое

namespace my \ stuff {
namespace nested {
class foo {}
}
}
?>

Однако, сымитировать вложенные пространства имен так:

namespace my \ stuff \ nested {
class foo {}
}
?>

До PHP 5.6 ни функции, ни константы не могли быть импортированы с помощью оператора use .

До PHP 5.6 единственные элементы, которые подвержены действию оператора use - это пространства имен и имена классов. Для сокращения длинных имен констант или функций, заимпортируйте их содержимое в пространство имен.

namespace mine ;
use ultra \ long \ ns \ name ;

$a = name \ CONSTANT ;
name \ func ();
?>

Начиная с PHP 5.6 стало возможным импортирование и создание пседонимов для функций и имен констант.

Динамические имена пространств имен (идентификаторы, взятые в кавычки) должны экранировать символ обратного слеша.

Очень важно представлять это, потому что обратный слеш используется как экранирующий символ внутри строк. Он всегда должен быть продублирован, когда используется внутри строки, иначе появляется риск возникновения неумышленных последствий:

Пример #9 Подводные камни при использовании имени пространства имен внутри строки с двойными кавычками

$a = "dangerous\name" ; // \n - это переход на новую строку внутри строки с двойными кавычками!
$obj = new $a ;

$a = "not\at\all\dangerous" ; // а тут нет проблем.
$obj = new $a ;
?>

Внутри строк, заключенных в одинарные кавычки, обратный слеш в качестве разделителя более безопасен, но по-прежнему рекомендуемая практика экранирования обратного слеша во всех строках является наилучшим вариантом.

Ссылаться на неопределенные константы, используя обратный слеш, нельзя. Выводится фатальная ошибка

Любая неопределенная константа, являющаяся неполным именем, как FOO , будет приводить к выводу сообщения о том, что PHP предположил, что FOO было значение константы. Любая константа, с полным или абсолютным именем, которая содержит символ обратного слеша будет приводить к фатальной ошибке, если не будет найдена.

Пример #10 Неопределенные константы

namespace bar ;
$a = FOO ; // выводит предупреждение: undefined constants "FOO" assumed "FOO";
$a = \ FOO ; // фатальная ошибка: undefined namespace constant FOO
$a = Bar \ FOO ; // фатальная ошибка: undefined namespace constant bar\Bar\FOO
$a = \ Bar \ FOO ; // фатальная ошибка: undefined namespace constant Bar\FOO
?>

Невозможно переопределить специальные константы, такие как NULL, TRUE, FALSE, ZEND_THREAD_SAFE или ZEND_DEBUG_BUILD

Любая попытка определить константу пространства имен, которая совпадает с названиями специальных встроенных констант, приведет к фатальной ошибке.

Пример #11 Неопределенные константы

namespace bar ;
const NULL = 0 ; // Фатальная ошибка;
const true = "stupid" ; // также фатальная ошибка;
// и т.д.
?>

7 years ago

There is a way to define a namespaced constant that is a special, built-in constant, using define function and setting the third parameter case_insensitive to false:

namespace foo ;
define (__NAMESPACE__ . "\NULL" , 10 ); // defines the constant NULL in the current namespace


?>

No need to specify the namespace in your call to define(), like it happens usually
namespace foo ;
define (INI_ALL , "bar" ); // produces notice - Constant INI_ALL already defined. But:

Define (__NAMESPACE__ . "\INI_ALL" , "bar" ); // defines the constant INI_ALL in the current namespace
var_dump (INI_ALL ); // will show string(3)"bar". Nothing unespected so far. But:

Define ("NULL" , 10 ); // defines the constant NULL in the current namespace...
var_dump (NULL ); // will show 10
var_dump (null ); // will show NULL
?>

If the parameter case_insensitive is set to true
namespace foo ;
define (__NAMESPACE__ . "\NULL" , 10 , true ); // produces notice - Constant null already defined
?>

3 years ago

When creating classes or calling static methods from within namespaces using variables, you need to keep in mind that they require the full namespace in order for the appropriate class to be used; you CANNOT use an alias or short name, even if it is called within the same namespace. Neglecting to take this into account can cause your code to use the wrong class, throw a fatal missing class exception, or throw errors or warnings.

In these cases, you can use the magic constant __NAMESPACE__, or specify the full namespace and class name directly. The function class_exists also requires the full namespace and class name, and can be used to ensure that a fatal error won"t be thrown due to missing classes.

Namespace Foo ;
class Bar {
public static function test () {
return get_called_class ();
}
}

namespace Foo \ Foo ;
class Bar extends \ Foo \ Bar {
}

Var_dump (Bar :: test ()); // string(11) "Foo\Foo\Bar"

$bar = "Foo\Bar" ;
var_dump ($bar :: test ()); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . "\Bar" ;
var_dump ($bar :: test ()); // string(11) "Foo\Foo\Bar"

$bar = "Bar" ;
var_dump ($bar :: test ()); // FATAL ERROR: Class "Bar" not found or Incorrect class \Bar used

В этой заметке речь пойдет о константах. Как обычно разберемся с самим понятием константы в языках программирования и посмотрим, как объявляются и используются константы в PHP .

Понятие константа и константы в PHP

Слово константа должно быть вам уже знакомо из математики:

“Математическая константа - величина, значение которой не меняется.”

Тоже самое и в PHP. Константа в PHP – это идентификатор, который служит для обозначения простого значения (строка, число какое-нибудь), которое не может изменяться в процессе выполнения кода.

Для объявления константы (присвоения ей значения) используется функция define . Пример объявления константы:

Имена констант в PHP чувствительны к регистру (большие и маленькие буквы различаются), так что нужно быть внимательней. Также существует соглашение, что имена констант всегда пишутся в верхнем регистре.

Имя константы должно начинаться с буквы или символа подчеркивания “_” и может состоять из букв, цифр и подчеркивания.

Рассмотрим простой пример использования константы:

В этом примере мы объявили константу и использовали ее в программе.

Для чего используются константы и не проще ли использовать переменные?

Как уже было сказано, константы не могут изменить своего значения в процессе выполнения программы. В константах обычно сохраняют постоянные параметры сайта, такие как реквизиты доступа к базе данных (хост, логин и пароль пользователя, имя базы данных), расположение сайта на диске и многие другие настройки.

Если мы будем использовать переменные, то скрип может случайно (в случаем ошибки) изменить значение переменной и будет работать не так как вы задумали.

Использование констант гарантирует, что то значение которое вы указали при объявлении константы останется неизменным.