mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
383 lines
18 KiB
XML
383 lines
18 KiB
XML
<?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
|
||
-->
|