1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 08:42:13 +01:00
Files
archived-doc-ru/language/constants.xml
2024-03-24 03:41:02 +03:00

376 lines
17 KiB
XML
Raw 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: 5a945dfef09a9595c83855cdb858ffa4a96af305 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>
Значение константы получают по имени константы.
<emphasis>Не нужно</emphasis> указывать перед именем константы символ
<literal>$</literal>, как перед переменными.
Значение константы также получают функцией <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>
Полный путь и имя текущего файла с развёрнутыми символическими ссылками.
Возвращается имя подключаемого файла, если константу указали внутри подключаемого файла.
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
Возвращает директория подключаемого файла, если константу
указали внутри подключаемого файла.
Это эквивалентно вызову
<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.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
-->