Перейти к содержимому

Как объявить константу в php

  • автор:

Константы

Константа — идентификатор, или имя, для простого значения. Как подсказывает название, это значение нельзя изменять во время работы скрипта (кроме магических констант, которые на самом деле не относятся к константам). Константы чувствительны к регистру. По принятому соглашению, имена констант пишутся в верхнем регистре.

Замечание:

До PHP 8.0.0 константам, которые определяли функцией define() , разрешалось быть нечувствительными к регистру.

Имя константы должно соответствовать тем же правилам именования, что и другие имена в PHP. Правильное имя начинается с буквы или символа подчёркивания, за которым следует любое количество букв, цифр и символов подчёркивания. Регулярное выражение для проверки корректности имени константы выглядит так: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

Функция define() умеет определять константы с зарезервированными или даже недопустимыми именами, получить значения которых получится только функцией constant() . Однако делать это не рекомендуют.

Подсказка

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

// Правильные имена констант
define ( «FOO» , «что-то» );
define ( «FOO2» , «что-то ещё» );
define ( «FOO_BAR» , «что-то большее» );

// Неправильные имена констант
define ( «2FOO» , «что-то» );

// Это верное объявление, но лучше его не использовать:
// PHP однажды может зарегистрировать волшебную константу,
// которая нарушит работу скрипта
define ( «__FOO__» , «что-то» );

Замечание: Понятие «буквы» здесь — символы a-z, A-Z, и другие символы с ASCII-кодами от 128 до 255 (0x80-0xff).

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

Замечание: Начиная с PHP 7.1.0 константам класса доступны объявления видимости — защищённая или закрытая, которые делают константу доступной только в иерархической области видимости класса, в котором константа определена.

Improve This Page

User Contributed Notes 9 notes

12 years ago

11/14/2016 — note updated by sobak
——

CONSTANTS and PHP Class Definitions

Using «define(‘MY_VAR’, ‘default value’)» INSIDE a class definition does not work as expected. You have to use the PHP keyword ‘const’ and initialize it with a scalar value — boolean, int, float, string (or array in PHP 5.6+) — right away.

define ( ‘MIN_VALUE’ , ‘0.0’ ); // RIGHT — Works OUTSIDE of a class definition.
define ( ‘MAX_VALUE’ , ‘1.0’ ); // RIGHT — Works OUTSIDE of a class definition.

//const MIN_VALUE = 0.0; RIGHT — Works both INSIDE and OUTSIDE of a class definition.
//const MAX_VALUE = 1.0; RIGHT — Works both INSIDE and OUTSIDE of a class definition.

class Constants
<
//define(‘MIN_VALUE’, ‘0.0’); WRONG — Works OUTSIDE of a class definition.
//define(‘MAX_VALUE’, ‘1.0’); WRONG — Works OUTSIDE of a class definition.

const MIN_VALUE = 0.0 ; // RIGHT — Works INSIDE of a class definition.
const MAX_VALUE = 1.0 ; // RIGHT — Works INSIDE of a class definition.

public static function getMinValue ()
<
return self :: MIN_VALUE ;
>

public static function getMaxValue ()
<
return self :: MAX_VALUE ;
>
>

?>

#Example 1:
You can access these constants DIRECTLY like so:
* type the class name exactly.
* type two (2) colons.
* type the const name exactly.

#Example 2:
Because our class definition provides two (2) static functions, you can also access them like so:
* type the class name exactly.
* type two (2) colons.
* type the function name exactly (with the parentheses).

#Example 1:
$min = Constants :: MIN_VALUE ;
$max = Constants :: MAX_VALUE ;

#Example 2:
$min = Constants :: getMinValue ();
$max = Constants :: getMaxValue ();

?>

Once class constants are declared AND initialized, they cannot be set to different values — that is why there are no setMinValue() and setMaxValue() functions in the class definition — which means they are READ-ONLY and STATIC (shared by all instances of the class).

8 years ago

Lets expand comment of ‘storm’ about usage of undefined constants. His claim that ‘An undefined constant evaluates as true. ‘ is wrong and right at same time. As said further in documentation ‘ If you use an undefined constant, PHP assumes that you mean the name of the constant itself, just as if you called it as a string. ‘. So yeah, undefined global constant when accessed directly will be resolved as string equal to name of sought constant (as thought PHP supposes that programmer had forgot apostrophes and autofixes it) and non-zero non-empty string converts to True.

