- # Constants
- # Define constant using explicit values
- # Define constant using another constant
- # Reserved constants
- # Conditional defines
- # const vs define
- # Class Constants
- # Checking if constant is defined
- # Simple check
- # Getting all defined constants
- # Constant arrays
- # Class constant example
- # Plain constant example
- # Using constants
- # Syntax
- # Remarks
- Константы в PHP — const и define()
- Как создавать константы
- PHP меньше 5.3
- С версии PHP 5.3
- PHP 5.6
- Разница между define() и const
- #1 const должны быть объявлены в верхней области
- #2 const всегда регистрозависима
- #3 const понимает только скаляры, массивы и выражения из примитивов
- #4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0
- #5 const зависит от пространства имен, а define нет
- Константы PHP класса
- «Волшебные» константы
# Constants
Constants are created using the const statement or the define function. The convention is to use UPPERCASE letters for constant names.
# Define constant using explicit values
const PI = 3.14; // float define("EARTH_IS_FLAT", false); // boolean const "UNKNOWN" = null; // null define("APP_ENV", "dev"); // string const MAX_SESSION_TIME = 60 * 60; // integer, using (scalar) expressions is ok const APP_LANGUAGES = ["de", "en"]; // arrays define("BETTER_APP_LANGUAGES", ["lu", "de"]); // arrays
# Define constant using another constant
if you have one constant you can define another one based on it:
const TAU = PI * 2; define("EARTH_IS_ROUND", !EARTH_IS_FLAT); define("MORE_UNKNOWN", UNKNOWN); define("APP_ENV_UPPERCASE", strtoupper(APP_ENV)); // string manipulation is ok too // the above example (a function call) does not work with const: // const TIME = time(); # fails with a fatal error! Not a constant scalar expression define("MAX_SESSION_TIME_IN_MINUTES", MAX_SESSION_TIME / 60); const APP_FUTURE_LANGUAGES = [-1 => "es"] + APP_LANGUAGES; // array manipulations define("APP_BETTER_FUTURE_LANGUAGES", array_merge(["fr"], APP_BETTER_LANGUAGES));
# Reserved constants
Some constant names are reserved by PHP and cannot be redefined. All these examples will fail:
define("true", false); // internal constant define("false", true); // internal constant define("CURLOPT_AUTOREFERER", "something"); // will fail if curl extension is loaded
And a Notice will be issued:
Constant . already defined in .
# Conditional defines
If you have several files where you may define the same variable (for example, your main config then your local config) then following syntax may help avoiding conflicts:
defined("PI") || define("PI", 3.1415); // "define PI if it's not yet defined"
# const vs define
define is a runtime expression while const a compile time one.
Thus define allows for dynamic values (i.e. function calls, variables etc.) and even dynamic names and conditional definition. It however is always defining relative to the root namespace.
const is static (as in allows only operations with other constants, scalars or arrays, and only a restricted set of them, the so called constant scalar expressions, i.e. arithmetic, logical and comparison operators as well as array dereferencing), but are automatically namespace prefixed with the currently active namespace.
const only supports other constants and scalars as values, and no operations.
# Class Constants
Constants can be defined inside classes using a const keyword.
class Foo const BAR_TYPE = "bar"; // reference from inside the class using self:: public function myMethod() return self::BAR_TYPE; > > // reference from outside the class using :: echo Foo::BAR_TYPE;
This is useful to store types of items.
class Logger const LEVEL_INFO = 1; const LEVEL_WARNING = 2; const LEVEL_ERROR = 3; // we can even assign the constant as a default value public function log($message, $level = self::LEVEL_INFO) echo "Message level " . $level . ": " . $message; > > $logger = new Logger(); $logger->log("Info"); // Using default value $logger->log("Warning", $logger::LEVEL_WARNING); // Using var $logger->log("Error", Logger::LEVEL_ERROR); // using class
# Checking if constant is defined
# Simple check
To check if constant is defined use the defined function. Note that this function doesn’t care about constant’s value, it only cares if the constant exists or not. Even if the value of the constant is null or false the function will still return true .
define("GOOD", false); if (defined("GOOD")) print "GOOD is defined" ; // prints "GOOD is defined" if (GOOD) print "GOOD is true" ; // does not print anything, since GOOD is false > > if (!defined("AWESOME")) define("AWESOME", true); // awesome was not defined. Now we have defined it >
Note that constant becomes «visible» in your code only after the line where you have defined it:
if (defined("GOOD")) print "GOOD is defined"; // doesn't print anyhting, GOOD is not defined yet. > define("GOOD", false); if (defined("GOOD")) print "GOOD is defined"; // prints "GOOD is defined" >
# Getting all defined constants
To get all defined constants including those created by PHP use the get_defined_constants function:
$constants = get_defined_constants(); var_dump($constants); // pretty large list
To get only those constants that were defined by your app call the function at the beginning and at the end of your script (normally after the bootstrap process):
$constants = get_defined_constants(); define("HELLO", "hello"); define("WORLD", "world"); $new_constants = get_defined_constants(); $myconstants = array_diff_assoc($new_constants, $constants); var_export($myconstants); /* Output: array ( 'HELLO' => 'hello', 'WORLD' => 'world', ) */
It’s sometimes useful for debugging
# Constant arrays
Arrays can be used as plain constants and class constants from version PHP 5.6 onwards:
# Class constant example
class Answer const C = [2,4]; > print Answer::C[1] . Answer::C[0]; // 42
# Plain constant example
const ANSWER = [2,4]; print ANSWER[1] . ANSWER[0]; // 42
Also from version PHP 7.0 this functionality was ported to the define
(opens new window) function for plain constants.
define('VALUES', [2, 3]); define('MY_ARRAY', [ 1, VALUES, ]); print MY_ARRAY[1][1]; // 3
# Using constants
To use the constant simply use its name:
if (EARTH_IS_FLAT) print "Earth is flat"; > print APP_ENV_UPPERCASE;
or if you don’t know the name of the constant in advance, use the constant function:
// this code is equivalent to the above code $const1 = "EARTH_IS_FLAT"; $const2 = "APP_ENV_UPPERCASE"; if (constant($const1)) print "Earth is flat"; > print constant($const2);
# Syntax
- define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- const CONSTANT_NAME = VALUE;
# Remarks
(opens new window) are used to store the values that are not supposed to be changed later. They also are often used to store the configuration parameters especially those which define the environment (dev/production).
Constants have types like variables but not all types can be used to initialize a constant. Objects and resources cannot be used as values for constants at all. Arrays can be used as constants starting from PHP 5.6
Some constant names are reserved by PHP. These include true , false , null as well as many module-specific constants.
Constants are usually named using uppercase letters.
Константы в PHP — const и define()
В этой заметке разберемся, в чем разница в объявлении PHP констант с помощью ключевого слова const и функции define() . Константы в PHP — это «постоянные», значения которых указывается всего один раз и затем не может быть изменено. При попытке изменить значение, оно не изменится и появится PHP заметка: «Constant already defined» (константа уже определена):
define('FOO', 'val'); define('FOO', 'val2'); // Notice: Constant already defined echo FOO; //> val
// 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 = [1, 2, 3]; // работает define( 'FOO', [1, 2, 3] ); // не работает в PHP 5.6, работает в PHP 7.0
Разница между define() и const
#1 const должны быть объявлены в верхней области
Потому что они определяются при компилировании скрипта. Это значит, что const нельзя использовать внутри функций/циклов/выражений if или try/catch блоков.
#2 const всегда регистрозависима
В то время как define() позволяет создать регистро-независимые константы:
define( 'NAME', 'VALUE', true ); echo NAME; // VALUE echo name; // VALUE
#3 const понимает только скаляры, массивы и выражения из примитивов
const нельзя передать переменные, функции, выражения, а define() можно:
const FOO = $var; // Parse error const FOO = home_url(); // Parse error define( 'FOO', $var ); // нет ошибок define( 'FOO', home_url() ); // нет ошибок
С версии PHP 5.6 в const также можно указывать примитивные выражения и массивы, а не только скаляры.
#4 const может хранить массивы с версии PHP 5.6, а define с PHP 7.0
const FOO = [1, 2, 3]; // работает с PHP 5.6 define( 'FOO', [1, 2, 3] ); // работает с PHP 7.0
#5 const зависит от пространства имен, а define нет
Если мы создаем константу в namespace, то:
- При использовании const — константа будет нахоидтся в этом прастранстве и не будет доступна вне его.
- При использовании define — константа регистрируется как глобальная и будет доступна за пределами namespace.
namespace My\Space; const FOO = 'bar'; define( 'FOOO', 'baz' );
Теперь чтобы обратиться к этим константам за пределами пространства имен, например из другого файла, нужно писать так:
echo \My\Space\FOO; // bar echo FOOO; // baz
Итог сравнения
Определять константу почти всегда лучше с помощью define() , потому что тут больше возможностей и меньше вариантов «поймать» ошибку. Исключения:
- У вас версия PHP 5.6 и вам нужно сохранить массив в константу, тут поможет const .
- Вам нужно, чтобы константа была не в глобальной видимости, а в видимости пространства имен (namespace).
Константы PHP класса
Объявляются только с помощью const . Правила для них такие как описано выше: принимают только скаляры, не понимают PHP переменные, функции, выражения.
Объявленная константа принадлежит классу, она не принадлежит ни одному объекту, но является общей для всех объектов (экземпляров) класса.
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;
До PHP 7.1 постоянные класса всегда общедоступны — нет статуса private или protected . Однако с версии PHP 7.1 константам класса можно указать модификатор:
Константы для классов чем-то похожи на 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. Полное имя класса (с указанием пространства имен). |