-
Notifications
You must be signed in to change notification settings - Fork 108
Expand file tree
/
Copy pathtutorial.xml
More file actions
397 lines (377 loc) · 14.8 KB
/
tutorial.xml
File metadata and controls
397 lines (377 loc) · 14.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
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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 876557ae38f6ca5035618f7cea48ca627118b437 Maintainer: HonestQiao Status: ready -->
<!-- CREDITS: Gregory, Luffy, mowangjuanzi -->
<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 的功能并不局限于生成动态的 web
页面,但本章的内容仅涉及于此。请查阅“<link linkend="intro-whatcando">PHP
能做什么</link>”一节以获取更多信息。
</para>
<para>
使用了 PHP 的 web 页面将被和通常的 HTML 页面一样处理,可以用通常建立 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>
<info><title>第一个 PHP 脚本:<filename>hello.php</filename></title></info>
<programlisting role="php">
<![CDATA[
<?php
echo "Hello World!";
?>
]]>
</programlisting>
<simpara>
通过终端导航至包含该文件的目录,并使用以下命令启动开发服务器:
</simpara>
<programlisting role="shell">
<![CDATA[
php -S localhost:8000
]]>
</programlisting>
<simpara>
通过浏览器使用 Web 服务器的 URL 访问该文件,URL 以 <literal>/hello.php</literal>
文件名结尾。根据之前执行的命令,URL将是 <literal>http://localhost:8000/hello.php</literal>。如果所有配置均正确,该文件将由
PHP 解析,并在浏览器中显示“Hello World!”的输出内容。
</simpara>
<simpara>
PHP 可以嵌入到普通 HTML 网页中。这意味着可以在 HTML 文档中编写 PHP 语句,如下例所示:
</simpara>
<programlisting role="php">
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php echo '<p>Hello World</p>'; ?>
</body>
</html>
]]>
</programlisting>
<simpara>
这会产生以下输出:
</simpara>
<screen role="html">
<![CDATA[
<!DOCTYPE html>
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>
]]>
</screen>
</example>
</para>
<para>
该程序非常的简单,它仅仅只是利用了 PHP 的 <function>echo</function> 语句显示了
<literal>Hello World</literal>。用户一定不会满足于此。请注意该文件<emphasis>无需被执行</emphasis>或以任何方式指定。服务器会找到该文件并提供给
PHP 进行解释,因为使用了“.php”的扩展名,服务器已被配置成自动传递有着“.php”扩展名的文件给
PHP。一个普通的 HTML 文件,加上了几个特别的标签,就可以做很多非常有趣的事情!
</para>
<para>
以上例子的目的是为了显示 PHP 特殊标识符的格式。在这个例子中,用
<literal><?php</literal> 来表示 PHP 标识符的起始,然后放入
PHP 语句并通过加上一个终止标识符 <literal>?></literal> 来退出
PHP 模式。可以根据自己的需要在 HTML 文件中像这样开启或关闭
PHP 模式。请参阅手册中“<link linkend="language.basic-syntax">PHP 基本语法</link>”以获取更多信息。
</para>
<note>
<info><title>关于换行</title></info>
<para>
尽管换行在 HTML 中的实际意义不是很大,但适当地使用换行可以使 HTML
代码易读且美观。PHP 会在输出时自动删除其结束符 <literal>?></literal>
后的一个换行。该功能主要是针对在一个页面中嵌入多段 PHP
代码或者包含了无实质性输出的 PHP 文件而设计,与此同时也造成了一些疑惑。如果需要在
PHP 结束符 <literal>?></literal> 之后输出换行的话,可以在其后加一个空格,或者在最后的一个
echo/print 语句中加入一个换行。
</para>
</note>
<note>
<info><title>关于文本编辑器</title></info>
<para>
有很多文本编辑器以及集成开发环境(IDE)可以被用来建立、编辑和管理
PHP 文件。这些工具中的一部分被列在 <link
xlink:href="&url.phpeditorlist;">PHP 编辑器列表</link>中。如果希望推荐其它的编辑器,请访问以上页面,并要求该页面的维护者将你推荐的编辑器加入到该列表中。使用支持语法高亮功能的编辑器会给开发带来很多帮助。
</para>
</note>
<note>
<info><title>关于文字处理器</title></info>
<para>
诸如 StarOffice Writer、Microsoft Word 和 Abiword
的文字处理器不适合用来编辑 PHP
程序。如果希望用以上这些工具的某一种来处理脚本,必须保证将结果存成了<emphasis>纯文本</emphasis>格式,否则
PHP 将无法读取并运行这些脚本。
</para>
</note>
<para>
现在已经成功建立了一个简单的 PHP 脚本,那么再来建立一个最著名的
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>
现在来编写一些更实用的脚本,比如检查浏览页面的访问者在用什么浏览器。要达到这个目的,需要检查用户的
agent 字符串,它是浏览器发送的 HTTP 请求的一部分。该信息被存储在一个<link
linkend="language.variables">变量</link>中。在 PHP
中,变量总是以一个美元符开头。我们现在感兴趣的变量是
<varname>$_SERVER['HTTP_USER_AGENT']</varname>。
</para>
<note>
<para>
<varname>$_SERVER</varname>
是一个特殊的 PHP 保留变量,它包含了 web
服务器提供的所有信息,被称为超全局变量。请查阅本手册“<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">Array</link> 变量中打印了一个元素。数组非常有用。
</para>
<para>
<varname>$_SERVER</varname> 只是 PHP 自动全局化的变量之一。可以查阅“<link
linkend="reserved.variables">预定义变量</link>”一节来查看这些变量的列表,或者也可以通过上节例子中
<function>phpinfo</function> 函数的输出来查看。
</para>
<para>
可以在一个 PHP 标识中加入多个 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 'You are using Firefox.';
}
?>
]]>
</programlisting>
<para>
该脚本的输出可能是:
</para>
<screen role="html">
<![CDATA[
You are using 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
的一个内置函数,其功能是确定指定字符串是否包含其它字符串。例如我们现在需要在
<varname>$_SERVER['HTTP_USER_AGENT']</varname>(即所谓的 haystack)变量中寻找
<literal>'Firefox'</literal>。如果在这个 haystack
中该字符串(即所谓的 needle)被找到(“草里寻针”),则函数返回 &true;;如果没有,则返回
&false;。如果返回 &true;,则 <link linkend="control-structures.if">if</link> 会将条件判断为
&true; 并运行其花括号 {} 内的代码;否则,则不运行这些代码。可以自己尝试利用
<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">函数</link>”的有关章节。
</para>
<para>
以下我们进一步显示如何进出 PHP 模式,甚至是在一个 PHP 代码块的中间:
</para>
<para>
<example>
<info><title>混合 HTML 和 PHP 模式</title></info>
<programlisting role="php">
<![CDATA[
<?php
if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) {
?>
<h3>str_contains() returned true</h3>
<p>You are using Firefox</p>
<?php
} else {
?>
<h3>str_contains() returned false</h3>
<p>You are not using Firefox</p>
<?php
}
?>
]]>
</programlisting>
<para>
该脚本的输出可能是:
</para>
<screen role="html">
<![CDATA[
<h3>str_contains() returned true</h3>
<p>You are using Firefox</p>
]]>
</screen>
</example>
</para>
<para>
和使用 PHP echo 语句输出不同的是,以上示例跳出了 PHP 模式直接发送
HTML。这里需要特别注意的一点是脚本的逻辑流保持不变。根据
<function>str_contains</function> 的结果,只会有一个 HTML
块将发送给浏览者。换句话说,取决于是否找到字符串 <literal>Firefox</literal>。
</para>
</section>
<section xml:id="tutorial.forms">
<info><title>处理表单</title></info>
<para>
PHP 一个很有用的特点体现在它处理 HTML
表单的方式。需要理解的非常重要的原理,是表单的任何元素都在
PHP 脚本中自动生效。请参阅本手册中“<link
linkend="language.variables.external">PHP 的外部变量</link>”以获取关于在
PHP 中使用表单的详细信息及范例。以下是 HTML 表单的范例:
</para>
<para>
<example>
<info><title>一个简单的 HTML 表单</title></info>
<programlisting role="html">
<![CDATA[
<form action="action.php" method="post">
<label for="name">Your name:</label>
<input name="name" id="name" type="text">
<label for="age">Your age:</label>
<input name="age" id="age" type="number">
<button type="submit">Submit</button>
</form>
]]>
</programlisting>
</example>
</para>
<para>
该表单中并没有什么特殊的地方,其中没有使用任何特殊的标识符。当用户填写了该表单并点击了提交按钮,页面
<filename>action.php</filename> 将被调用。在该文件中,可以加入如下内容:
</para>
<para>
<example>
<info><title>打印来自表单的数据</title></info>
<programlisting role="php">
<![CDATA[
Hi <?php echo htmlspecialchars($_POST['name']); ?>.
You are <?php echo (int) $_POST['age']; ?> years old.
]]>
</programlisting>
<para>
该脚本的输出可能是:
</para>
<screen role="html">
<![CDATA[
Hi Joe. You are 22 years old.
]]>
</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>方法</emphasis>(method)。如果使用了
<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 Conference 资料网站
<link xlink:href="&url.php.talks;">&url.php.talks;</link>
以观看更多幻灯片,这些幻灯片展示了许多 PHP 其它的功能。
</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
-->