1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/language/constants.xml
2025-05-03 20:51:27 +03:00

383 lines
18 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f4f96ef8b2a95283c92ea2183fe1dedf06f3ad22 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="language.constants" xmlns="http://docbook.org/ns/docbook">
<title>Константы</title>
<simpara>
Константа — идентификатор, или имя, для простого значения. Как подсказывает название,
это значение нельзя изменять во время работы скрипта
(кроме <link linkend="language.constants.magic">магических констант</link>,
которые на самом деле не относятся к константам).
Константы чувствительны к регистру. По принятому соглашению, названия констант
записывают в верхнем регистре.
</simpara>
<note>
<para>
До PHP 8.0.0 константам, которые определяли функцией <function>define</function>,
разрешалось быть нечувствительными к регистру.
</para>
</note>
<para>
Названия констант подчиняются тем же правилам именования, которым следуют
другие PHP-идентификаторы. Правильное название начинается с буквы или символа подчёркивания,
за которым следует любое количество букв, цифр и символов подчёркивания. Регулярное
выражение для проверки корректности имени константы выглядит так:
<code>^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>
</para>
<para>
Функция <function>define</function> умеет определять константы
с названиями, которые совпадают с зарезервированными словами
или даже нарушают правила языка по именованию идентификаторов,
при этом значение таких констант вернёт
только функция <function>constant</function>, но делать так не рекомендуют.
</para>
&tip.userlandnaming;
<para>
<!-- TODO Move into syntax section? -->
<example>
<title>Правильные и неправильные названия констант</title>
<programlisting role="php">
<![CDATA[
<?php
// Правильные названия констант
define("FOO", "что-то");
define("FOO2", "что-то ещё");
define("FOO_BAR", "что-то большее");
// Неправильные названия констант
define("2FOO", "что-то");
// Это допустимое объявление, но константы лучше так не называть:
// константа нарушит работу скрипта, если в PHP зарегистрируют магическую константу
// с таким названием
define("__FOO__", "что-то");
?>
]]>
</programlisting>
</example>
</para>
<note>
<simpara>
Понятие «буквы» здесь — символы a-z, A-Z,
и другие символы с ASCII-кодами от 128 до 255 (0x80-0xff).
</simpara>
</note>
<simpara>
Как и &link.superglobals;, константы доступны из любой области видимости.
Константы разрешается использовать из любого места скрипта независимо от области видимости.
Дополнительную информация об области видимости даёт раздел руководства
«<link linkend="language.variables.scope">Область видимости переменной</link>».
</simpara>
<note>
<simpara>
Начиная с PHP 7.1.0 константам класса доступны объявления видимости — защищённая
или закрытая, которые делают константу доступной только в иерархической области видимости
класса, в котором константа определена.
</simpara>
</note>
<sect1 xml:id="language.constants.syntax">
<title>Синтаксис</title>
<simpara>
Константу определяют через ключевое слово <literal>const</literal>
или функцией <function>define</function>.
Функция <function>define</function> разрешает определить константу
для произвольного выражения, тогда как конструкция <literal>const</literal>
содержит ряд ограничений, которые описывает следующий параграф. После определения
константу нельзя изменить или сделать неопределённой.
</simpara>
<simpara>
При определении константы через ключевое слово <literal>const</literal> допускаются
только скалярные выражения с типами <type>bool</type>, <type>int</type>, <type>float</type>
и <type>string</type> и массивы (<type>array</type>),
которые содержат только скалярные выражения.
Для константы возможно определить значение с типом <type>resource</type>,
но из-за непредсказуемого поведения так делать не рекомендуют.
</simpara>
<simpara>
Значение константы получают по названию константы. Символ <literal>$</literal>
перед названиями констант, как перед названиями переменных, <emphasis>не указывают</emphasis>.
Значение константы также получают функцией <function>constant</function>,
если название константы формируется динамически.
Список всех определённых констант получают функцией <function>get_defined_constants</function>.
</simpara>
<note>
<simpara>
Константы и переменные, в том числе глобальные, принадлежат разным пространствам имён.
Поэтому, например, логическая константа &true;
и переменная <varname>$TRUE</varname> — не одно и то же.
</simpara>
</note>
<simpara>
При попытке обратиться к неопределённой константе выбрасывается
ошибка <classname>Error</classname>.
До PHP 8.0.0 неопределённые константы интерпретировались как простое
строковое (<type>string</type>) слово, поэтому идентификатор CONSTANT сравнивался со строкой "CONSTANT".
Этот резервный вариант устарел в PHP 7.2.0, при этом
генерируется ошибка уровня <constant>E_WARNING</constant>.
До PHP 7.2.0 вместо этого выдавалась ошибка уровня <link linkend="ref.errorfunc">E_NOTICE</link>.
Смотрите также главу руководства, которая разъясняет, почему
<link linkend="language.types.array.foo-bar">$foo[bar]</link>
это неправильно, если только <literal>bar</literal> не константа.
Это не относится к <link linkend="language.namespaces.rules">полным и абсолютным константам</link>,
которые каждый раз будут выбрасывать ошибку <classname>Error</classname>,
если эти константы не определили.
</simpara>
<note>
<simpara>
Установку константы проверяют функцией <function>defined</function>.
</simpara>
</note>
<para>
Отличия констант от переменных:
<itemizedlist>
<listitem>
<simpara>
Перед константами не указывают знак доллара <literal>$</literal>;
</simpara>
</listitem>
<listitem>
<simpara>
Константы определяют и получают к ним доступ в произвольном месте кода. Определение
и доступность констант не зависит от правил определения области видимости переменных;
</simpara>
</listitem>
<listitem>
<simpara>
Константы нельзя переопределять или удалять после первоначального объявления;
</simpara>
</listitem>
<listitem>
<simpara>
Константы содержат только скалярные значения или массивы.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Определение констант</title>
<programlisting role="php">
<![CDATA[
<?php
define("CONSTANT", "Здравствуй, мир.");
echo CONSTANT; // Выводит "Здравствуй, мир."
echo Constant; // Выбросит ошибку: Неопределённая константа Constant
// До PHP 8.0.0 выводит "Constant" и выдаёт предупреждение
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Определение констант через ключевое слово <literal>const</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Простое скалярное значение
const CONSTANT = 'Здравствуй, мир.';
echo 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"
?>
]]>
</programlisting>
</example>
</para>
<note>
<para>
В отличие от определения констант функцией <function>define</function>,
константы, которые объявили через ключевое слово <literal>const</literal>,
требуется объявлять в самой верхней области видимости, потому что константы
определяются при компилировании скрипта. Поэтому константы нельзя объявлять
внутри функций, циклов, инструкций <literal>if</literal>, или блоков <literal>try</literal>
и <literal>catch</literal>.
</para>
</note>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.constants">Константы классов</link></member>
</simplelist>
</para>
</sect2>
</sect1>
<sect1 xml:id="language.constants.predefined">
<title>Предопределённые константы</title>
<simpara>
Для каждого скрипта, который запускает PHP,
предусмотрели набор <link linkend="reserved.constants">предопределённых констант</link>.
При этом часть констант этого списка создают модули. Поэтому такие константы
доступны только при доступности модулей, которые либо динамически загрузили,
либо включили в сборку PHP при компиляции.
</simpara>
</sect1>
<sect1 xml:id="language.constants.magic">
<title>Магические константы</title>
<para>
PHP включает ряд магических констант, значение которых изменяется в зависимости от контекста.
Значение константы <constant>__LINE__</constant>, например, зависит от строки скрипта,
на которой указали константу. PHP разрешает «магические» константы
во время компиляции, в отличие от стандартных констант, которые PHP разрешает
во время выполнения. Специальные константы нечувствительны
к регистру, а список таких констант приводит следующий параграф:
</para>
<para>
<table>
<title>Магические константы PHP</title>
<tgroup cols="2">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row xml:id="constant.line">
<entry><constant>__LINE__</constant></entry>
<entry>
Текущий номер строки файла.
</entry>
</row>
<row xml:id="constant.file">
<entry><constant>__FILE__</constant></entry>
<entry>
Полный путь и имя текущего файла с разрешёнными символическими ссылками.
PHP возвращает имя подключённого файла, если константу указали внутри него.
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
Каталог файла. PHP возвращает каталог подключённого файла, если константу
указали внутри подключаемого файла.
Значение константы эквивалентно вызову
<literal>dirname(__FILE__)</literal>. Имя каталога возвращается
без слеша в конце, если только это не корневой каталог.
</entry>
</row>
<row xml:id="constant.function">
<entry><constant>__FUNCTION__</constant></entry>
<entry>
Название функции или <literal>{closure}</literal> для анонимной функции.
</entry>
</row>
<row xml:id="constant.class">
<entry><constant>__CLASS__</constant></entry>
<entry>
Название класса. Название класса включает пространство имён, в котором объявили класс,
например <literal>Foo\Bar</literal>.
Внутри методов трейтов значение константы __CLASS__ равно названию класса, в котором вызывают метод трейта.
</entry>
</row>
<row xml:id="constant.trait">
<entry><constant>__TRAIT__</constant></entry>
<entry>
Имя трейта. Имя трейта включает пространство имён,
в котором объявили трейт, например: <literal>Foo\Bar</literal>.
</entry>
</row>
<row xml:id="constant.method">
<entry><constant>__METHOD__</constant></entry>
<entry>
Имя метода класса.
</entry>
</row>
<row xml:id="constant.property">
<entry><constant>__PROPERTY__</constant></entry>
<entry>
Название свойства. Константа действует только
<link linkend="language.oop5.property-hooks">внутри хука свойства</link>.
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
Имя текущего пространства имён.
</entry>
</row>
<row xml:id="constant.coloncolonclass">
<entry><constant><replaceable>ClassName</replaceable>::class</constant></entry>
<entry>
Абсолютное имя класса.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.basic.class.class">::class</link></member>
<member><function>get_class</function></member>
<member><function>get_object_vars</function></member>
<member><function>file_exists</function></member>
<member><function>function_exists</function></member>
</simplelist>
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->