-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathtutorial.xml
More file actions
432 lines (415 loc) · 23.2 KB
/
tutorial.xml
File metadata and controls
432 lines (415 loc) · 23.2 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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 876557ae38f6ca5035618f7cea48ca627118b437 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="tutorial" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<info><title>Простой учебник</title></info>
<para>
Это краткое и простое руководство показывает только основы PHP.
Текст рассказывает, только как создавать динамические
веб-страницы на PHP, хотя PHP умеет больше.
Раздел «<link linkend="intro-whatcando">Что умеет PHP</link>»
даёт дополнительную информацию.
</para>
<para>
Веб-страницы с поддержкой PHP обрабатываются аналогично
HTML-страницам: PHP-страницы создают и редактируют аналогично
страницам на языке HTML-разметки.
</para>
<section xml:id="tutorial.firstpage">
<info><title>Первая страница на PHP</title></info>
<simpara>
Вначале потребуется установить PHP.
Инструкция по установке доступна
<link xlink:href="&url.php.downloads;">на странице загрузки</link>.
</simpara>
<para>
Теперь создадим файл с названием <filename>hello.php</filename>
и напишем внутри следующий код:
</para>
<para>
<example>
<title>Первый скрипт на PHP: <filename>hello.php</filename></title>
<programlisting role="php">
<![CDATA[
<?php
echo "Привет, мир!";
]]>
</programlisting>
<simpara>
В терминале перейдём в каталог, в котором содержится файл,
и запустим сервер разработки следующей командой:
</simpara>
<programlisting role="shell">
<![CDATA[
php -S localhost:8000
]]>
</programlisting>
<simpara>
Для доступа к файлу в браузере указывают URL-адрес,
который состоит из адреса веб-сервера и ссылки на файл: <literal>/hello.php</literal>.
Из команды, которую выполнили на предыдущем шаге, возьмём адрес веб-сервера и построим полный URL-адрес:
<literal>http://localhost:8000/hello.php</literal>.
При правильной конфигурации PHP обработает файл,
а браузер покажет вывод: "Привет, мир!".
</simpara>
<simpara>
PHP-интерпретатор умеет генерировать веб-страницы из исходного кода, в котором PHP-код встроили в HTML-разметку.
Поэтому PHP-инструкции записывают непосредственно внутри разметки будущего HTML-документа, как показывает следующий пример:
</simpara>
<programlisting role="php">
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>Тестируем PHP</title>
</head>
<body>
<?php echo '<p>Привет, мир!</p>'; ?>
</body>
</html>
]]>
</programlisting>
<simpara>
Код сгенерирует следующий HTML-вывод:
</simpara>
<screen role="html">
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>Тестируем PHP</title>
</head>
<body>
<p>Привет, мир!</p>
</body>
</html>
]]>
</screen>
</example>
</para>
<para>
Эта программа чрезвычайно проста, и чтобы создать настолько простую
страницу, даже не обязательно запускать и писать код на PHP. Единственное, что делает программа, —
выводит строку <literal>Привет, мир!</literal> PHP-инструкцией
<function>echo</function>. Заметьте, что файл <emphasis>не требуется делать исполняемым</emphasis>
или ещё каким-то образом отличаться от других файлов.
Сервер знает, что этот файл требуется интерпретировать средствами PHP, поскольку
расширение файла — ".php", которое сервер настроен передавать PHP.
О PHP-файле думают как об обычном HTML-файле,
который содержит набор тегов, которые умеют делать много интересного.
</para>
<para>
Цель примера — показать формат PHP-тегов. Тег <literal><?php</literal> обозначает начало
PHP-кода. Затем идёт PHP-инструкция и тег <literal>?></literal>,
который заставляет парсер выйти из режима интерпретации PHP-кода.
Теги указывают в произвольном месте файла, когда требуется переключить режимы интерпретации PHP-кода и анализа HTML-разметки.
Подробнее о разборе исходного кода рассказывает раздел руководства
«<link linkend="language.basic-syntax">Основы синтаксиса</link>».
</para>
<note>
<info><title>Замечание о переводах строк</title></info>
<para>
У переводов строк небольшое значение в HTML-разметке, однако, HTML-разметка
с переносами выглядит аккуратной.
PHP автоматически удаляет переводы строки, которые идут сразу после закрывающего
тега <literal>?></literal>. Это может быть чрезвычайно полезно
при добавлении ряда блоков PHP-кода или при подключении PHP-файлов с PHP-кодом,
который ничего не выводит. Но иногда это сбивает
с толку. Можно поставить пробел после закрывающего тега
<literal>?></literal>, чтобы принудительно вывести пробел и перевод строки,
или можно явно добавить перевод строки в последний вызов
языковых конструкций echo или print из блока PHP-кода.
</para>
</note>
<note>
<info><title>Кратко о текстовых редакторах</title></info>
<para>
PHP-файлы создают и редактируют в текстовых редакторах и интегрированных средах
разработки (IDE). Список отдельных редакторов содержит статья
<link xlink:href="&url.phpeditorlist;">Список PHP-редакторов</link>.
Попросите администратора страницы добавить редактор, который рекомендуете, в список.
Окажется полезным редактор с подсветкой синтаксиса.
</para>
</note>
<note>
<info><title>Кратко о текстовых процессорах</title></info>
<para>
В текстовых процессорах наподобие StarOffice Writer, Microsoft Word и Abiword
неудобно редактировать PHP-файлы. Убедитесь, что сохраняете файл
в формате <emphasis>plain text</emphasis>, если изменяете тестовый скрипт
в таком редакторе, иначе не получится прочитать и выполнить PHP-скрипт.
</para>
</note>
<para>
Теперь, когда узнали основы языка, пора создать самый
знаменитый PHP-скрипт! Вызовите функцию <function>phpinfo</function> и увидите
много полезной информации о системе и настройке, например, доступные
<link linkend="language.variables.predefined">предопределённые переменные</link>,
загруженные PHP-модули и <link linkend="configuration">параметры настройки</link>.
Уделите время изучению этой важной информации.
</para>
<para>
<example>
<info><title>Получение информации о системе средствами PHP</title></info>
<programlisting role="php">
<![CDATA[
<?php
phpinfo();
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="tutorial.useful">
<info><title>Примеры кода</title></info>
<para>
Теперь напишем полезный код и узнаем, в каком браузере
посетитель просматривает страницу. Для этого проверим строку пользовательского
агента, которую браузер отправляет как часть HTTP-запроса. Информация об агенте содержится
в массиве, который хранится <link linkend="language.variables">в переменной</link>.
В PHP каждая переменная начинается со знака доллара, а значение отдельного элемента массива
в переменной получают по ключу. Извлечём строку пользовательского агента из элемента
<varname>$_SERVER['HTTP_USER_AGENT']</varname>.
</para>
<note>
<para>
<varname>$_SERVER</varname> — суперглобальная зарезервированная переменная,
которую PHP заполняет информацией о запросе, среде выполнения и серверном окружении.
Дополнительную информацию о таких переменных содержит раздел
«<link linkend="language.variables.superglobals">Суперглобальные переменные</link>».
</para>
</note>
<para>
Для вывода значения элемента массива, который хранится в переменной, напишем следующий код:
</para>
<para>
<example>
<info><title>Вывод значения элемента массива</title></info>
<programlisting role="php">
<![CDATA[
<?php
echo $_SERVER['HTTP_USER_AGENT'];
]]>
</programlisting>
<para>
Пример вывода программы:
</para>
<screen role="html">
<![CDATA[
Mozilla/5.0 (Linux) Firefox/112.0
]]>
</screen>
</example>
</para>
<para>
В PHP-переменных хранят числа, строки, массивы и значения других <link linkend="language.types">типов</link>.
Тип значения, элемент которого выводил код предыдущего примера, называется <link linkend="language.types.array">массивом</link>.
Массивы полезны для хранения значений произвольных типов.
</para>
<para>
Переменная <varname>$_SERVER</varname> — только один пример переменной,
к которой PHP автоматически открывает доступ. Список таких переменных приводит раздел
«<link linkend="reserved.variables">Зарезервированные переменные</link>»
или вывод функции <function>phpinfo</function>, которую приводил
как пример предыдущий раздел.
</para>
<para>
В PHP-тег разрешается помещать больше одной инструкции и создавать
небольшие блоки кода, которые делают больше, чем простой вызов инструкции echo.
Например, если требуется проверить, что используется браузер Firefox,
делают так:
</para>
<para>
<example>
<info><title>Пример использования <link linkend="language.control-structures">управляющих
структур</link> и <link linkend="language.functions">функций</link></title></info>
<programlisting role="php">
<![CDATA[
<?php
if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) {
echo 'Вы пользуетесь браузером Firefox.';
}
]]>
</programlisting>
<para>
Пример вывода программы:
</para>
<screen role="html">
<![CDATA[
Вы пользуетесь браузером Firefox.
]]>
</screen>
</example>
</para>
<para>
Здесь вводится ряд новых понятий. Во-первых, в коде появилась инструкция
<link linkend="control-structures.if">if</link>. Если вы знакомы с основами синтаксиса
языка C, код выглядит для вас логичным. Иначе, вероятно, лучше взять книгу об основах языка PHP
и прочитать одну-две начальных главы или почитать раздел «<link
linkend="langref">Справочник языка</link>» этого руководства.
</para>
<para>
Во-вторых, в коде появился вызов функции <function>str_contains</function>.
Функция <function>str_contains</function> — встроенная в PHP функция, которая определяет,
содержит ли строка другую строку. В примере функция ищет строку
<literal>«Firefox»</literal> (т. н. «иголку», или needle)
в элементе <varname>$_SERVER['HTTP_USER_AGENT']</varname> (в т. н. «стоге сена»,
или haystack). Если функция нашла «иголку» в «стоге сена», она возвращает логическое значение
&true;. Иначе функция возвращает логическое значение &false;.
Если функция вернёт &true;, то условие в
выражении конструкции <link linkend="control-structures.if">if</link> окажется истинным (&true;),
а PHP выполнит код в фигурных скобках {}. Иначе код
не выполняется. Попробуйте создать аналогичные примеры с использованием
инструкций <link linkend="control-structures.if">if</link> и
<link linkend="control-structures.else">else</link>, а также других функций
наподобие <function>strtoupper</function> и <function>strlen</function>.
Каждая страница руководства также содержит примеры.
Почитайте страницу руководства о том, <link linkend="about.prototypes">
как читать определения функций</link>, и раздел
<link linkend="language.functions">о PHP-функциях</link>,
если не знаете, как использовать функции.
</para>
<para>
Пойдем дальше и покажем, как переходить в режим PHP и выходить
из режима интерпретации даже в середине блока PHP-кода:
</para>
<para>
<example>
<title>Смешение режимов HTML и PHP</title>
<programlisting role="php">
<![CDATA[
<?php
if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) {
?>
<h3>Функция str_contains() вернула значение true</h3>
<p>Вы просматриваете страницу в браузере Firefox.</p>
<?php
} else {
?>
<h3>Функция str_contains() вернула значение false</h3>
<p>Ваш браузер не похож на Firefox.</p>
<?php
}
]]>
</programlisting>
<para>
Пример вывода данной программы:
</para>
<screen role="html">
<![CDATA[
<h3>Функция str_contains() вернула значение true</h3>
<p>Вы просматриваете страницу в браузере Firefox.</p>
]]>
</screen>
</example>
</para>
<para>
Вместо вывода текста инструкцией echo, мы вышли из режима
интерпретации PHP-кода и написали HTML-разметку.
Логическая последовательность выполнения PHP-кода при этом сохраняется:
PHP отправит пользователю только один блок HTML-разметки
на основе значения, которое вернёт функция <function>str_contains</function>
по результатам поиска подстроки <literal>Firefox</literal>.
</para>
</section>
<section xml:id="tutorial.forms">
<info><title>Работа с формами</title></info>
<para>
Список преимуществ PHP дополняет способ обработки HTML-форм.
Основа заключается в том, что PHP-скрипт автоматически получает доступ к каждому элементу формы.
Подробнее о работе с формами в PHP рассказывает раздел
«<link linkend="language.variables.external">Переменные из внешних источников</link>». Вот пример HTML-формы:
</para>
<para>
<example>
<info><title>Простейшая HTML-форма</title></info>
<programlisting role="html">
<![CDATA[
<form action="action.php" method="post">
<label for="name">Имя:</label>
<input name="name" id="name" type="text">
<label for="age">Возраст:</label>
<input name="age" id="age" type="number">
<button type="submit">Отправить</button>
</form>
]]>
</programlisting>
</example>
</para>
<para>
В этой форме нет ничего особенного. Это обычная HTML-форма без каких-либо
специальных тегов. Когда пользователь заполнит форму и нажмёт кнопку
отправки, PHP вызовет страницу <filename>action.php</filename>.
В файле пишут что-то вроде этого:
</para>
<para>
<example>
<info><title>Выводим данные формы</title></info>
<programlisting role="php">
<![CDATA[
Привет, <?php echo htmlspecialchars($_POST['name']); ?>.
Тебе <?php echo (int) $_POST['age']; ?> лет.
]]>
</programlisting>
<para>
Пример вывода программы:
</para>
<screen role="html">
<![CDATA[
Привет, Сергей. Тебе 30 лет.
]]>
</screen>
</example>
</para>
<para>
Кроме частей, в которых вызывается функция <function>htmlspecialchars</function>
и приводится тип <literal>(int)</literal>, понятно, что делает код.
Функция <function>htmlspecialchars</function> гарантирует, что специальные HTML-символы
правильно закодировались, поэтому люди не смогут внедрить HTML-теги или Javascript-код
на страницу. Поскольку известно, что поле age — число, можно просто
<link linkend="language.types.typecasting">преобразовать</link> значение в целое число (<type>int</type>),
что автоматически избавит нас от случайных символов. PHP также может сделать это
автоматически через модуль <link linkend="ref.filter">filter</link>. PHP автоматически
устанавливает переменные в элементах <varname>$_POST['name']</varname> и <varname>$_POST['age']</varname>.
Раньше мы использовали суперглобальную переменную <varname>$_SERVER</varname>, а здесь мы точно так же
используем суперглобальную переменную <varname>$_POST</varname>, которая содержит
POST-данные. Обратите внимание, что для атрибута <emphasis>method</emphasis>
в форме установили значение POST. Если бы указали метод <emphasis>GET</emphasis>,
информацию формы содержала бы суперглобальная переменная <varname>$_GET</varname>.
В коде также обращаются к суперглобальной переменной <varname>$_REQUEST</varname>,
если источник данных запроса не имеет значения. Эта переменная содержит объединенную информацию
о GET-, POST- и COOKIE-данных.
</para>
</section>
<section xml:id="tutorial.whatsnext">
<info><title>Что дальше?</title></info>
<para>
Новые знания помогут понять бо́льшую часть руководства
и примеры скриптов.
</para>
<para>
Сайт с материалами PHP-конференций содержит слайд-презентации,
которые подробнее рассказывают о возможностях PHP:
<link xlink:href="&url.php.talks;">&url.php.talks;</link>
</para>
</section>
</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
-->