ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Константы

Константы

Значение констант, в отличии от переменных заключается в том, что их значение не может изменяться во время выполнения скрипта и оно не может принимать неопределенное значение Null.

Объявление константы


Константы объявляются при помощи функции Define, которая принимает в качестве первого параметра строку с именем константы, в качестве второго параметра передается значение константы. Третий необязательный параметр определяет чувствительность константы к регистру - если передать значение True, новая константа не будет зависеть от регистра. В случае успешного создания константы функция Define возвращает True, в противном случае возвращается значение False.
define( 'ACCESS', true );
В качестве значения константы может выступать логическое (Boolean), целочисленное (Integer), вещественное (Float), строковое (String) значения либо массив (Array). Константы не могут получать в качестве значения объекты (Object) и дескрипторы (Resource).

Хотя допускается создание имени констант произвольного регистра, традиционно они записываются символами верхнего регистра. Данная традиция связана с тем, что другие языки программирования высокого уровня константы и переменные никак не отличаются друг от друга, поэтому правила хорошего тона предписывают отличать переменные и константы именами в разных регистрах, чтобы улучшить читабельность программы.
<?php
define('NUM', 1);
define('STR', 'Hello, world!');
echo NUM; // 1
echo STR; // Hello, world!
echo Num; // Notice: Use of undefined constant Num - assumed 'Num'
Как видно из примера, обращаться к константам можно по их имени и, в отличие от переменных, указывать символ $ перед именем константы не требуется. Если предпринимается попытка обратиться к несуществующей константе генерируется замечание "Notice: Use of undefined constant".

Следует отметить, что РНР имеет ряд предопределенных констант: Null, True и False. Все они не зависят от регистра, поэтому в программах можно встретить различные их записи, но стандарт кодирования PSR требует, чтобы они указывались в нижнем регистре.

При попытке переопределения уже существующей константы функция Define возвращает значение False и будет выведено замечание "Notice: Constant Name already defined". После определения константы изменить ее имя невозможно.

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


Проверить существование константы можно с помощью оператора If и функции Define. Если константа существует, функция вернет True. Однако данный вариант не очень удобный, потому что он создает константу, если она не существует, и выводит замечание, если константа уже определена. Для проверки существования константы существует отдельная функция Defined, в качестве единственного параметра выступает строка с именем константы. Возвращает True, если константа существует, иначе возвращается False:
<?php
// Определяем константу
define('COLOR', 'red');
// Если константа существует, выводим ее значение
if (defined('COLOR')) echo COLOR; // red

Динамическое имя константы


При помощи конструкции $$ можно получить динамические имена переменных, для динамического формирования констант специальный синтаксис не предусмотрен, однако существует отдельная функция Constant, которая принимает строку с именем константы и возвращает ее значение. Если константа с таким именем не обнаружена, возвращается False и выводится предупреждение "Warning: constant(): Couldn't find constant".
<?php
define("COLOR", 'red');
echo COLOR;
echo constant("COLOR");
В данном примере обе строки, выводящие значение константы COLOR при помощи прямого обращения и функции Constant, эквивалентны.

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


В PHP существует ряд предопределенных констант, значение которым выставляет интерпретатор РНР: __LINE__ - текущая строка в файле; __FILE__ - полный путь и имя текущего файла; __FUNCTION__ - имя функции; __CLASS__ - имя класса; __METHOD__ - имя метода; __DIR__ - текущий каталог, в котором расположен скрипт; PHP_VERSION – версия интерпретатора PHP; PHP_EOL – символ конца строки.

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

Абсолютный и относительный пути к файлу


При подключении к скрипту файлов следует указать к ним путь. Различают относительные и абсолютные пути от корня диска.

Использование относительных путей не зависят от сервера размещения или рабочей станции, где ведется разработка. Проект может быть размещен в любом каталоге, без необходимости переписьmать пути включения. Для того чтобы подключить файлы при использовании относительных путей необходимо выполнять операции поднятия или спуска на один или несколько уровней выше или ниже текущей папки. Родительский каталог обозначается двумя точками ".." и записываются следующим образом:
require_once '../classes/images.php';
require_once '../data/config.php';
Чем больше уровней вложений, тем более сложными и длинными становятся относительные пути, и тем более предпочтительны абсолютные пути, для которых не требуется вычислять уровень вложения относительно текущего файла.

В современных РНР-приложениях для решения этой проблемы применяют несколько приемов. Во-первых, стараются использовать одну точку входа, расположенную в корне проекта. При этом вместо указания абсолютного пути используют предопределенную константу __DIR__, сообщающую текущий каталог скрипта.
require_once __DIR__ .'/classes/images.php';
require_once __DIR__ .'/data/config.php';

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


Классы также могут содержать константы, которые определяются при помощи ключевого слова Const. Следует обратить внимание, что ключевое слово Const используется только в классах, для объявления констант вне классов предназначена функция Define.
class ConstantClass
{
const STR = "Hello, world.";
}
Точно так же как и в случае со статическими членами классов, к константам нельзя обращаться при помощи оператора "->". Для обращения используется оператор разрешения области видимости "::". Существование констант может быть проверено при помощи функции Defined, которая возвращает True, если константа существует, и False - в противном случае.
if (defined('ClassConstant::STR')) {
echo 'Константа определена'; // true
}

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

Имя:
Текст комментария: