Как определить константу в php
Перейти к содержимому

Как определить константу в php

  • автор:

PHP константы

Константа — это просто символьное имя для значения, которое обеспечивает возможность получить значение по имени, то есть, когда в программе указывается имя константы вместо неё подставляется значение.

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

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

  • Перед именем константы не нужно ставить знак доллара.
  • По умолчанию имена констант чувствительны к регистру символов, это означает, что имена some_const , Some_const или SOME_CONST будут считаться, как имена трёх различных констант.
  • Константы могут иметь значения только следующих типов: boolean, integer, float, string, NULL и массивы.
  • Константы не работают внутри строк.
  • Константы доступны из любой области видимости, это означает, что их можно использовать в любом месте сценария.
  • Константа не может быть удалена.
  • Имена констант условились писать заглавными буквами.

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

Число: ", PI; > foo(); // Число: 3.1416 echo "Число: PI 
"; // Число: PI echo "Число: ".PI; // Число: 3.1416 ?>

Константы, создаваемые с помощью ключевого слова const создаются во время компиляции сценария. Это означает, что их нельзя определять внутри функций, циклов, условных инструкций и блоков try/catch .

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

 foo(); echo NUM; ?>

С этой темой смотрят:

Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2024 © puzzleweb.ru | razumnikum.ru

Константы классов — PHP: Введение в ООП

Напомню, что в PHP возможно определять константы. Они используются для хранения каких-то постоянных данных, которые, как правило, глобальные. Например, константа PHP_VERSION содержит версию PHP, в которой был запущен код (а его можно запустить на разных версиях интерпретатора). Эта константа относится к предопределённым (предоставляется интерпретатором). PHP позволяет создавать свои собственные константы, используя конструкцию const SEC_PER_DAY = 86400; . Эти константы принадлежат пространству имён и могут быть импортированы из него, используя конструкцию use const App\Times\SEC_PER_DAY; .

 // Класс встроен в язык https://php.net/manual/ru/class.datetime.php class DateTime  // Константы могут быть как публичными так и приватными public const RSS = 'D, d M Y H:i:s O'; public const RFC822 = 'D, d M y H:i:s O'; private const SOMETHING_FOR_INTERNAL_USING = 'value'; > 

Внутри классов константы определяются точно таким же способом, как и снаружи. Основное отличие проявляется в способе доступа.

 print_r(DateTime::RSS); // => D, d M Y H:i:s O 

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

Для констант классов нет особого синтаксиса импорта. Он не нужен по очень простой причине — импортируется в другие пространства имён всегда класс, а константа извлекается уже из него.

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

 class DateTime  // . public function getRssFormat()  return self::RSS; > > 

В этом способе вместо имени класса слева стоит ключевое слово self . Его удобство заключается в отсутствии дублирования имени класса. Эта проблема особенно актуальна при активном использовании констант внутри самого класса.

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

Внутри класса определено несколько магических констант:

  • __CLASS__ — текущее имя класса
  • __METHOD__ — текущее имя метода

В отличие от обычных констант, магические не требуют префикса self:: и доступны только внутри класса.

 class Example  public function printMethodName()  print_r(__METHOD__); > > 

Кроме магических, в классах есть одна специальная константа class . Она возвращает полное имя класса и может вызываться только через класс.

 namespace App; class User  > User::class; // App\User 

Эта константа возвращает полное имя класса относительно пространства имён, в котором происходит её вызов.

Итого

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

get_defined_constants

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

Список параметров

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

define ( «MY_CONSTANT» , 1 );
print_r ( get_defined_constants ( true ));
?>

Вывод приведённого примера будет похож на:

Array ( [Core] => Array ( [E_ERROR] => 1 [E_WARNING] => 2 [E_PARSE] => 4 [E_NOTICE] => 8 [E_CORE_ERROR] => 16 [E_CORE_WARNING] => 32 [E_COMPILE_ERROR] => 64 [E_COMPILE_WARNING] => 128 [E_USER_ERROR] => 256 [E_USER_WARNING] => 512 [E_USER_NOTICE] => 1024 [E_ALL] => 2047 [TRUE] => 1 ) [pcre] => Array ( [PREG_PATTERN_ORDER] => 1 [PREG_SET_ORDER] => 2 [PREG_OFFSET_CAPTURE] => 256 [PREG_SPLIT_NO_EMPTY] => 1 [PREG_SPLIT_DELIM_CAPTURE] => 2 [PREG_SPLIT_OFFSET_CAPTURE] => 4 [PREG_GREP_INVERT] => 1 ) [user] => Array ( [MY_CONSTANT] => 1 ) )