There are two ways to prevent this:
1. always use function constant(‘CONST_NAME’) to get constant value (BTW it also works for class constants — constant(‘CLASS_NAME::CONST_NAME’) );
2. use only class constants (that are defined inside of class using keyword const) because they are not converted to string when not found but throw exception instead (Fatal error: Undefined class constant).

22 years ago

Warning, constants used within the heredoc syntax (http://www.php.net/manual/en/language.types.string.php) are not interpreted!

Editor’s Note: This is true. PHP has no way of recognizing the constant from any other string of characters within the heredoc block.

4 years ago

The documentation says, «You can access constants anywhere in your script without regard to scope», but it’s worth keeping in mind that a const declaration must appear in the source file before the place where it’s used.

This doesn’t work (using PHP 5.4):
foo ();
const X = 1 ;
function foo () echo «Value of X: » . X ;
>
?>
Result: «Value of X: X»

But this works:
const X = 1 ;
foo ();
function foo () echo «Value of X: » . X ;
>
?>
Result: «Value of X: 1»

This is potentially confusing because you can refer to a function that occurs later in your source file, but not a constant. Even though the const declaration is processed at compile time, it behaves a bit like it’s being processed at run time.

9 years ago

class constant are by default public in nature but they cannot be assigned visibility factor and in turn gives syntax error

const MAX_VALUE = 10 ;
public const MIN_VALUE = 1 ;

// This will work
echo constants :: MAX_VALUE ;

// This will return syntax error
echo constants :: MIN_VALUE ;
?>

17 years ago

If you are looking for predefined constants like
* PHP_OS (to show the operating system, PHP was compiled for; php_uname(‘s’) might be more suitable),
* DIRECTORY_SEPARATOR («\\» on Win, ‘/’ Linux. )
* PATH_SEPARATOR (‘;’ on Win, ‘:’ on Linux. )
they are buried in ‘Predefined Constants’ under ‘List of Reserved Words’ in the appendix:
http://www.php.net/manual/en/reserved.constants.php
while the latter two are also mentioned in ‘Directory Functions’
http://www.php.net/manual/en/ref.dir.php

19 years ago

PHP Modules also define constants. Make sure to avoid constant name collisions. There are two ways to do this that I can think of.
First: in your code make sure that the constant name is not already used. ex. ?> This can get messy when you start thinking about collision handling, and the implications of this.
Second: Use some off prepend to all your constant names without exception ex.

Perhaps the developers or documentation maintainers could recommend a good prepend and ask module writers to avoid that prepend in modules.

20 years ago

I find using the concatenation operator helps disambiguate value assignments with constants. For example, setting constants in a global configuration file:

define ( ‘LOCATOR’ , «/locator» );
define ( ‘CLASSES’ , LOCATOR . «/code/classes» );
define ( ‘FUNCTIONS’ , LOCATOR . «/code/functions» );
define ( ‘USERDIR’ , LOCATOR . «/user» );
?>

Later, I can use the same convention when invoking a constant’s value for static constructs such as require() calls:

require_once( FUNCTIONS . «/database.fnc» );
require_once( FUNCTIONS . «/randchar.fnc» );
?>

as well as dynamic constructs, typical of value assignment to variables:

$userid = randchar ( 8 , ‘anc’ , ‘u’ );
$usermap = USERDIR . «/» . $userid . «.png» ;
?>

The above convention works for me, and helps produce self-documenting code.

19 years ago

An undefined constant evaluates as true when not used correctly. Say for example you had something like this:

settings.php
// Debug mode
define ( ‘DEBUG’ , false );
?>

test.php
include( ‘settings.php’ );

if ( DEBUG ) // echo some sensitive data.
>
?>

If for some reason settings.php doesn’t get included and the DEBUG constant is not set, PHP will STILL print the sensitive data. The solution is to evaluate it. Like so:

settings.php
// Debug mode
define ( ‘DEBUG’ , 0 );
?>

test.php
include( ‘settings.php’ );

if ( DEBUG == 1 ) // echo some sensitive data.
>
?>

Now it works correctly.

  • Справочник языка
    • Основы синтаксиса
    • Типы
    • Переменные
    • Константы
    • Выражения
    • Операторы
    • Управляющие конструкции
    • Функции
    • Классы и объекты
    • Пространства имён
    • Перечисления
    • Ошибки
    • Исключения
    • Fibers
    • Генераторы
    • Атрибуты
    • Объяснение ссылок
    • Предопределённые переменные
    • Предопределённые исключения
    • Встроенные интерфейсы и классы
    • Предопределённые атрибуты
    • Контекстные опции и параметры
    • Поддерживаемые протоколы и обёртки
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    Как объявить константу в php

    Константу определяют через ключевое слово const или функцией define() . Функция define() разрешает определить константу для произвольного выражения, тогда как у конструкции const есть ограничения, которые описывает следующий параграф. После определения константу нельзя изменить или сделать неопределённой.

    При определении константы через ключевое слово const допускаются только скалярные выражения ( bool , int , float и string ) и массивы ( array ), которые содержат только скалярные выражения. Разрешается определять константы с типом resource , но не рекомендуется, поскольку это приводит к неожиданным результатам.

    Значение константы получают по имени константы. Не нужно указывать перед именем константы символ $ , как перед переменными. Значение константы также получают функцией constant() , если имя константы формируется динамически. Список всех определённых констант получают функцией get_defined_constants() .

    Замечание: Константы и (глобальные) переменные находятся в разных пространствах имён. Это означает, например, что логическая константа true и переменная $TRUE — не одно и то же.

    При попытке обратиться к неопределённой константе выбрасывается исключение Error До PHP 8.0.0 неопределённые константы интерпретировались как простое строковое ( string ) слово, то есть CONSTANT сравнивалось с «CONSTANT». Этот резервный вариант объявили устаревшим в PHP 7.2.0, при этом будет сгенерирована ошибка уровня E_WARNING . До PHP 7.2.0 вместо этого выдавалась ошибка уровня E_NOTICE. Смотрите также главу руководства, которая разъясняет, почему $foo[bar] — это неправильно (если только bar не константа). Это не относится к полным и абсолютным константам, которые каждый раз будут выбрасывать исключение Error , если эти константы не определили.

    Замечание: Чтобы проверить, установили ли константу, вызывают функцию defined() .

    • У констант нет приставки в виде знака доллара $ ;
    • Константы разрешается определять и получать доступ к ним в любом месте без учёта области видимости;
    • Константы нельзя переопределять или удалять после первоначального объявления;
    • Константам разрешено содержать только скалярные значения или массивы.

    Пример #1 Определение констант

    define ( «CONSTANT» , «Здравствуй, мир.» );
    echo CONSTANT ; // Выводит «Здравствуй, мир.»
    echo Constant ; // Выбросит ошибку: Неопределённая константа Constant
    // До PHP 8.0.0 выводит «Constant» и выдаёт предупреждение.

    Пример #2 Определение констант через ключевое слово const

    // Простое скалярное значение
    const CONSTANT = ‘Здравствуй, мир.’ ;

    // Скалярное выражение
    const ANOTHER_CONST = CONSTANT . ‘ Прощай, мир.’ ;
    echo ANOTHER_CONST ;

    const ANIMALS = array( ‘dog’ , ‘cat’ , ‘bird’ );
    echo ANIMALS [ 1 ]; // выводит «cat»

    // Массивы в константе
    define ( ‘ANIMALS’ , array(
    ‘dog’ ,
    ‘cat’ ,
    ‘bird’
    ));
    echo ANIMALS [ 1 ]; // выводит «cat»

    Замечание:

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

    Как объявить константу в php

    As of PHP 5.6 you can finally define constant using math expressions, like this one:

    class MyTimer const SEC_PER_DAY = 60 * 60 * 24 ;
    >

    13 years ago

    Most people miss the point in declaring constants and confuse then things by trying to declare things like functions or arrays as constants. What happens next is to try things that are more complicated then necessary and sometimes lead to bad coding practices. Let me explain.

    A constant is a name for a value (but it’s NOT a variable), that usually will be replaced in the code while it gets COMPILED and NOT at runtime.

    So returned values from functions can’t be used, because they will return a value only at runtime.

    Arrays can’t be used, because they are data structures that exist at runtime.

    One main purpose of declaring a constant is usually using a value in your code, that you can replace easily in one place without looking for all the occurences. Another is, to avoid mistakes.

    Think about some examples written by some before me:

    1. const MY_ARR = «return array(\»A\», \»B\», \»C\», \»D\»);»;
    It was said, this would declare an array that can be used with eval. WRONG! This is just a string as constant, NOT an array. Does it make sense if it would be possible to declare an array as constant? Probably not. Instead declare the values of the array as constants and make an array variable.

    2. const magic_quotes = (bool)get_magic_quotes_gpc();
    This can’t work, of course. And it doesn’t make sense either. The function already returns the value, there is no purpose in declaring a constant for the same thing.

    3. Someone spoke about «dynamic» assignments to constants. What? There are no dynamic assignments to constants, runtime assignments work _only_ with variables. Let’s take the proposed example:

    /**
    * Constants that deal only with the database
    */
    class DbConstant extends aClassConstant <
    protected $host = ‘localhost’ ;
    protected $user = ‘user’ ;
    protected $password = ‘pass’ ;
    protected $database = ‘db’ ;
    protected $time ;
    function __construct () <
    $this -> time = time () + 1 ; // dynamic assignment
    >
    >
    ?>

    Those aren’t constants, those are properties of the class. Something like «this->time = time()» would even totally defy the purpose of a constant. Constants are supposed to be just that, constant values, on every execution. They are not supposed to change every time a script runs or a class is instantiated.

    Conclusion: Don’t try to reinvent constants as variables. If constants don’t work, just use variables. Then you don’t need to reinvent methods to achieve things for what is already there.

    10 years ago

    I think it’s useful if we draw some attention to late static binding here:
    class A const MY_CONST = false ;
    public function my_const_self () return self :: MY_CONST ;
    >
    public function my_const_static () return static:: MY_CONST ;
    >
    >

    class B extends A const MY_CONST = true ;
    >

    $b = new B ();
    echo $b -> my_const_self ? ‘yes’ : ‘no’ ; // output: no
    echo $b -> my_const_static ? ‘yes’ : ‘no’ ; // output: yes
    ?>

    10 years ago

    const can also be used directly in namespaces, a feature never explicitly stated in the documentation.

    const BAR = 1 ;
    ?>

    # bar.php
    require ‘foo.php’ ;

    var_dump ( Foo\BAR ); // => int(1)
    ?>

    7 years ago

    Hi, i would like to point out difference between self::CONST and $this::CONST with extended class.
    Let us have class a:

    class a <
    const CONST_INT = 10 ;

    public function getSelf () return self :: CONST_INT ;
    >

    public function getThis () return $this :: CONST_INT ;
    >
    >
    ?>

    And class b (which extends a)

    class b extends a const CONST_INT = 20 ;

    public function getSelf () return parent :: getSelf ();
    >

    public function getThis () return parent :: getThis ();
    >
    >
    ?>

    Both classes have same named constant CONST_INT.
    When child call method in parent class, there is different output between self and $this usage.

    print_r ( $b -> getSelf ()); //10
    print_r ( $b -> getThis ()); //20

    PHP: Константы

    Разработчики часто работают с данными, которые никогда не меняются. Например, число π, которое всегда равно 3.14 и не может измениться.

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

    Создание константы отличается от создания переменной. Оно начинается с ключевого слова const и последующего имени константы. При этом знак доллара не нужен. Далее ей присваивается нужное значение.

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

    В PHP много встроенных констант, которые можно использовать в любом месте программы. Вот некоторые из них:

    • PHP_VERSION — текущая версия PHP
    • PHP_MAXPATHLEN — максимальная разрешенная длина имени файла
    • PHP_INT_MAX — максимальное возможное значение целых чисел (integer)

    Кроме обычных констант в PHP существует отдельная группа — магические константы. Их отличия заключаются в следующем:

    • Магические константы невозможно определить самому, можно пользоваться только существующими
    • Магические константы начинаются и заканчиваются символами __ (два подчеркивания)
    • Магия заключается в том, что такие константы имеют одно и то же значение только в пределах определенной части программы

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

    • __LINE__ — содержит текущую строку файла, в котором она используется
    • __FILE__ — путь до текущего файла
    • __DIR__ — путь до директории, в которой находится текущий файл

    Задание

    Создайте константу DRAGONS_BORN_COUNT и запишите в неё число 3 — это количество драконов, родившихся у Дайенерис.

    Упражнение не проходит проверку — что делать? ��

    Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

    В моей среде код работает, а здесь нет ��

    Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

    Мой код отличается от решения учителя ��

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

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

    Прочитал урок — ничего не понятно ��

    Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

    Полезное

    Определения

    • Константа — способ сохранить информацию и дать ей имя для последующего использования в коде; константы нельзя изменять, в отличие от переменных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *