mirror of
https://github.com/php/doc-zh.git
synced 2026-03-23 22:52:08 +01:00
398 lines
15 KiB
XML
398 lines
15 KiB
XML
<?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
|
||
-->
|