Возвращаемые значения

Возвращает массив вида «имя константы» => «значение константы», с возможностью сгруппировать его по имени модуля, зарегистрировавшего константу.

Примеры

Пример #1 Пример использования get_defined_constants()

print_r ( get_defined_constants ());
?>

Вывод приведённого примера будет похож на:

Array ( [E_ERROR] => 1 [E_WARNING] => 2 [E_PARSE] => 4 [E_NOTICE] => 8 [E_CORE_ERROR] => 16 [E_CORE_WARNING] => 32 [E_COMPILE_ERROR] => 64 [E_COMPILE_WARNING] => 128 [E_USER_ERROR] => 256 [E_USER_WARNING] => 512 [E_USER_NOTICE] => 1024 [E_ALL] => 2047 [TRUE] => 1 )

Смотрите также

  • defined() — Проверяет, существует ли константа с заданным именем
  • constant() — Возвращает значение константы
  • get_loaded_extensions() — Возвращает массив имён всех скомпилированных и загруженных модулей
  • get_defined_functions() — Возвращает массив всех определённых функций
  • get_defined_vars() — Возвращает массив всех определённых переменных

User Contributed Notes 5 notes

15 years ago

Add this method to your class definition if you want an array of class constants (get_defined_constants doesn’t work with class constants as Peter P said above):

public function get_class_constants ()
$reflect = new ReflectionClass ( get_class ( $this ));
return $reflect -> getConstants ());
>
?>

You could also override stdObject with it so that all your classes have this method

6 years ago

If you want to access directly on one category, just use:

print_r ( get_defined_constants ( true )[ ‘Core’ ]);

?>

you can replace ‘Core’ by the category you wish (e.g. user):

print_r ( get_defined_constants ( true )[ ‘user’ ]);

?>

Warning: only use this on development side

18 years ago

If you want to filter through and return only the prefix for your constants (i.e. you have constants with a naming scheme), then you can use this quick little function. It comes in handy for debugging.

function returnConstants ( $prefix ) foreach ( get_defined_constants () as $key => $value )
if ( substr ( $key , 0 , strlen ( $prefix ))== $prefix ) $dump [ $key ] = $value ;
if(empty( $dump )) < return "Error: No Constants found with prefix '" . $prefix . "'" ; >
else < return $dump ; >
>
?>

Example:

define ( «SITENAME_OPTION_ONE» , true );
define ( «SITENAME_OPTION_TWO» , false );
define ( «SITENAME_URL» , «foo» );

print_r ( returnConstants ( «SITENAME_OPTION» ));
?>

Will return:

Array
(
[SITENAME_OPTIONONE] => 1
[SITENAME_OPTIONTWO] =>
)

18 years ago

/**
* Convert constant value into string name.
*
* @param mixed Constant value.
* @return string Constant name.
* @access public
*/
function sch_get_consant ( $value )
$constants = get_defined_constants ();
$name = array_search ( $value , $constants , TRUE );
return $name ;
>
?>

2 years ago

If you want to create a static method that you can copy and paste into each class you have constants created, you can use:

public static function get_class_constants(): array
$reflect = new ReflectionClass(self::class);

  • Опции PHP/информационные функции
    • assert
    • cli_​get_​process_​title
    • cli_​set_​process_​title
    • dl
    • extension_​loaded
    • gc_​collect_​cycles
    • gc_​disable
    • gc_​enable
    • gc_​enabled
    • gc_​mem_​caches
    • gc_​status
    • get_​cfg_​var
    • get_​current_​user
    • get_​defined_​constants
    • get_​extension_​funcs
    • get_​include_​path
    • get_​included_​files
    • get_​loaded_​extensions
    • get_​required_​files
    • get_​resources
    • getenv
    • getlastmod
    • getmygid
    • getmyinode
    • getmypid
    • getmyuid
    • getopt
    • getrusage
    • ini_​alter
    • ini_​get_​all
    • ini_​get
    • ini_​parse_​quantity
    • ini_​restore
    • ini_​set
    • memory_​get_​peak_​usage
    • memory_​get_​usage
    • memory_​reset_​peak_​usage
    • php_​ini_​loaded_​file
    • php_​ini_​scanned_​files
    • php_​sapi_​name
    • php_​uname
    • phpcredits
    • phpinfo
    • phpversion
    • putenv
    • set_​include_​path
    • set_​time_​limit
    • sys_​get_​temp_​dir
    • version_​compare
    • zend_​thread_​id
    • zend_​version
    • assert_​options
    • get_​magic_​quotes_​gpc
    • get_​magic_​quotes_​runtime
    • restore_​include_​path
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    define

    Определяет именованную константу во время выполнения.

    Список параметров

    Замечание:

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

    Значение константы. В PHP 5 value должно быть скалярным значением ( int , float , string , bool или null ). В PHP 7 также возможно использовать тип array .

    Внимание

    Хотя возможно определить константы с типом resource , не рекомендуется это делать, поскольку может привести к непредсказуемому поведению.

    case_insensitive

    Если параметр установлен как true , то константа будет определена без учёта регистра. По умолчанию константа чувствительна к регистру, то есть CONSTANT и Constant представляют разные значения.

    Внимание

    Начиная с PHP 7.3.0, определение нечувствительных к регистру констант объявлено устаревшим. Начиная с PHP 8.0.0, допустимым значением является только false , передача true вызовет предупреждение.

    Замечание:

    Нечувствительные к регистру константы хранятся в нижнем регистре.

    Возвращаемые значения

    Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

    Список изменений

    Версия Описание
    8.0.0 Передача true в case_insensitive теперь выдаёт ошибку уровня E_WARNING . Передача false всё ещё разрешена.
    7.3.0 Параметр case_insensitive объявлен устаревшим и будет удалён в версии 8.0.0.
    7.0.0 Допустимы значения типа array .

    Примеры

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

    define ( «CONSTANT» , «Hello world.» );
    echo CONSTANT ; // выводит «Hello world.»
    echo Constant ; // выводит «Constant» и выдаёт уведомление.

    define ( «GREETING» , «Hello you.» , true );
    echo GREETING ; // выводит «Hello you.»
    echo Greeting ; // выводит «Hello you.»

    // Начиная с PHP 7
    define ( ‘ANIMALS’ , array(
    ‘собака’ ,
    ‘кошка’ ,
    ‘птица’
    ));
    echo ANIMALS [ 1 ]; // выводит «кошка»

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

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

    var_dump ( defined ( ‘__LINE__’ ));
    var_dump ( define ( ‘__LINE__’ , ‘test’ ));
    var_dump ( constant ( ‘__LINE__’ ));
    var_dump ( __LINE__ );
    ?>

    Результат выполнения приведённого примера:

    bool(false) bool(true) string(4) "test" int(5)

    Смотрите также

    • defined() — Проверяет, существует ли константа с заданным именем
    • constant() — Возвращает значение константы
    • Смотрите раздел Константы

    User Contributed Notes 17 notes

    8 years ago

    Be aware that if «Notice»-level error reporting is turned off, then trying to use a constant as a variable will result in it being interpreted as a string, if it has not been defined.

    I was working on a program which included a config file which contained:

    define ( ‘ENABLE_UPLOADS’ , true );
    ?>

    Since I wanted to remove the ability for uploads, I changed the file to read:

    //define(‘ENABLE_UPLOADS’, true);
    ?>

    However, to my surprise, the program was still allowing uploads. Digging deeper into the code, I discovered this:

    if ( ENABLE_UPLOADS ):
    ?>

    Since ‘ENABLE_UPLOADS’ was not defined as a constant, PHP was interpreting its use as a string constant, which of course evaluates as True.

    6 years ago

    Not sure why the docs omit this, but when attempting to define() a constant that has already been defined, it will fail, trigger an E_NOTICE and the constant’s value will remain as it was originally defined (with the new value ignored).

    (Guess that’s why they’re called «constants».)

    14 years ago

    define() will define constants exactly as specified. So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you’re calling define() from within a namespace. The following examples will make it clear.

    The following code will define the constant «MESSAGE» in the global namespace (i.e. «\MESSAGE»).

    namespace test ;
    define ( ‘MESSAGE’ , ‘Hello world!’ );
    ?>

    The following code will define two constants in the «test» namespace.

    namespace test ;
    define ( ‘test\HELLO’ , ‘Hello world!’ );
    define ( __NAMESPACE__ . ‘\GOODBYE’ , ‘Goodbye cruel world!’ );
    ?>

    6 years ago

    With php 7 you can now define arrays.

    consider the following code:

    define ( «EXPLENATIVES» , [ 1 => «Foo Bar» , 2 => «Fehw Bahr» , 3 => «Foo Bahr» , 4 => «Fooh Bar» , 5 => «Fooh Bhar» , 6 => «Foo Barr» , 7 => «Foogh Bar» , 8 => «Fehw Barr» , 9 => «Fu bar» , 10 => «Foo Bahr» , 11 => «Phoo Bar» , 12 => «Foo Bawr» , 13 => «Phooh Baughr» , 14 => «Foogan Bargan» , 15 => «Foo Bahre» , 16 => «Fu Bahar» , 17 => «Fugh Bar» , 18 => «Phou Baughr» ]);

    //set up define methods using mixed values; both array and non-array values
    define ( «NAVBTNS» , [ EXPLENATIVES , «Nouns» , «Verbs» , «Adjectives» ]);

    //function to create a dropdown menu using the EXPLENATIVES array $btn=EXPLENATIVES=assoc_array

    Love this new implementation !

    13 years ago

    The value of a constant can be the value of another constant.

    define ( «NEW_GOOD_NAME_CONSTANT» , «I have a value» );
    define ( «OLD_BAD_NAME_CONSTANT» , NEW_GOOD_NAME_CONSTANT );

    echo NEW_GOOD_NAME_CONSTANT ; // current
    echo OLD_BAD_NAME_CONSTANT ; // legacy

    15 years ago

    Found something interesting. The following define:

    define ( «THIS-IS-A-TEST» , «This is a test» );
    echo THIS — IS — A — TEST ;
    ?>

    Will return a ‘0’.

    define ( «THIS_IS_A_TEST» , «This is a test» );
    echo THIS_IS_A_TEST ;
    ?>

    Will return ‘This is a test’.

    This may be common knowledge but I only found out a few minutes ago.

    [EDIT BY danbrown AT php DOT net: The original poster is referring to the hyphens versus underscores. Hyphens do not work in defines or variables, which is expected behavior.]

    12 years ago

    This is obvious, but easy to forget: if you include a file, the include file can only make use of constants already defined. For example:

    define ( «VEG» , «cabbage» );
    require( «another file» );
    define ( «FRUIT» , «apple» );

    // «another file»:
    echo VEG ; // cabbage
    echo FRUIT ; // FRUIT
    ?>

    5 years ago

    You can define constants with variable names (works also with constant values or variables or array values or class properties and so on — as long it’s a valid constant name).

    # Define a constant and set a valid constant name as string value
    define ( «SOME_CONSTANT» , «NEW_CONSTANT» );

    # Define a second constant with dynamic name (the value from SOME_CONSTANT)
    define ( SOME_CONSTANT , «Some value» );

    # Output
    echo SOME_CONSTANT ; // prints «NEW_CONSTANT»
    echo «
    » ;
    echo NEW_CONSTANT ; // prints «Some value»

    ?>

    Needless to say that you’ll lose your IDE support for refactoring and highlighting completely for such cases.
    No clue why someone would / could actually use this but i thought it’s worth mentioning.

    7 years ago

    Php 7 — Define: «Defines a named constant at runtime. In PHP 7, array values are also accepted.»

    But prior PHP 7, you can maybe do this, to pass an array elsewhere using define:

    $to_define_array = serialize($array);
    define( «DEFINEANARRAY», $to_define_array );

    $serialized = DEFINEANARRAY; // passing directly the defined will not work
    $our_array = unserialize($serialized);

    8 years ago

    I think worth mentioning is that define() appears to ignore invalid constant names.
    One immediate implication of this seem to be that if you use an invalid constant name you have to use constant() to access it and obviously that you can’t use the return value from define() to tell you whether the constant name used is invalid or not.

    For example:
    $name = ‘7(/!§%’;
    var_dump(define($name, «hello»)); // outputs bool(true)
    var_dump(constant($name)); // outputs string(5) «hello»

    6 years ago

    There’s an undocumented side-effect of setting the third parameter to true (case-insensitive constants): these constants can actually be «redefined» as case-sensitive, unless it’s all lowercase (which you shouldn’t define anyway).

    The fact is that case-sensitive constants are stored as is, while case-insensitive constants are stored in lowercase, internally. You’re still allowed to define other constants with the same name but capitalized differently (except for all lowercase).

    // «echo CONST» prints 1, same as «echo const», «echo CoNst», etc.
    define ( ‘CONST’ , 1 , true );
    echo CONST; // Prints 1

    define ( ‘CONST’ , 2 );
    echo CONST; // Prints 2
    echo CoNsT; // Prints 1
    echo const; // Prints 1

    // ** PHP NOTICE: Constant const already defined **
    define ( ‘const’ , 3 );
    echo const; // Prints 1
    echo CONST; // Prints 2
    ?>

    Why would you use this?

    A third party plugin might attempt to define a constant for which you already set a value. If it’s fine for them to set the new value, assuming you cannot edit the plugin, you could define your constant case-insensitive. You can still access the original value, if needed, by using any capitalization other than the one the plugin uses. As a matter of fact, I can’t think of another case where you would want a case-insensitive constant.

    15 years ago

    For translating with variables and define, take also a look on the constant() function.

    define ( ‘PAYMENT_IDEAL’ , «iDEAL Payment ( NL only )» );
    define ( ‘PAYMENT_MASTERCARD’ , «Mastercard Payment ( international )» );

    echo constant ( «PAYMENT_ $payparam » );

    // output :
    // Mastercard Payment ( international )
    ?>

    12 years ago

    To clear up a few thing:
    Integers with 0 in front work. But since PHP (and many other languages) handle them as octal values, they’re only allowed a range of 0-7:

    define ( ‘GOOD_OCTAL’ , 0700 );
    define ( ‘BAD_OCTAL’ , 0800 );

    print GOOD_OCTAL ;
    print ‘
    ‘ ;
    print BAD_OCTAL ;
    ?>

    Result:
    448
    0

    writing the constant name without the quotation-marks (as mentioned in the notes) throws an E_NOTICE and should be avoided!

    define ( TEST , ‘Throws an E_NOTICE’ );
    ?>

    Result:
    Notice: Use of undefined constant TEST — assumed ‘TEST’

    4 years ago

    It may be worth stating that a define function must be executed before its global constant is referenced.

    Abc();
    define(«TEST», 23);
    function Abc()
    echo TEST;
    > // Abc

    This code fails with a Notice-level message. TEST is treated here as being the string «TEST».

    3 years ago

    A namespace constant can be defined using the define function, the constant defined this way is not global.

    namespace WuXiancheng ;
    \define ( ‘China\Sichuan\Guangan\Yuechi\ZIP’ , 638300 );
    echo ZIP ; //Use of undefined constant ZIP
    echo \China\Sichuan\Guangan\Yuechi\ZIP ; // 638300
    ?>

    2 years ago

    If you happen to name your constant the same as a function name (either a built-in function or a user-defined one), PHP can handle this correctly based on context. For example:

    function myfunc () return ‘function output’ ;
    >

    define ( ‘MYFUNC’ , ‘constant value’ );

    // note that function names are NOT case-sensitive
    // so calling MYFUNC() is the same as calling myfunc()

    echo ‘MYFUNC(): ‘ . MYFUNC () . ‘, MYFUNC: ‘ . MYFUNC ;
    ?>

    Output:
    MYFUNC(): function output, MYFUNC: constant value

    9 months ago

    Since version 8 or 8.1, beat me if I recall any type of class
    as defined constant value is perfectly valid.

    Should You use it, I wouldn’t know.
    Most probably, referencing with such instances will fail badly.
    But it might come handy for public and readonly classes.

    define ( ‘ClassInstance’ ,
    new class extends \My\OtherClass

    private bool $toggle = false ;
    private float $real = 1.2345 ;
    private ? string $obj = null ;

    public function __construct () $this -> privatemethod ();
    >

    private function privatemethod () $this -> obj = var_export ( $this , true );
    >

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

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