Update e587d06 to En (#1088)

* Update types.xml to en

* Update array.xml to en + infostyle

* Update boolean.xml to en

* Update callable.xml to en

* Update float.xml to en

* Update integer.xml to en

* Update iterable.xml to en

* Update numeric-strings.xml to en

* Update object.xml to en

* Update type-juggling.xml to en
This commit is contained in:
Mikhail Alferov
2025-07-14 13:40:31 +03:00
committed by GitHub
parent 24d1e373ac
commit 1d42c10303
10 changed files with 383 additions and 311 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f908fff129bcd8ec1605658e06457cb04e5b2b51 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="language.types" xmlns="http://docbook.org/ns/docbook">
<chapter xml:id="language.types" xmlns="http://docbook.org/ns/docbook" annotations="interactive">
<title>Типы</title>
<sect1 xml:id="language.types.intro">
@ -63,7 +63,8 @@
Принадлежность выражения конкретному типу проверяют функциями семейства
<literal>is_<replaceable>type</replaceable></literal>.
<informalexample>
<example>
<title>Типы</title>
<programlisting role="php">
<![CDATA[
<?php
@ -82,7 +83,7 @@ if (is_int($an_int)) {
}
var_dump($an_int);
// Проверить, содержит ли переменная $a_bool строку, и вывести её
// Проверить, содержит ли переменная $a_bool строку, и вывести строковое значение
if (is_string($a_bool)) {
echo "Строка: $a_bool";
}
@ -98,7 +99,7 @@ string
int(16)
]]>
</screen>
</informalexample>
</example>
</para>
<note>
<simpara>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 22583751fbfdaa3eaa41aeb6470d1343f5cb2c78 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.array">
<title>Массивы</title>
@ -24,11 +24,11 @@
<title>Синтаксис</title>
<sect3 xml:id="language.types.array.syntax.array-func">
<title>Определение при помощи <function>array</function></title>
<title>Определение массива через языковую конструкцию <function>array</function></title>
<para>
Массив (<type>array</type>) создают языковой конструкцией <function>array</function>.
В качестве аргументов она принимает любое количество разделённых запятыми пар
Конструкция принимает как аргументы произвольное количество разделённых запятыми пар
<literal><replaceable>ключ</replaceable> =&gt; <replaceable>значение</replaceable></literal>.
</para>
@ -42,10 +42,10 @@ array(
<!-- Do not fix the whitespace for the synopsis end element. A limitation of PhD prevents proper trimming -->
<para>
Запятая после последнего элемента массива необязательна и её можно опустить.
Обычно это делается для однострочных массивов, — лучше предпочесть <literal>array(1, 2)</literal>
Запятая после последнего элемента массива необязательна; пропуск конечной запятой не вызывает ошибок.
Конечную запятую часто опускают в определениях однострочных массивов, — лучше предпочесть <literal>array(1, 2)</literal>
вместо <literal>array(1, 2, )</literal>. Для многострочных массивов, наоборот,
обычно указывают висящую запятую, так как упрощает добавление
часто указывают конечную запятую, поскольку это упрощает добавление
новых элементов в конец массива.
</para>
@ -62,17 +62,19 @@ array(
<![CDATA[
<?php
$array = array(
$array1 = array(
"foo" => "bar",
"bar" => "foo",
);
// Работа с коротким синтаксисом массива
$array = [
$array2 = [
"foo" => "bar",
"bar" => "foo",
];
var_dump($array1, $array2);
?>
]]>
</programlisting>
@ -89,12 +91,12 @@ $array = [
<itemizedlist>
<listitem>
<simpara>
Строки (<type>string</type>), содержащие целое число (<type>int</type>)
(исключая случаи, когда перед числом указывают знак <literal>+</literal>),
будут преобразованы в целое число (<type>int</type>).
Например, ключ со значением <literal>«8»</literal> сохранится
со значением <literal>8</literal>. При этом, значение <literal>«08»</literal>
не преобразуется, так как оно — не корректное десятичное целое.
Строки (<type>string</type>), которые содержат целое число (<type>int</type>)
(исключая случаи, в которых перед числом указывают знак <literal>+</literal>),
преобразуются в целое число (<type>int</type>).
Например, ключ со значением <literal>"8"</literal> сохранится
со значением <literal>8</literal>. При этом, значение <literal>"08"</literal>
не преобразуется, поскольку значение не относится к корректным десятичным целым.
</simpara>
</listitem>
<listitem>
@ -123,16 +125,15 @@ $array = [
<listitem>
<simpara>
Массивы (<type>array</type>) и объекты (<type>object</type>) <emphasis>нельзя</emphasis>
указывать как ключи. Это
сгенерирует предупреждение: <literal>Недопустимый тип смещения (Illegal offset type)</literal>.
указывать как ключи. Это сгенерирует предупреждение: <literal>Недопустимый тип смещения (Illegal offset type)</literal>.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Если нескольким элементам в объявлении массива указан одинаковый ключ, то только
последний будет сохранён, а другие будут перезаписаны.
PHP перезаписывает значение элемента, если встречает в объявлении массива
повтор одного и того же ключа, поэтому в массиве остается только последний такой элемент.
</para>
<example>
@ -281,7 +282,7 @@ array(4) {
]]>
</screen>
<para>
Видно, что последнее значение <literal>«d»</literal> присвоилось ключу
Видно, что последнее значение <literal>"d"</literal> присвоилось ключу
<literal>7</literal>. Это произошло потому, что перед этим
самым большим значением целочисленного ключа было <literal>6</literal>.
</para>
@ -397,7 +398,7 @@ array(2) {
<title>Доступ к элементам массива через синтаксис квадратных скобок</title>
<para>
Доступ к элементам массива разрешено получать, используя синтакс <literal>array[key]</literal>.
Доступ к элементам массива получают синтаксисом <literal>array[key]</literal>.
</para>
<example>
@ -448,12 +449,15 @@ string(3) "foo"
<![CDATA[
<?php
function getArray() {
function getArray()
{
return array(1, 2, 3);
}
$secondElement = getArray()[1];
var_dump($secondElement);
?>
]]>
</programlisting>
@ -521,32 +525,36 @@ $secondElement = getArray()[1];
</note>
<para>
Для изменения конкретного значения элементу просто присваивают новое значение,
указывая его ключ. Если нужно удалить пару ключ/значение, необходимо
вызывать конструкцию <function>unset</function>.
Для изменения конкретного значения указывают ключ элемента и присваивают новое значение.
Пару «ключ — значение» удаляют языковой конструкцией <function>unset</function>.
</para>
<informalexample>
<example>
<title>Работа с массивами через квадратные скобки</title>
<programlisting role="php">
<![CDATA[
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // В этом месте скрипта это
// то же самое, что и $arr[13] = 56;
$arr[] = 56; // В этом месте скрипта такое аналогично
// присваиванию $arr[13] = 56;
$arr["x"] = 42; // Это добавляет в массив новый
// элемент с ключом «x»
$arr["x"] = 42; // Добавление в массив нового
// элемента с ключом "x"
unset($arr[5]); // Это удаляет элемент из массива
unset($arr[5]); // Удаление элемента из массива
var_dump($arr);
unset($arr); // Это удаляет весь массив
var_dump($arr);
?>
]]>
</programlisting>
</informalexample>
</example>
<note>
<para>
@ -628,28 +636,30 @@ Array
для деструктуризации массива на отдельные переменные.
</para>
<informalexample>
<example>
<title>Деструктуризация массива</title>
<programlisting role="php">
<![CDATA[
<?php
$source_array = ['foo', 'bar', 'baz'];
[$foo, $bar, $baz] = $source_array;
echo $foo; // выведет «foo»
echo $bar; // выведет «bar»
echo $baz; // выведет «baz»
echo $foo, PHP_EOL; // Выведет "foo"
echo $bar, PHP_EOL; // Выведет "bar"
echo $baz, PHP_EOL; // Выведет "baz"
?>
]]>
</programlisting>
</informalexample>
</example>
<para>
Деструктуризацию массива также выполняют в конструкции &foreach;
для деструктуризации многомерного массива во время итерации по массиву.
</para>
<informalexample>
<example>
<title>Деструктуризация массива в конструкции foreach</title>
<programlisting role="php">
<![CDATA[
<?php
@ -658,21 +668,23 @@ $source_array = [
[1, 'John'],
[2, 'Jane'],
];
foreach ($source_array as [$id, $name]) {
// логика работы с $id и $name
echo "{$id}: '{$name}'\n";
}
?>
]]>
</programlisting>
</informalexample>
</example>
<para>
Элементы массива будут проигнорированы, если переменная не указана.
Деструктуризация проигнорирует элементы массива, для которых не указали переменную.
Деструктуризация массива начинается с индекса <literal>0</literal>.
</para>
<informalexample>
<example>
<title>Игнорирование элементов</title>
<programlisting role="php">
<![CDATA[
<?php
@ -682,48 +694,50 @@ $source_array = ['foo', 'bar', 'baz'];
// Присваивание элемента с индексом 2 переменной $baz
[, , $baz] = $source_array;
echo $baz; // выведет "baz"
echo $baz; // Выведет "baz"
?>
]]>
</programlisting>
</informalexample>
</example>
<para>
С PHP 7.1.0 ассоциативные массивы также разрешено деструктурировать.
Это упрощает выбор нужного элемента в массивах с числовым индексом,
так как индекс может быть указан явно.
Начиная с PHP 7.1.0 поддерживается деструктуризация ассоциативных массивов.
Это упрощает выбор элемента в массивах с числовым индексом,
поскольку разрешает явно указать индекс.
</para>
<informalexample>
<example>
<title>Деструктуризация ассоциативных массивов</title>
<programlisting role="php">
<![CDATA[
<?php
$source_array = ['foo' => 1, 'bar' => 2, 'baz' => 3];
// Присваивание элемента с индексом «baz» переменной $three
// Присваивание элемента с индексом 'baz' переменной $three
['baz' => $three] = $source_array;
echo $three; // выведет 3
echo $three, PHP_EOL; // Выведет 3
$source_array = ['foo', 'bar', 'baz'];
// Присваивание элемента с индексом 2 переменной $baz
[2 => $baz] = $source_array;
echo $baz; // выведет «baz»
echo $baz, PHP_EOL; // Выведет "baz"
?>
]]>
</programlisting>
</informalexample>
</example>
<para>
Деструктуризацией массива пользуются, чтобы поменять две переменные местами.
</para>
<informalexample>
<example>
<title>Перестановка двух переменных</title>
<programlisting role="php">
<![CDATA[
<?php
@ -731,13 +745,13 @@ echo $baz; // выведет «baz»
$a = 1;
$b = 2;
[$b, $a] = [$a, $b];
echo $a; // выведет 2
echo $b; // выведет 1
echo $a, PHP_EOL; // Выведет 2
echo $b, PHP_EOL; // Выведет 1
?>
]]>
</programlisting>
</informalexample>
</example>
<note>
<para>
@ -770,35 +784,39 @@ echo $b; // выведет 1
<para>
Языковая конструкция <function>unset</function> умеет удалять ключи массива.
Обратите внимание, что массив <emphasis>НЕ</emphasis>
будет переиндексирован. Если нужно поведение в стиле
«удалить и сдвинуть», можно переиндексировать массив
функцией <function>array_values</function>.
переиндексируется. Массив переиндексируют функцией <function>array_values</function>,
если требуется поведение в стиле «удалить и сдвинуть».
</para>
<informalexample>
<example>
<title>Удаление промежуточных элементов</title>
<programlisting role="php">
<![CDATA[
<?php
$a = array(1 => 'один', 2 => 'два', 3 => 'три');
unset($a[2]);
/* даст массив, представленный так:
/* Удаление элемента изменит массив так, как если бы его определили так:
$a = array(1 => 'один', 3 => 'три');
а НЕ так:
но НЕ так:
$a = array(1 => 'один', 2 => 'три');
*/
unset($a[2]);
var_dump($a);
$b = array_values($a);
// Теперь $b это array(0 => 'один', 1 => 'три')
// Теперь переменная $b содержит array(0 => 'один', 1 => 'три')
var_dump($b);
?>
]]>
</programlisting>
</informalexample>
</example>
</note>
<para>
Управляющая конструкция &foreach; существует специально для массивов.
Она предлагает простой способ перебора массива.
Управляющая конструкция &foreach; появилась в языке для перебора массивов.
Конструкция предлагает простой способ обхода массива.
</para>
</sect2>
@ -812,7 +830,7 @@ $b = array_values($a);
<para>
Рекомендовано заключать в кавычки строковый литерал в индексе ассоциативного массива.
Например, нужно писать <literal>$foo['bar']</literal>, а не
<literal>$foo[bar]</literal>. Но почему? Часто в старых скриптах можно встретить
<literal>$foo[bar]</literal>. Но почему? Часто в старых скриптах встречается
следующий синтаксис:
</para>
@ -831,14 +849,14 @@ echo $foo[bar];
</informalexample>
<para>
Это неверно, хотя и работает. Причина в том, что этот код содержит неопределённую
константу (<literal>bar</literal>), а не строку (<literal>'bar'</literal> — обратите внимание
на кавычки). Это работает, потому что PHP автоматически преобразовывает
<emphasis>«голую строку»</emphasis> (не заключённую в кавычки строку,
которая не соответствует ни одному из известных символов языка) в строку
со значением этой «голой строки». Например, если константа с именем <constant>bar</constant>
не определена, то PHP заменит bar на
строку <literal>«bar»</literal> и будет работать с ней.
Это неверно, хотя и работает. Причина состоит в том, что этот код содержит неопределённую
константу <literal>bar</literal>), а не строку (<literal>'bar'</literal> — обратите внимание
на кавычки. Это работает, потому что PHP автоматически преобразовывает
<emphasis>«голую строку»</emphasis> — строка без кавычек,
которая не соответствует ни одному известному символу языка в строку
со значением этой «голой строки». PHP заменит строку bar
на строку <literal>'bar'</literal> и будет работать с ней,
если константу с названием <constant>bar</constant> не определили.
</para>
<warning>
@ -851,17 +869,16 @@ echo $foo[bar];
</simpara>
</warning>
<note>
<simpara>
Это не значит, что нужно <emphasis>всегда</emphasis> заключать
ключ в кавычки. Не обязательно заключать в кавычки <link
linkend="language.constants">константы</link> или <link
linkend="language.variables">переменные</link>, поскольку это
помешает PHP обрабатывать их.
</simpara>
<simpara>
Это не значит, что в кавычки заключают <emphasis>каждый</emphasis> ключ.
В кавычки не берут <link linkend="language.constants">константы</link>
и <link linkend="language.variables">переменные</link>,
поскольку закавычивание помешает интерпретации.
</simpara>
<informalexample>
<programlisting role="php">
<example>
<title>Закавычивание ключей</title>
<programlisting role="php">
<![CDATA[
<?php
@ -884,9 +901,9 @@ for ($i = 0; $i < $count; $i++) {
?>
]]>
</programlisting>
</informalexample>
</example>
&example.outputs;
<screen>
<screen>
<![CDATA[
Проверяем 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
@ -904,14 +921,14 @@ Notice: Undefined index: $i in /path/to/script.html on line 11
Плохо:
Хорошо: 2
]]>
</screen>
</note>
</screen>
<para>
Дополнительные примеры, которые подтверждают этот факт:
</para>
<informalexample>
<example>
<title>Дополнительные примеры</title>
<programlisting role="php">
<![CDATA[
<?php
@ -922,47 +939,52 @@ error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Верно
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
echo $arr['fruit'], PHP_EOL; // apple
echo $arr['veggie'], PHP_EOL; // carrot
// Неверно. Это работает, но из-за неопределённой константы с
// именем fruit также выдаёт ошибку PHP уровня E_NOTICE
// Неверно. Это работает, но также выбрасывает PHP-ошибку из-за неопределённой константы
// с названием fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// Error: Undefined constant "fruit"
try {
echo $arr[fruit]; // apple
} catch (Error $e) {
echo get_class($e), ': ', $e->getMessage(), PHP_EOL;
}
// Давайте определим константу, чтобы продемонстрировать, что
// происходит. Присвоим константе с именем fruit значение «veggie».
// Определим константу, чтобы посмотреть,
// что произоёдет. Присвоим константе с названием fruit значение "veggie".
define('fruit', 'veggie');
// Теперь обратите внимание на разницу
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
echo $arr['fruit'], PHP_EOL; // apple
echo $arr[fruit], PHP_EOL; // carrot
// Внутри строки это нормально. Внутри строк константы
// не рассматриваются, поэтому ошибка E_NOTICE здесь не возникнет
print "Hello $arr[fruit]"; // Hello apple
// Доступ по ключу без кавычек сработает внутри строки. PHP не ищет константы внутри строк,
// поэтому ошибка уровня E_NOTICE здесь не возникнет
echo "Hello $arr[fruit]", PHP_EOL; // Hello apple
// С одним исключением: фигурные скобки вокруг массивов внутри
// строк допускают константы
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// За одним исключением: PHP интерпретирует константы,
// если обращение к массиву внутри строки обернули фигурными скобками
echo "Hello {$arr[fruit]}", PHP_EOL; // Hello carrot
echo "Hello {$arr['fruit']}", PHP_EOL; // Hello apple
// Ещё один способ — конкатенация
print "Hello " . $arr['fruit']; // Hello apple
// Ещё один способ вывести значение массива — конкатенация
echo "Hello " . $arr['fruit'], PHP_EOL; // Hello apple
?>
]]>
</programlisting>
</informalexample>
</example>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Это не будет работать и вызовет ошибку обработки:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Это, конечно, также действует и с суперглобальными переменными в строках
// Это не сработает и вызовет ошибку разбора наподобие:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'.
// Это относится и к суперглобальным переменным в строках
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
@ -972,18 +994,16 @@ print "Hello $_GET['foo']";
</informalexample>
<para>
Если директива <link linkend="ini.error-reporting">error_reporting</link> настроена
на режим отображения ошибок уровня
<constant>E_NOTICE</constant> (например,
<constant>E_ALL</constant>), ошибки сразу будут видны.
По умолчанию директива <link linkend="ini.error-reporting">
error_reporting</link> настроена на то, чтобы не показывать предупреждения.
При установке для директивы <link linkend="ini.error-reporting">error_reporting</link> значения <constant>E_ALL</constant>,
которое включит также и режим отображения ошибок уровня <constant>E_NOTICE</constant>,
PHP сразу покажет ошибки, которые возникают при неправильном доступе к элементам массива.
Со значением по умолчанию директива <link linkend="ini.error-reporting">error_reporting</link>
не показывает уведомления.
</para>
<para>
Как указано в разделе <link linkend="language.types.array.syntax">о синтаксисе</link>,
внутри квадратных скобок <literal>[</literal>»
и «<literal>]</literal>») должно быть выражение. То есть вот такой код работает:
Как указывает раздел <link linkend="language.types.array.syntax">о синтаксисе</link>,
внутри квадратных скобок '<literal>[</literal>' и '<literal>]</literal>' требуется указывать выражение. Поэтому следующий код работает:
</para>
<informalexample>
@ -1058,7 +1078,7 @@ $error_descriptions[8] = "Это просто уведомление";
<simpara>
Повторим, внутри строки (<type>string</type>)
в двойных кавычках допустимо не окружать индексы
массива кавычками, поэтому <literal>«$foo[bar]»</literal>
массива кавычками, поэтому <literal>"$foo[bar]"</literal>
допустимая запись. В примерах выше объяснено, почему,
дополнительная информация дана в разделе
<link linkend="language.types.string.parsing">об обработке
@ -1094,20 +1114,24 @@ $error_descriptions[8] = "Это просто уведомление";
автоматически отбрасываются.
</para>
<informalexample>
<example>
<title>Преобразование в массив</title>
<programlisting role="php">
<![CDATA[
<?php
class A {
class A
{
private $B;
protected $C;
public $D;
function __construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>
@ -1124,24 +1148,29 @@ array (
)
]]>
</screen>
</informalexample>
</example>
<para>
Это может вызвать несколько неожиданное поведение:
</para>
<informalexample>
<example>
<title>Приведение объекта к массиву</title>
<programlisting role="php">
<![CDATA[
<?php
class A {
private $A; // Это станет '\0A\0A'
class A
{
private $A; // Свойство станет ключом '\0A\0A'
}
class B extends A {
private $A; // Это станет '\0B\0A'
public $AA; // Это станет 'AA'
class B extends A
{
private $A; // Свойство станет ключом '\0B\0A'
public $AA; // Свойство станет ключом 'AA'
}
var_dump((array) new B());
?>
@ -1160,16 +1189,16 @@ array(3) {
}
]]>
</screen>
</informalexample>
</example>
<para>
Приведённый код покажет 2 ключа с именем «AA», хотя один из них на самом деле
имеет имя «\0A\0A».
Приведённый код покажет 2 ключа с названием 'AA', хотя один ключ на самом деле
называется '\0A\0A'.
</para>
<para>
Если преобразовать в массив значение &null;, получится
пустой массив.
Получится пустой массив,
если преобразовать в массив значение &null;.
</para>
</sect2>
@ -1186,14 +1215,14 @@ array(3) {
<title>Распаковка массива</title>
<para>
Массив, перед которым указан оператор <code>...</code>, будет распакован во время определения массива.
Только массивы и объекты, которые реализуют интерфейс
<interfacename>Traversable</interfacename>, разрешено распаковывать.
Массив, перед которым указали оператор <code>...</code>, распакуется во время определения массива.
Распаковка доступна только массивам и объектам, которые реализуют интерфейс
<interfacename>Traversable</interfacename>.
Распаковка массива оператором <code>...</code> доступна начиная с PHP 7.4.0.
</para>
<para>
Массив разрешено распаковывать несколько раз и добавлять обычные элементы до или после оператора <code>...</code>:
PHP поддерживает многократное чередование распаковки и стандартных элементов до или после оператора <code>...</code>:
<example>
<title>Простая распаковка массива</title>
<programlisting role="php">
@ -1212,7 +1241,9 @@ function getArr() {
return ['a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd']
$arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd'];
var_dump($arr1, $arr2, $arr3, $arr4, $arr5, $arr6);
?>
]]>
@ -1221,27 +1252,27 @@ $arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd']
</para>
<para>
Распаковка массива оператором <code>...</code> соблюдает семантику функции <function>array_merge</function>.
То есть более поздние строковые ключи перезаписывают более ранние, а целочисленные ключи перенумеровываются:
Распаковка массива оператором <code>...</code> соблюдает семантику функции <function>array_merge</function>,
поэтому более поздние строковые ключи перезаписывают более ранние, а целочисленные ключи перенумеровываются:
<example>
<title>Распаковка массива с дублирующим ключом</title>
<programlisting role="php">
<![CDATA[
<?php
// строковый ключ
// Строковый ключ
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]
// целочисленный ключ
// Целочисленный ключ
$arr4 = [1, 2, 3];
$arr5 = [4, 5, 6];
$arr6 = [...$arr4, ...$arr5];
var_dump($arr6); // [1, 2, 3, 4, 5, 6]
// Который [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6]
// где исходные целочисленные ключи не были сохранены.
// Распаковка массивов создаёт массив [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6],
// в котором исходные целочисленные ключи не сохранились
?>
]]>
@ -1288,43 +1319,48 @@ $arr6 = [...$arr4, ...$arr5]; // работает. [1, 2, 3, 4, 5]
Массив в PHP — гибкий тип данных. Вот несколько примеров:
</para>
<informalexample>
<example>
<title>Видимость массивов</title>
<programlisting role="php">
<![CDATA[
<?php
// Этот код:
// Код:
$a = array( 'color' => 'красный',
'taste' => 'сладкий',
'shape' => 'круг',
'name' => 'яблоко',
4 // ключом будет 0
4 // PHP назначит элементу ключ 0
);
$b = array('a', 'b', 'c');
// ...эквивалентен этому:
var_dump($a, $b);
// ...эквивалентен следующему коду:
$a = array();
$a['color'] = 'красный';
$a['taste'] = 'сладкий';
$a['shape'] = 'круг';
$a['name'] = 'яблоко';
$a[] = 4; // ключом будет 0
$a[] = 4; // ключом станет 0
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// после выполнения приведённого кода, переменная $a будет массивом
// После выполнения приведённого кода переменная $a станет массивом
// array('color' => 'красный', 'taste' => 'сладкий', 'shape' => 'круг',
// 'name' => 'яблоко', 0 => 4), а переменная $b будет
// array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c').
// 'name' => 'яблоко', 0 => 4), а переменная $b станет массивом
// array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c')
var_dump($a, $b);
?>
]]>
</programlisting>
</informalexample>
</example>
<example>
<title>Вызов языковой конструкции array()</title>
@ -1340,7 +1376,10 @@ $map = array(
'short_tags' => true
);
// строго числовые ключи
var_dump($map);
// Строго числовые ключи,
// что эквивалентно массиву array(0 => 7, 1 => 8, ...)
$array = array(
7,
8,
@ -1348,7 +1387,7 @@ $array = array(
156,
-10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)
var_dump($array);
$switching = array(
10, // ключ = 0
@ -1358,11 +1397,13 @@ $switching = array(
11, // ключ = 6 (максимальным числовым индексом было 5)
'8' => 2, // ключ = 8 (число!)
'02' => 77, // ключ = '02'
0 => 12 // значение 10 будет перезаписано на 12
0 => 12 // значение 10 перезапишется значением 12
);
var_dump($switching);
// пустой массив
$empty = array();
var_dump($empty);
?>
]]>
@ -1411,11 +1452,13 @@ foreach ($colors as $color) {
<![CDATA[
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as &$color) {
$color = mb_strtoupper($color);
}
unset($color); /* это нужно, чтобы очередные записи в
переменной $color не меняли последний элемент массива */
unset($color); /* Переменную удаляют, чтобы очередные записи
в переменной $color не меняли последний элемент массива */
print_r($colors);
@ -1441,12 +1484,12 @@ Array
</para>
<example>
<title>Индекс, начинающийся с единицы</title>
<title>Индексация с единицы</title>
<programlisting role="php">
<![CDATA[
<?php
$firstquarter = array(1 => 'Январь', 'Февраль', 'Март');
$firstquarter = array(1 => 'январь', 'февраль', 'март');
print_r($firstquarter);
?>
@ -1457,9 +1500,9 @@ print_r($firstquarter);
<![CDATA[
Array
(
[1] => 'Январь'
[2] => 'Февраль'
[3] => 'Март'
[1] => 'январь'
[2] => 'февраль'
[3] => 'март'
)
]]>
</screen>
@ -1471,13 +1514,15 @@ Array
<![CDATA[
<?php
// заполняем массив всеми элементами из директории
// Заполняем массив элементами из директории
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
var_dump($files);
?>
]]>
</programlisting>
@ -1486,14 +1531,13 @@ closedir($handle);
<para>
Массивы упорядочены. Порядок изменяют
разными функциями сортировки. Подробнее об этом рассказано
в разделе «<link linkend="ref.array">Функции
для работы с массивами</link>». Для подсчёта количества элементов
в массиве вызывают функцию <function>count</function>.
в разделе «<link linkend="ref.array">Функции для работы с массивами</link>».
Для подсчёта количества элементов в массиве вызывают функцию <function>count</function>.
</para>
<example>
<title>Сортировка массива</title>
<programlisting role="php">
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
@ -1506,9 +1550,8 @@ print_r($files);
</example>
<para>
Поскольку значению массива разрешено быть любым,
значение может быть также другим массивом. Поэтому разрешено создавать
рекурсивные и многомерные массивы.
Массивы поддерживают значения в виде других массивов, поскольку массивы принимают произвольные значения.
Поэтому PHP разрешает создавать рекурсивные и многомерные массивы.
</para>
<example>
@ -1533,14 +1576,16 @@ $fruits = array ( "fruits" => array ( "a" => "апельсин",
"третья"
)
);
var_dump($fruits);
// Несколько примеров доступа к значениям предыдущего массива
echo $fruits["holes"][5]; // напечатает «вторая»
echo $fruits["fruits"]["a"]; // напечатает «апельсин»
unset($fruits["holes"][0]); // удалит «первая»
// Ряд примеров доступа к значениям предыдущего массива
echo $fruits["holes"][5]; // Выведет "вторая"
echo $fruits["fruits"]["a"]; // напечатает "апельсин"
unset($fruits["holes"][0]); // удалит "первая"
// Создаст новый многомерный массив
$juices["apple"]["green"] = "хороший";
var_dump($juices);
?>
]]>
@ -1552,7 +1597,8 @@ $juices["apple"]["green"] = "хороший";
по ссылке, указывают <link linkend="language.operators">оператор присваивания по ссылке</link>.
</para>
<informalexample>
<example>
<title>Копирование массивов</title>
<programlisting role="php">
<![CDATA[
<?php
@ -1565,10 +1611,12 @@ $arr2[] = 4; // Массив $arr2 изменился,
$arr3 = &$arr1;
$arr3[] = 4; // Теперь массивы $arr1 и $arr3 одинаковы
var_dump($arr1, $arr2, $arr3);
?>
]]>
</programlisting>
</informalexample>
</example>
</sect2>
</sect1>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 161dde4fe721309398dd324edbf02aec409f127b Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.boolean">
<title>Логические значения</title>
@ -12,7 +12,7 @@
<sect2 xml:id="language.types.boolean.syntax">
<title>Синтаксис</title>
<para>
Чтобы задать логический литерал <type>bool</type>, указывают константы &true;
Логические литералы — значения с типом <type>bool</type> указывают константами &true;
или &false;. Обе константы регистронезависимы.
</para>
@ -135,7 +135,8 @@ if ($show_separators) {
</simpara>
</warning>
<informalexample>
<example>
<title>Приведение к логическому типу</title>
<programlisting role="php">
<![CDATA[
<?php
@ -153,7 +154,7 @@ var_dump((bool) "false"); // bool(true)
?>
]]>
</programlisting>
</informalexample>
</example>
</sect2>
</sect1>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: c897161ca5a62a887295c695adc161b8fde5d772 Maintainer: rjhdby Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.callable">
<title>Callable как выражение или псевдотип, и callback-функции</title>
@ -70,7 +70,7 @@
// Пример callback-функции
function my_callback_function()
{
echo 'Привет, мир!';
echo "Привет, мир!", PHP_EOL;
}
// Пример callback-метода
@ -78,7 +78,7 @@ class MyClass
{
static function myCallbackMethod()
{
echo 'Привет, мир!';
cho "Привет, мир!", PHP_EOL;
}
}
@ -100,7 +100,7 @@ class A
{
public static function who()
{
echo "A\n";
echo 'A', PHP_EOL;
}
}
@ -108,11 +108,13 @@ class B extends A
{
public static function who()
{
echo "B\n";
echo 'B', PHP_EOL;
}
}
call_user_func(array('B', 'parent::who')); // A, устарело, начиная с PHP 8.2.0
call_user_func(array('B', 'parent::who')); // Выводит: A.
// Начиная с PHP 8.2.0 callable-выражения
// с относительными названиями методов устарели
// Тип 6: Объекты, классы которых реализуют магический метод __invoke(),
// разрешается передавать как callable-объекты
@ -120,7 +122,7 @@ class C
{
public function __invoke($name)
{
echo 'Привет ', $name, "\n";
echo 'Привет, ', $name, PHP_EOL;
}
}

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a1e3d629b4f01ee41bd38391cd5c6ae5ee894cb3 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.float" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Числа с плавающей точкой</title>
@ -27,7 +27,7 @@ $d = 1_234.567; // Начиная с PHP 7.4.0
</informalexample>
<para>
Формально с PHP 7.4.0 (раньше подчёркивания не разрешались):
Поддержка подчёркиваний в числах появилась с PHP 7.4.0:
</para>
<informalexample>
@ -79,9 +79,8 @@ EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
</para>
<para>
«Простое» объяснение даёт <link xlink:href="&url.floating.point.guide;">руководство
по числам с плавающей точкой</link>, которое также называется
«Why dont my numbers add up?» («Почему мои числа не складываются?» — англ.)
«Простое» объяснение даёт <link xlink:href="&url.floating.point.guide;">руководство по числам с плавающей точкой</link>,
которое также называется «Why dont my numbers add up?» («Почему мои числа не складываются?» — англ.)
</para>
</warning>
@ -92,10 +91,9 @@ EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
<title>Из строк</title>
<simpara>
Если строка
<link linkend="language.types.numeric-strings">содержит число</link>
или ведущую числовую последовательность, тогда она будет преобразована в соответствующее значение с плавающей точкой,
в противном случае она преобразуется в ноль (<literal>0</literal>).
<link linkend="language.types.numeric-strings">Числовые строки</link>
или строки с начальной числовой последовательностью преобразовываются в значение с плавающей точкой,
иначе строка преобразуется в целочисленное значение <literal>0</literal>.
</simpara>
</sect3>
@ -103,15 +101,14 @@ EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
<title>Из других типов</title>
<para>
Для значений других типов преобразование выполняется путём преобразования значения сначала в целое число (<type>int</type>), а затем в число с плавающей точкой (<type> float </type>).
Смотрите <link linkend="language.types.integer.casting">Преобразование в целое число</link> для получения
дополнительной информации.
При преобразовании значений других типов в число с плавающей точкой значение вначале преобразовывается в целое число (<type>int</type>),
а затем в число с плавающей точкой (<type>float</type>).
Дополнительную информацию о целочисленном преобразовании даёт раздел «<link linkend="language.types.integer.casting">Преобразование в целое число</link>».
</para>
<note>
<para>
Поскольку определённые типы имеют неопределённое поведение при преобразовании в
целое число (<type>int</type>), то же самое происходит и при преобразовании в
Поскольку поведение отдельных типов при преобразовании в тип <type>int</type>, то же самое происходит и при преобразовании в
число с плавающей точкой (<type>float</type>).
</para>
</note>
@ -122,27 +119,30 @@ EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
<title>Сравнение чисел с плавающей точкой</title>
<para>
Как указано выше, проверять числа с плавающей точкой на равенство
проблематично из-за их внутреннего представления.
Тем не менее, существуют способы для их сравнения, которые работают
несмотря на все эти ограничения.
Как отмечалось в предыдущем предупреждении, проверка чисел с плавающей точкой на равенство
даёт сомнительные результаты из-за ограничений внутреннего представления таких чисел,
однако PHP поддерживает способы сравнения чисел с плавающей точкой,
которые обходят эти ограничения.
</para>
<para>
Для сравнения чисел с плавающей точкой используется верхняя граница
относительной ошибки при округлении. Эта величина называется
машинной эпсилон или единицей округления (unit roundoff) и
представляет собой самую маленькую допустимую разницу при расчётах.
машинной эпсилон или единицей округления (unit roundoff)
и представляет собой самую маленькую допустимую разницу при расчётах.
</para>
<informalexample>
<simpara>
<varname>$a</varname> и <varname>$b</varname> равны до 5-ти
знаков после точки.
</simpara>
<para>
Числа <varname>$a</varname> и <varname>$b</varname> равны до 5-ти
знаков после точки.
</para>
<example>
<title>Сравнение чисел с плавающей точкой</title>
<programlisting role="php">
<![CDATA[
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
@ -150,10 +150,11 @@ $epsilon = 0.00001;
if (abs($a - $b) < $epsilon) {
echo "true";
}
?>
]]>
</programlisting>
</informalexample>
</example>
</sect2>
<sect2 xml:id="language.types.float.nan">

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8859c8b96cd9e80652813f7bcf561432a5e9f934 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.integer">
<title>Целые числа</title>
@ -51,7 +51,7 @@
<example>
<title>Целые числа</title>
<programlisting role="php">
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
@ -144,19 +144,20 @@ var_dump(PHP_INT_MAX + 1); // В 32-разрядной системе syst
но лучше предпочесть функцию <function>round</function>, которая точнее контролирует округление.
</para>
<informalexample>
<example>
<title>Деление</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
var_dump(25 / 7); // float(3.5714285714286)
var_dump((int) (25 / 7)); // int(3)
var_dump(round(25 / 7)); // float(4)
?>
]]>
</programlisting>
</informalexample>
</example>
</sect2>
<sect2 xml:id="language.types.integer.casting">
@ -202,7 +203,9 @@ var_dump(round(25/7)); // float(4)
в целое число (&integer;), которое теряет точность, PHP выдаёт уведомление об устаревании.
</simpara>
<programlisting role="php">
<example>
<title>Приведение из числа с плавающей точкой</title>
<programlisting role="php">
<![CDATA[
<?php
@ -220,10 +223,11 @@ var_dump(intval(8.1)); // 8 в обоих случаях
?>
]]>
</programlisting>
</programlisting>
</example>
<para>
Результат будет неопределённым, если число с плавающей точкой превышает размеры
Приведение выдаст неопределённый реузльтат, если число с плавающей точкой превышает размеры
типа <type>int</type> (обычно <literal>­± 2.15e+9 = 2^31</literal> на 32-битных системах
и <literal>± 9.22e+18 = 2^63</literal> на 64-битных системах),
поскольку у типа <type>float</type> нет достаточной точности,

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 161dde4fe721309398dd324edbf02aec409f127b Maintainer: rjhdby Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.iterable">
<title>Итерируемые значения</title>
@ -14,8 +14,8 @@
<note>
<para>
Функциям, которые объявляют в качестве возвращаемого типа iterable,
также разрешено быть <link linkend="language.generators">генераторами</link>.
Функции, которые объявляют iterable как тип возврата,
поддерживают также и выдачу <link linkend="language.generators">генератора</link>.
<example>
<title>
Пример возвращаемого типа итерируемого генератора
@ -30,6 +30,10 @@ function gen(): iterable {
yield 3;
}
foreach (gen() as $value) {
echo $value, "\n";
}
?>
]]>
</programlisting>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 7ba2406e555a240338d63f72d9ac54a46e0bee5d Maintainer: rjhdby Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Числовые строки</title>
@ -27,26 +27,30 @@ NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
</informalexample>
<para>
В PHP также присутствует концепция <emphasis>префиксной</emphasis> числовой строки.
В PHP также поддерживается концепция <emphasis>префиксной</emphasis> числовой строки.
Это строка, которая начинается как числовая и продолжается любыми другими символами.
</para>
<note>
<para>
Строка, которая содержит букву <literal>E</literal> (без учёта регистра),
ограниченную цифрами, будет восприниматься как число, которое выразили в научной нотации.
Это приводит к неожиданным результатам.
ограниченную цифрами, воспринимается как число, которое выразили в научной нотации.
Поведение при сравнении строк с числами в научной нотации иногда кажется неожиданным.
</para>
<example>
<title>Сравнение строк с числами в научной нотации</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // false, «0D1» — не научная нотация
var_dump("0E1" == "000"); // true, «0E1» — это 0 * (10 ^ 1) или 0
var_dump("2E1" == "020"); // true, «2E1» — это 2 * (10 ^ 1) или 20
var_dump("0D1" == "000"); // false, "0D1" — не научная нотация
var_dump("0E1" == "000"); // true, "0E1" интерпретируется как выражение 0 * (10 ^ 1), которое равно значению 0
var_dump("2E1" == "020"); // true, "2E1" интерпретируется как выражение 2 * (10 ^ 1), которое равно значению 20
?>
]]>
</programlisting>
</para>
</example>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
@ -57,26 +61,25 @@ var_dump("2E1" == "020"); // true, «2E1» — это 2 * (10 ^ 1) или 20
<orderedlist>
<listitem>
<simpara>
Если строка числовая, представляет целое число и не превышает максимально
допустимого значения для типа <type>int</type>, которое опеределяет
константа <constant>PHP_INT_MAX</constant>, то строка приводится к типу <type>int</type>.
Иначе строка приводится к типу <type>float</type>.
</simpara>
</listitem>
<listitem>
<simpara>
Если в заданном контексте разрешается использовать префиксную числовую строку,
то, если начало строки представляет целое число и не превышает максимально
Строка приводится к типу <type>int</type>, если строка числовая, представляет целое число и не превышает максимально
допустимого значения для типа <type>int</type>, которое определяет
константа <constant>PHP_INT_MAX</constant>, строка приводится к типу <type>int</type>.
Иначе строка приводится к типу <type>float</type>.
В таких случаях также выдаётся ошибка уровня <constant>E_WARNING</constant>.
константа <constant>PHP_INT_MAX</constant>, иначе строка приводится к типу <type>float</type>.
</simpara>
</listitem>
<listitem>
<simpara>
Если строка не числовая — выбрасывается исключение
<classname>TypeError</classname>.
Тип <type>string</type> приводится к типу <type>int</type>, если контекст разрешает строки,
которые начинаются с числа, и значение <type>string</type>
начинается с целочисленной числовой части, которая не превышает значение константы <constant>PHP_INT_MAX</constant>,
которая определяет в PHP наибольшее значение для типа <type>int</type>,
иначе строка разрешается
в тип <type>float</type> и дополнительно выдаёт ошибку
уровня <constant>E_WARNING</constant>.
</simpara>
</listitem>
<listitem>
<simpara>
Для нечисловых строк выбрасывается ошибка <classname>TypeError</classname>.
</simpara>
</listitem>
</orderedlist>
@ -87,13 +90,12 @@ var_dump("2E1" == "020"); // true, «2E1» — это 2 * (10 ^ 1) или 20
<title>Поведение до PHP 8.0.0</title>
<para>
До PHP 8.0.0 строка считалась числовой, только если она
<emphasis>начиналась</emphasis> с пробельных символов. Если строка
<emphasis>завершалась</emphasis> пробельными символами
PHP считал строку префиксной числовой.
<emphasis>начиналась</emphasis> с пробельных символов. PHP считал строку префиксной числовой,
если строка <emphasis>завершалась</emphasis> пробельными символами.
</para>
<para>
До PHP 8.0.0, когда строку требовалось использовать как число, применялся приведённый алгоритм,
До PHP 8.0.0 при работе со строкой как с числом применялся приведённый алгоритм,
но с рядом отличий:
<itemizedlist>
<listitem>
@ -104,7 +106,7 @@ var_dump("2E1" == "020"); // true, «2E1» — это 2 * (10 ^ 1) или 20
</listitem>
<listitem>
<simpara>
Если строка не была числовой, вызывалась ошибка уровня <constant>E_WARNING</constant>,
Нечисловые строки вызывали ошибку уровня <constant>E_WARNING</constant>,
а сама строка приводилась к числу <literal>0</literal>.
</simpara>
</listitem>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4c4b82965384d55f5c3efb1ffa80615acd98a737 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.object">
<title>Объекты</title>
@ -12,7 +12,8 @@
<literal>new</literal>, которое создаёт в переменной экземпляр класса:
</para>
<informalexample>
<example>
<title>Создание объекта</title>
<programlisting role="php">
<![CDATA[
<?php
@ -25,13 +26,13 @@ class foo
}
}
$bar = new foo;
$bar = new foo();
$bar->do_foo();
?>
]]>
</programlisting>
</informalexample>
</example>
<simpara>
Полное рассмотрение производит раздел «<link linkend="language.oop5">Классы и объекты</link>».
@ -54,37 +55,42 @@ $bar->do_foo();
появляется только при итерации объекта.
</para>
<informalexample>
<example>
<title>Приведение к объекту</title>
<programlisting role="php">
<![CDATA[
<?php
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // С PHP 7.2.0 функция выводит 'bool(true)'; раньше выводила 'bool(false)'
var_dump(key($obj)); // С PHP 7.2.0 функция выводит 'string(1) "1"'; раньше выводила 'int(1)'
var_dump(isset($obj->{'1'})); // Выводит 'bool(true)'
// Начиная с PHP 8.1 вызов функции key() на объектах устарел
var_dump(key($obj)); // Выводит 'string(1) "1"'
?>
]]>
</programlisting>
</informalexample>
</example>
<para>
Остальные значения при преобразовании PHP поместит
в переменную-член объекта с именем <literal>scalar</literal> с исходным типом значения.
в переменную-член объекта с названием <literal>scalar</literal> с исходным типом значения.
</para>
<informalexample>
<example>
<title>Преобразование в объект через приведение типа <literal>(object)</literal></title>
<programlisting role="php">
<![CDATA[
<?php
$obj = (object) 'Привет';
echo $obj->scalar; // Выведет 'Привет'
echo $obj->scalar; // Выводит 'Привет'
?>
]]>
</programlisting>
</informalexample>
</example>
</sect2>
</sect1>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 22583751fbfdaa3eaa41aeb6470d1343f5cb2c78 Maintainer: shein Status: ready -->
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.type-juggling">
<title>Жонглирование типами</title>
@ -62,11 +62,11 @@
<simpara>
В этом контексте оба операнда интерпретируются как число с плавающей точкой (<type>float</type>)
и результатом будет число с плавающей точкой (<type>float</type>),
и результатом станет число с плавающей точкой (<type>float</type>),
если один из операндов — число с плавающей точкой (<type>float</type>)
(или не интерпретируется как целое число (<type>int</type>)).
В противном случае операнды интерпретируются как целое число (<type>int</type>)
и результатом также будет целое число (<type>int</type>).
и результатом также станет целое число (<type>int</type>).
С PHP 8.0.0 выбрасывается исключение <classname>TypeError</classname>,
если не получается интерпретировать хотя бы один операнд.
</simpara>
@ -82,9 +82,9 @@
</simpara>
<simpara>
В этом контексте значение будет интерпретироваться как строка (<type>string</type>).
Выбрасывается исключение <classname>TypeError</classname>,
если значение не получается интерпретировать.
В этом контексте значение интерпретируется как значение <type>string</type>.
PHP выбросит ошибку <classname>TypeError</classname>,
если не получится интерпретировать значение.
До версии PHP 7.4.0 выдавалась ошибка уровня <constant>E_RECOVERABLE_ERROR</constant>.
</simpara>
</sect2>
@ -112,11 +112,11 @@
</simpara>
<simpara>
В этом контексте результатом будет строка (<type>string</type>),
если тип всех операндов — строка (<type>string</type>).
В противном случае операнды интерпретируются как целое число (<type>int</type>)
и результатом также будет целое число (<type>int</type>).
С PHP 8.0.0 выбрасывается исключение <classname>TypeError</classname>,
В этом контексте результатом станет значение <type>string</type>,
если каждый операнд принадлежит типу <type>string</type>,
иначе операнды интерпретируются как значения <type>int</type>
и результатом также становится тип <type>int</type>.
Начиная с версии 8.0.0 PHP выбрасывает ошибку <classname>TypeError</classname>,
если не получается интерпретировать хотя бы один операнд.
</simpara>
</sect2>
@ -264,7 +264,7 @@
<para>
Типы, которые не входят в список предпочтений, не станут целями
для неявного приведения. Говоря конкретнее, никакого неявного приведения к типам
<type>null</type>, <type>false</type> и <type>true</type> не будет.
<type>null</type>, <type>false</type> и <type>true</type> не выполняется.
</para>
</note>
@ -314,18 +314,21 @@ true --> 1 // Тип bool совместим с типом int
преобразовывается.
</simpara>
<informalexample>
<example>
<title>Приведение типа</title>
<programlisting role="php">
<![CDATA[
<?php
$foo = 10; // Переменная $foo целое число
$bar = (bool) $foo; // Переменная $bar логическое значение
$foo = 10; // Переменная $foo содержит целое число
$bar = (bool) $foo; // Переменная $bar содержит логическое значение
var_dump($bar);
?>
]]>
</programlisting>
</informalexample>
</example>
<simpara>
Разрешены следующие приведения типов:
@ -413,31 +416,30 @@ $binary = b"binary string";
</programlisting>
</informalexample>
<note>
<simpara>
Вместо приведения переменной к строке (<type>string</type>)
переменную берут в двойные кавычки.
</simpara>
<simpara>
Вместо приведения переменной к типу <type>string</type>
переменную берут в двойные кавычки.
</simpara>
<informalexample>
<programlisting role="php">
<example>
<title>Механизмы приведения к строке</title>
<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 "они одинаковые";
echo "они одинаковые", PHP_EOL;
}
?>
]]>
</programlisting>
</informalexample>
</note>
</programlisting>
</example>
<para>
Не всегда ясно, что произойдет при приведении между конкретными типами.
@ -463,19 +465,20 @@ if ($fst === $str) {
в массивах (<type>array</type>), следующий пример справедлив для всех версий PHP:
</simpara>
<informalexample>
<example>
<title>Работа с символами строки по индексу</title>
<programlisting role="php">
<![CDATA[
<?php
$a = 'car'; // Переменная $a строка
$a[0] = 'b'; // Переменная $a по-прежнему строка
$a = 'car'; // Переменная $a содержит строку
$a[0] = 'b'; // Переменная $a по-прежнему содержит строку
echo $a; // Выводит: bar
?>
]]>
</programlisting>
</informalexample>
</example>
<simpara>
Дополнительную информацию даёт раздел