-
Notifications
You must be signed in to change notification settings - Fork 79
Expand file tree
/
Copy pathtype-system.xml
More file actions
227 lines (213 loc) · 8.8 KB
/
type-system.xml
File metadata and controls
227 lines (213 loc) · 8.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f908fff129bcd8ec1605658e06457cb04e5b2b51 Maintainer: sergey Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.type-system">
<title>Система типов</title>
<para>
Язык PHP использует систему номинальных типов с сильным отношением поведенческого подтипирования.
PHP проверяет отношение подтипов во время компиляции,
тогда как контроль типов язык выполняет динамически во время выполнения.
</para>
<para>
Система типов данных в PHP поддерживает атомарные типы,
которые разрешено объединять, чтобы создавать сложные типы.
Часть этих типов допустимо записывать
в <link linkend="language.types.declarations">объявлениях типов</link>.
</para>
<sect2 xml:id="language.types.type-system.atomic">
<title>Атомарные типы</title>
<para>
Отдельные атомарные типы — встроенные типы,
которые тесно интегрированы с языком и которые невозможно воспроизвести
пользовательским определением типов.
</para>
<para>
Список базовых типов:
<itemizedlist>
<listitem>
<simpara>Встроенные типы</simpara>
<itemizedlist>
<listitem>
<simpara>
Скалярные типы:
</simpara>
<itemizedlist>
<listitem>
<simpara><type>bool</type></simpara>
</listitem>
<listitem>
<simpara><type>int</type></simpara>
</listitem>
<listitem>
<simpara><type>float</type></simpara>
</listitem>
<listitem>
<simpara><type>string</type></simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara><type>array</type></simpara>
</listitem>
<listitem>
<simpara><type>object</type></simpara>
</listitem>
<listitem>
<simpara><type>resource</type></simpara>
</listitem>
<listitem>
<simpara><type>never</type></simpara>
</listitem>
<listitem>
<simpara><type>void</type></simpara>
</listitem>
<listitem>
<simpara>
«<link linkend="language.types.relative-class-types">Относительные типы классов</link>»:
<type>self</type>, <type>parent</type> и <type>static</type>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="language.types.singleton">Одноэлементные типы</link>
</simpara>
<itemizedlist>
<listitem>
<simpara><type>false</type></simpara>
</listitem>
<listitem>
<simpara><type>true</type></simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara>
Объединение типов
</simpara>
<itemizedlist>
<listitem>
<simpara><type>null</type></simpara>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara>
Определяемые пользователем типы (часто называемые класс-типами)
</simpara>
<itemizedlist>
<listitem>
<simpara><link linkend="language.oop5.interfaces">Интерфейсы</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.oop5.basic.class">Классы</link></simpara>
</listitem>
<listitem>
<simpara><link linkend="language.types.enumerations">Перечисления</link></simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara><type>callable</type></simpara>
</listitem>
</itemizedlist>
</para>
<sect3 xml:id="language.types.type-system.atomic.scalar">
<title>Скалярные типы</title>
<simpara>
PHP считает значение скалярным, если значение принадлежит типу <type>int</type>,
<type>float</type>, <type>string</type> или <type>bool</type>.
</simpara>
</sect3>
<sect3 xml:id="language.types.type-system.atomic.user-defined">
<title>Пользовательские типы</title>
<simpara>
Язык разрешает определять пользовательские типы данных через
<link linkend="language.oop5.interfaces">интерфейсы</link>,
<link linkend="language.oop5.basic.class">классы</link>
и <link linkend="language.types.enumerations">перечисления</link>.
PHP рассматривает пользовательские типы как типы классов.
Приведём пример. Язык разрешает определить класс с названием <literal>Elephant</literal>,
затем создать объект с типом <literal>Elephant</literal>,
а потом определить функцию с параметром, который ждёт аргумент с типом <literal>Elephant</literal>.
</simpara>
</sect3>
</sect2>
<sect2 xml:id="language.types.type-system.composite">
<title>Составные типы</title>
<para>
Возможно объединение нескольких атомарных типов в составные типы.
PHP разрешает объединять типы следующими способами:
</para>
<itemizedlist>
<listitem>
<simpara>
Пересечение класс-типов (интерфейсов и названий классов).
</simpara>
</listitem>
<listitem>
<simpara>
Объединение типов.
</simpara>
</listitem>
</itemizedlist>
<sect3 xml:id="language.types.type-system.composite.intersection">
<title>Пересечение типов</title>
<para>
Пересечение типов принимает значения, которые удовлетворяют не одному,
а одновременно нескольким объявлениям класс-типов.
Отдельные пересекающиеся типы соединяются символом <literal>&</literal>.
Поэтому пересечение типов <literal>T</literal>, <literal>U</literal> и <literal>V</literal>
записывает как <literal>T&U&V</literal>.
</para>
</sect3>
<sect3 xml:id="language.types.type-system.composite.union">
<title>Объединение типов</title>
<para>
Объединение типов принимает значения нескольких отличающихся типов, а не одного.
Отдельные объединяемые типы соединяются символом <literal>|</literal>.
Поэтому объединение типов <literal>T</literal>, <literal>U</literal> и <literal>V</literal>,
будет записано как <literal>T|U|V</literal>.
Если при объединении типов добавляют пересечение типов,
то пересечение типов берут в скобки для записи
в дизъюнктивной нормальной форме (DNF): <literal>T|(X&Y)</literal>.
</para>
</sect3>
</sect2>
<sect2 xml:id="language.types.type-system.alias">
<title>Псевдонимы типов</title>
<para>
PHP поддерживает два псевдонима типов: <type>mixed</type> и
<type>iterable</type>, которые соответствуют (в том же порядке)
<link linkend="language.types.type-system.composite.union">объединению типов</link>
<literal>object|resource|array|string|float|int|bool|null</literal>
и <literal>Traversable|array</literal>.
</para>
<note>
<simpara>
PHP не поддерживает определяемые пользователем псевдонимы типов.
</simpara>
</note>
</sect2>
</sect1>
<!-- 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
-->