Обновление перевода (#670)

This commit is contained in:
Mikhail Alferov
2024-01-08 19:34:17 +03:00
committed by GitHub
parent 1c44245774
commit d92d6fe4c8

View File

@ -6,29 +6,29 @@
<simpara>
PHP не требует явного определения типа при объявлении переменной.
В этом случае тип переменной определяется значением, которое она хранит.
Если тип переменной не указан, он будет определён значением, которое она хранит.
То есть, если переменной <varname>$var</varname> присваивается значение типа строка (<type>string</type>), то
<varname>$var</varname> изменит тип на строку (<type>string</type>).
Если после этого переменной <varname>$var</varname> будет присвоено значение типа целое число (<type>int</type>), то она изменит тип на целое число (<type>int</type>).
</simpara>
<para>
В определённых контекстах PHP может попытаться автоматически преобразовать тип значения в другой. Существуют следующие различные контексты:
В ряде контекстов PHP может попытаться автоматически преобразовать тип значения в другой. Существующие контексты:
<itemizedlist>
<listitem>
<simpara>Числовой контекст</simpara>
<simpara>Числовой</simpara>
</listitem>
<listitem>
<simpara>Строчный контекст</simpara>
<simpara>Строчный</simpara>
</listitem>
<listitem>
<simpara>Логический контекст</simpara>
<simpara>Логический</simpara>
</listitem>
<listitem>
<simpara>Контекст целых чисел и строк</simpara>
</listitem>
<listitem>
<simpara>Сравнительный контекст</simpara>
<simpara>Сравнительный</simpara>
</listitem>
<listitem>
<simpara>Контекст функций</simpara>
@ -43,25 +43,28 @@
</note>
<simpara>
Чтобы принудительно установить тип переменной, смотрите раздел <link linkend="language.types.typecasting">Приведение типа</link>.
Чтобы изменить тип переменной, смотрите описание функции <function>settype</function>.
О том, как принудительно установить тип переменной, рассказано в разделе
«<link linkend="language.types.typecasting">Приведение типа</link>».
О том, как изменить тип переменной, рассказано в описании функции <function>settype</function>.
</simpara>
<sect2>
<title>Числовой контекст</title>
<simpara>
Контекст при использовании
<link linkend="language.operators.arithmetic">арифметического оператора</link>.
Числовой контекст возникает при работе с
<link linkend="language.operators.arithmetic">арифметическими операторами</link>.
</simpara>
<simpara>
В данном контексте, если один из операндов является числом с плавающей точкой (<type>float</type>) (или не интерпретируется как целое число (<type>int</type>)),
В этом контексте, если один из операндов число с плавающей точкой (<type>float</type>)
(или не интерпретируется как целое число (<type>int</type>)),
оба операнда интерпретируются как число с плавающей точкой (<type>float</type>)
и результатом будет число с плавающей точкой (<type>float</type>).
В противном случае операнды будут интерпретированы как целое число (<type>int</type>)
и результатом также будет целое число (<type>int</type>).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, выбрасывается ошибка <classname>TypeError</classname>.
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован,
выбрасывается исключение <classname>TypeError</classname>.
</simpara>
</sect2>
@ -69,14 +72,14 @@
<title>Строчный контекст</title>
<simpara>
Контекст при использовании функций <function>echo</function>,
<function>print</function>, <link linkend="language.types.string.parsing">интерполяции строк</link>
или строкового <link linkend="language.operators.string">оператора конкатенации</link>.
Строчный контекст возникает при работе с языковыми конструкциями <function>echo</function>,
<function>print</function>, при <link linkend="language.types.string.parsing">интерполяции строк</link>
или строковом <link linkend="language.operators.string">операторе конкатенации</link>.
</simpara>
<simpara>
В данном контексте значение будет интерпретироваться как строка (<type>string</type>).
Если значение не может быть интерпретировано, выбрасывается ошибка <classname>TypeError</classname>.
В этом контексте значение будет интерпретироваться как строка (<type>string</type>).
Если значение не может быть интерпретировано, выбрасывается исключение <classname>TypeError</classname>.
До версии PHP 7.4.0 выдавалась ошибка уровня <constant>E_RECOVERABLE_ERROR</constant>.
</simpara>
</sect2>
@ -85,7 +88,9 @@
<title>Логический контекст</title>
<simpara>
Контекст при использовании условных операторов, <link linkend="language.operators.comparison.ternary">тернарного оператора</link> или <link linkend="language.operators.logical">логического оператора</link>.
Логический контекст возникает при работе с условными операторами,
<link linkend="language.operators.comparison.ternary">тернарным оператором</link>
или <link linkend="language.operators.logical">логическим оператором</link>.
</simpara>
<simpara>
@ -97,14 +102,17 @@
<title>Контекст целых чисел и строк</title>
<simpara>
Контекст при использовании <link linkend="language.operators.bitwise">побитовых операторов</link>.
Контекст целых чисел и строк возникает
при работе с <link linkend="language.operators.bitwise">побитовыми операторами</link>.
</simpara>
<simpara>
В данном контексте, если у всех операндов тип строка (<type>string</type>), результат также будет строкой (<type>string</type>).
В этом контексте, если у всех операндов тип строка (<type>string</type>),
результат также будет строкой (<type>string</type>).
В противном случае операнды будут интерпретированы как целое число (<type>int</type>)
и результат также будет целым числом (<type>int</type>).
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован, то будет выброшена ошибка <classname>TypeError</classname>.
Начиная с PHP 8.0.0, если один из операндов не может быть интерпретирован,
то будет выброшено исключение <classname>TypeError</classname>.
</simpara>
</sect2>
@ -112,11 +120,14 @@
<title>Сравнительный контекст</title>
<simpara>
Контекст при использовании <link linkend="language.operators.comparison">оператора сравнения</link>.
Сравнительный контекст возникает при работе
с <link linkend="language.operators.comparison">операторами сравнения</link>.
</simpara>
<simpara>
Преобразования типов, которые происходят в этом контексте, объясняются в <link linkend="language.operators.comparison.types">таблице сравнения различных типов</link> раздела Операторы сравнения.
Преобразования типов, которые происходят в этом контексте, объяснены
в <link linkend="language.operators.comparison.types">таблице сравнения типов</link>
раздела «Операторы сравнения».
</simpara>
</sect2>
@ -124,22 +135,25 @@
<title>Контекст функций</title>
<simpara>
Контекст, когда значение передаётся типизированному параметру, свойству или возвращается из функции, в которой объявлен тип возвращаемого значения.
Контекст функций возникает, когда значение передаётся типизированному параметру,
свойству или возвращается из функции, в которой объявлен тип возвращаемого значения.
</simpara>
<para>
В этом контексте значение должно быть значением данного типа.
Существуют два исключения, первое: если тип значения целое число (<type>int</type>),
а объявленный тип — число с плавающей точкой (<type>float</type>), то целое число преобразуется в число с плавающей точкой.
Второй: если объявленный тип является <emphasis>скалярным</emphasis> типом, значение преобразуется в скалярный тип
и режим строгой типизации активен (по умолчанию), значение может быть преобразовано в допустимое скалярное значение.
Описание такого поведения смотрите ниже.
В этом контексте значение должно быть значением типа.
Есть два исключения, первое: если тип значения целое число (<type>int</type>),
а объявленный тип — число с плавающей точкой (<type>float</type>),
то целое число преобразовывается в число с плавающей точкой.
Второй: если объявленный тип — это <emphasis>скалярный</emphasis> тип,
значение преобразуемо в скалярный тип и режим строгой типизации активен (по умолчанию),
значение может быть преобразовано в допустимое скалярное значение.
Описание такого поведения дано ниже.
</para>
<warning>
<simpara>
<link linkend="functions.internal">Встроенные функции</link> автоматически подставляют &null; к скалярным типам,
это поведение <emphasis>УСТАРЕЛО</emphasis> в PHP 8.1.0.
это поведение <emphasis>УСТАРЕЛО</emphasis> с PHP 8.1.0.
</simpara>
</warning>
@ -154,15 +168,15 @@
<listitem>
<simpara>
Объявление типа <type>int</type>: значение интерпретируется как целое число (<type>int</type>),
если преобразование хорошо определено. Например, строка является
<link linkend="language.types.numeric-strings">числовой строкой</link>.
если преобразование надёжно определимо. Например, когда строка
<link linkend="language.types.numeric-strings">числовая строка</link>.
</simpara>
</listitem>
<listitem>
<simpara>
Объявление типа <type>float</type>: значение интерпретируется как число с плавающей точкой (<type>float</type>)
если преобразование хорошо определено. Например, строка является
<link linkend="language.types.numeric-strings">числовой строкой</link>.
Объявление типа <type>float</type>: значение интерпретируется как число с плавающей точкой (<type>float</type>),
если преобразование надёжно определимо. Например, когда строка
<link linkend="language.types.numeric-strings">числовая строка</link>.
</simpara>
</listitem>
<listitem>
@ -176,10 +190,10 @@
<sect3 xml:id="language.types.type-juggling.function.union">
<title>Принудительная типизация с объединением типов</title>
<para>
При выключенном <literal>strict_types</literal>, объявления скалярных типов
подвергаются ограниченному неявному приведению типов.
Если точный тип значения не является частью объединения,
то целевой тип выбирается в следующем порядке предпочтения:
Когда директива <literal>strict_types</literal> не включена, объявления скалярных типов
подлежат ограниченному неявному приведению типов.
Если точный тип значения не часть объединения,
то целевой тип выбран из списка в порядке убывания приоритета:
<orderedlist>
<listitem>
@ -205,25 +219,26 @@
</orderedlist>
Если тип и существует в объединении и значение может быть приведено к этому типу
в соответствии с существующей семантикой проверки типов PHP, то выбирается этот тип.
В противном случае выбирается следующий тип.
в соответствии с существующей семантикой проверки типов PHP, то PHP выбирает этот тип.
В противном случае будет выбран следующий по порядку тип.
</para>
<caution>
<para>
В качестве исключения, если значение является строкой,
а целое число (int) и число с плавающей точкой (float) являются частью объединения,
предпочтительный тип определяется существующей семантикой <link linkend="language.types.numeric-strings">числовой строки</link>.
Например, для <literal>"42"</literal> выбирается целое число (<type>int</type>),
а для <literal>"42.0"</literal> выбирается число с плавающей точкой (<type>float</type>).
В качестве исключения, если значение строка,
а целое число (int) и число с плавающей точкой (float) — это часть объединения,
предпочтительный тип будет определён существующей семантикой
<link linkend="language.types.numeric-strings">числовой строки</link>.
Например, для <literal>«42»</literal> PHP выбирает целое число (<type>int</type>),
а для <literal>«42.0»</literal> — число с плавающей точкой (<type>float</type>).
</para>
</caution>
<note>
<para>
Типы, не входящие в приведённый выше список предпочтений, не являются объектами
для неявного приведения. В частности, не происходит неявного приведения
к типам <type>null</type>, <type>false</type> и <type>true</type>.
Типы, которые не входят в список предпочтений, не станут целями
для неявного приведения. Говоря конкретнее, никакого неявного приведения к типам
<type>null</type>, <type>false</type> и <type>true</type> не будет.
</para>
</note>
@ -232,6 +247,7 @@
<programlisting role="php">
<![CDATA[
<?php
// int|string
42 --> 42 // точный тип
"42" --> "42" // точный тип
@ -272,47 +288,48 @@ true --> 1 // bool совместимый с int
<programlisting role="php">
<![CDATA[
<?php
$foo = 10; // $foo - это целое число
$bar = (bool) $foo; // $bar - это логическое значение
$foo = 10; // $foo — это целое число
$bar = (bool) $foo; // $bar — это логическое значение
?>
]]>
</programlisting>
</informalexample>
<simpara>
Допускаются следующие приведения типов:
Разрешены следующие приведения типов:
</simpara>
<simplelist>
<member><literal>(int)</literal> - приведение типа к целому числу (<type>int</type>)</member>
<member><literal>(bool)</literal> - приведение типа к логическому значению (<type>bool</type>)</member>
<member><literal>(float)</literal> - приведение типа к числу с плавающей точкой (<type>float</type>)</member>
<member><literal>(string)</literal> - приведение типа к строке (<type>string</type>)</member>
<member><literal>(array)</literal> - приведение типа к массиву (<type>array</type>)</member>
<member><literal>(object)</literal> - приведение типа к объекту (<type>object</type>)</member>
<member><literal>(unset)</literal> - приведение типа к <type>NULL</type></member>
<member><literal>(int)</literal> приведение типа к целому числу (<type>int</type>)</member>
<member><literal>(bool)</literal> приведение типа к логическому значению (<type>bool</type>)</member>
<member><literal>(float)</literal> приведение типа к числу с плавающей точкой (<type>float</type>)</member>
<member><literal>(string)</literal> приведение типа к строке (<type>string</type>)</member>
<member><literal>(array)</literal> приведение типа к массиву (<type>array</type>)</member>
<member><literal>(object)</literal> приведение типа к объекту (<type>object</type>)</member>
<member><literal>(unset)</literal> приведение типа к <type>NULL</type></member>
</simplelist>
<note>
<para>
<literal>(integer)</literal> является псевдонимом приведения типа <literal>(int)</literal>.
<literal>(boolean)</literal> является псевдонимом приведения типа <literal>(bool)</literal>.
<literal>(binary)</literal> является псевдонимом приведения типа <literal>(string)</literal>.
<literal>(double)</literal> и <literal>(real)</literal> являются псевдонимами приведения типа <literal>(float)</literal>.
<literal>(integer)</literal> псевдоним приведения типа <literal>(int)</literal>.
<literal>(boolean)</literal> псевдоним приведения типа <literal>(bool)</literal>.
<literal>(binary)</literal> псевдоним приведения типа <literal>(string)</literal>.
<literal>(double)</literal> и <literal>(real)</literal> псевдонимы приведения типа <literal>(float)</literal>.
Эти приведения не используют каноническое имя типа и не рекомендуются.
</para>
</note>
<warning>
<simpara>
Псевдоним приведения типа <literal>(real)</literal> устарел, начиная с PHP 8.0.0.
Псевдоним приведения типа <literal>(real)</literal> устарел с PHP 8.0.0.
</simpara>
</warning>
<warning>
<simpara>
Приведение типа <literal>(unset)</literal> устарело, начиная с версии PHP 7.2.0.
Приведение типа <literal>(unset)</literal> устарело с версии PHP 7.2.0.
Обратите внимание, что приведение <literal>(unset)</literal> равносильно присвоению переменной или вызову значения <type>NULL</type>.
Приведение <literal>(unset)</literal> удалено в PHP 8.0.0.
</simpara>
@ -321,18 +338,19 @@ $bar = (bool) $foo; // $bar - это логическое значение
<caution>
<simpara>
Приведение типа <literal>(binary)</literal> и префикс <literal>b</literal> существуют для прямой поддержки.
В настоящее время <literal>(binary)</literal> и <literal>(string)</literal> идентичны, однако это может измениться и на это не следует полагаться.
Типы <literal>(binary)</literal> и <literal>(string)</literal> идентичны, однако, это может измениться, не нужно на это полагаться.
</simpara>
</caution>
<note>
<para>
Пробелы игнорируются в круглых скобках при приведении типа.
Таким образом, следующие два приведения типов эквивалентны:
PHP игнорирует пробелы в круглых скобках при приведении типа.
Поэтому следующие два приведения типов эквивалентны:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
@ -350,6 +368,7 @@ $foo = ( int ) $bar;
<programlisting role="php">
<![CDATA[
<?php
$binary = (binary) $string;
$binary = b"binary string";
?>
@ -366,11 +385,12 @@ $binary = b"binary string";
<programlisting role="php">
<![CDATA[
<?php
$foo = 10; // $foo является целым числом
$str = "$foo"; // $str является строкой
$fst = (string) $foo; // $fst также является строкой
// Выводит, что "они одинаковые"
$foo = 10; // $foo — целое число
$str = "$foo"; // $str — строка
$fst = (string) $foo; // $fst тоже строка
// Выводит, что «они одинаковые»
if ($fst === $str) {
echo "они одинаковые";
}
@ -381,8 +401,8 @@ if ($fst === $str) {
</note>
<para>
Может быть неочевидно, что именно произойдёт при преобразовании между определёнными типами.
Для получения дополнительной информации смотрите эти разделы:
Может быть неочевидно, что произойдёт при преобразовании между разными типами.
Получить дополнительную информацию можно в разделах:
<simplelist>
<member><link linkend="language.types.boolean.casting">Преобразование типа к логическому значению (boolean)</link></member>
@ -401,7 +421,7 @@ if ($fst === $str) {
<simplesect>
<note>
<simpara>
Поскольку PHP поддерживает индексацию в строках (<type>string</type>) с помощью смещения, используя тот же синтаксис,
Поскольку PHP поддерживает индексацию в строках (<type>string</type>) через смещения, используя тот же синтаксис,
что и индексация в массивах (<type>array</type>), следующий пример справедлив для всех версий PHP:
</simpara>
@ -409,8 +429,9 @@ if ($fst === $str) {
<programlisting role="php">
<![CDATA[
<?php
$a = 'car'; // $a является строкой
$a[0] = 'b'; // $a по-прежнему является строкой
$a = 'car'; // $a строка
$a[0] = 'b'; // $a по-прежнему строка
echo $a; // bar
?>
]]>
@ -418,7 +439,7 @@ echo $a; // bar
</informalexample>
<simpara>
Дополнительную информацию смотрите в разделе <link linkend="language.types.string.substr">Доступ к символу в строке и его изменение</link>.
Дополнительную информацию можно найти разделе «<link linkend="language.types.string.substr">Доступ к символу в строке и его изменение</link>».
</simpara>
</note>
</simplesect>