第一章定位和第一步
用PHP编写计算机程序有很多很好的理由。也许你想学习PHP,因为你需要把一个有一些互动元素的小网站放在一起。也许PHP正在你工作的地方使用,你必须加快速度。本章提供了PHP如何融入网站构建难题的背景:它可以做什么以及为什么它如此擅长它的作用。您还将第一次看到PHP语言并查看它的实际效果。
PHP在Web世界中的地位
PHP是一种编程语言 这主要用于构建网站。 它不是在桌面计算机上运行以供一个人使用的PHP程序,而是通常在Web服务器上运行,很多人在自己的计算机上使用Web浏览器访问它。 本节介绍PHP如何适应Web浏览器和Web服务器之间的交互。
当您坐在计算机上并使用Safari或Firefox等浏览器调出网页时,您会在计算机和另一台计算机之间通过Internet进行一些对话。此对话以及如何使网页显示在屏幕上,如图1-1所示。
以下是图表编号步骤中发生的情况:
- 您在浏览器的位置栏中输入www.example.com/catalog.html。
- 浏览器通过Internet向名为
www.example.com
“ /catalog.html”页面的计算机发送消息。 - Apache HTTP Server(
www.example.com
计算机上运行的程序)获取消息并从其磁盘驱动器读取catalog.html文件。 - 作为对浏览器请求的响应,Apache通过Internet将文件内容发送回您的计算机。
- 您的浏览器会根据页面中HTML标记的说明在屏幕上显示该页面。
每次浏览器要求 http://www.example.com/catalog.html时,Web服务器都会发回相同catalog.html文件的内容 。Web服务器响应更改的唯一时间是有人编辑服务器上的文件。
但是,当涉及到PHP时,服务器会为其一半的会话执行更多工作。图1-2显示了当Web浏览器要求PHP生成的页面时会发生什么。
以下是启用PHP的对话的编号步骤中发生的情况:
- 您在浏览器的位置栏中输入www.example.com/catalog/yak.php。
- 您的浏览器通过Internet向名为
www.example.com
“ /catalog/yak.php”页面的计算机发送消息。 - Apache HTTP Server是一个在
www.example.com
计算机上运行的程序,它获取消息并询问PHP引擎,www.example.com
这是计算机上运行的另一个程序,“/ catalog / yak.php是什么样的?” - PHP引擎从磁盘驱动器读取文件 yak.php。
- PHP引擎运行yak.php中的命令 ,可能与MySQL等数据库程序交换数据。
- PHP引擎获取yak.php程序输出并将其发送回Apache HTTP Server,作为“/ catalog / yak.php是 什么样的?” 的答案。
- Apache HTTP Server通过Internet将其从PHP引擎获取的页面内容发送回您的计算机,以响应您的浏览器请求。
- 您的浏览器会根据页面中HTML标记的说明在屏幕上显示该页面。
PHP是一种编程语言。Web服务器计算机中的某些东西会读取您的PHP程序,这些程序是用这种编程语言编写的指令,并指出要做什么。在PHP引擎遵循你的指令。当程序员指的是编程语言或引擎时,他们常说“PHP”。在本书中,只是“PHP”意味着编程语言。“PHP引擎”意味着遵循您编写的PHP程序中的命令并生成网页。
如果PHP(编程语言)就像英语(人类语言),那么PHP引擎就像一个讲英语的人。英语定义了各种单词和组合,当被英语人士阅读或听到时,会转化为各种含义,导致人们做一些事情,如感到尴尬,去商店买些牛奶,或穿上裤子。 。您用PHP编写的程序(编程语言)使PHP引擎能够执行诸如与数据库通信,生成个性化网页或显示图像等操作。
本书关注编写这些程序的细节 – 即图1-2的步骤5中发生的情况 (尽管附录A包含有关在您自己的Web服务器上配置和安装PHP引擎的详细信息)。
PHP被称为服务器端 语言,因为如图1-2所示,它在Web服务器上运行。诸如JavaScript之类的语言可以用作客户端语言,因为嵌入在Web浏览器中,它可以使该浏览器在桌面PC上运行时执行诸如弹出新窗口之类的操作。一旦Web服务器将生成的Web页面发送到客户端(图1-2中的步骤7 ),PHP就不再适用了。如果页面内容包含一些JavaScript,那么该JavaScript在客户端上运行,但它与生成页面的PHP程序完全断开连接。
一个简单的HTML网页就像是“在你的汤里发现了一只蟑螂”这封形式的信,你可能会在向愤怒的小型航空公司发出愤怒的投诉后得到这封信。当您的信件到达航空公司总部时,客户服务部门负担过重的秘书将“蟑螂回复信”从文件柜中取出,复印一份,并将邮件中的副本放回给您。每个类似的请求都得到完全相同的响应。
相比之下,PHP生成的动态页面就像是您写给全球朋友的邮件。你可以把任何你喜欢的东西放在页面 – 涂鸦,图表,haikus和温柔的故事上,当你的新宝宝在整个厨房里溅出捣碎的胡萝卜时,你的宝宝是多么难以忍受。您的信件内容是根据发送给他们的特定人员量身定制的。但是,一旦将该字母放入邮箱,就无法再更改它。它在全球各地展开,并由您的朋友阅读。当你的朋友正在阅读它时,你无法修改这封信。
现在想象一下,你正在给一位艺术和手工艺灵感的朋友写一封信。除了涂鸦和故事之外,还包括诸如“在页面顶部剪掉青蛙的小图片并将其粘贴在页面底部的小兔子上”和“阅读页面上的最后一段”等说明。在任何其他段落之前。“当你的朋友读到这封信时,她也会执行信函指示她采取的行动。这些操作就像网页中的JavaScript一样。写完这封信后,它们会被记下来,之后不会改变。但是当信的读者遵循指示时,信件本身就会改变。类似地,Web浏览器遵循页面中的任何JavaScript命令并弹出窗口,更改表单菜单选项或刷新页面到新的URL。
PHP的优点是什么?
您可能会被PHP吸引,因为它是免费的,因为它很容易学习,或者因为您的老板告诉您下周需要开始处理PHP项目。由于您将使用PHP,因此您需要了解一些特殊内容。下次有人问你“PHP有什么好处?”使用这一部分作为答案的基础。
PHP是免费的(如钱)
您无需支付任何人使用PHP。无论你是在地下室还是一间价值百万美元的“企业级”服务器的房间内运行一台10年前的PC上的PHP引擎,都没有许可费,支持费,维护费,升级费或任何其他类型的费用。
OS X和大多数Linux发行版已经安装了PHP。如果您没有,或者您正在使用其他操作系统,如Windows,则可以从http://www.php.net下载PHP 。附录A详细说明了如何安装PHP。
PHP是免费的(如语音)
作为一个开源项目,PHP使其内部可供任何人检查。如果它没有做你想做的事情,或者你只是想知道一个功能为什么以它的方式工作,你可以在PHP引擎的内核(用C编程语言编写)中查看它是什么。即使您没有这方面的技术专长,也可以让某人为您做调查。大多数人都无法修理自己的汽车,但能够将你的汽车带给一个可以打开引擎盖并修理它的机械师是很好的。
PHP是跨平台的
您可以将PHP与Web服务器计算机一起使用 它运行Windows,Mac OS X,Linux和许多其他版本的Unix。此外,如果您切换Web服务器操作系统,通常不必更改任何PHP程序。只需将它们从Windows服务器复制到Unix服务器,它们仍然有效。
虽然Apache是最常用的PHP Web服务器程序,但您也可以使用nginx,Microsoft Internet Information Server(IIS)或任何其他支持 CGI标准的Web服务器。 PHP也有效 拥有大量数据库,包括MySQL,PostgreSQL,Oracle,Microsoft SQL Server,SQLite,Redis和MongoDB。
如果最后一段中的所有首字母缩略词都吓坏了你,请不要担心。它可以归结为:无论你使用什么系统,PHP都可能运行得很好,可以使用你已经使用的任何数据库。
PHP被广泛使用
PHP被用于超过2亿个不同的网站,从无数微小的个人主页到Facebook,维基百科,Tumblr,Slack和雅虎等巨头。有许多书籍,杂志和网站致力于教授PHP并探索如何使用它。有些公司为PHP提供支持和培训。简而言之,如果您是PHP用户,那么您并不孤单。
PHP隐藏其复杂性
您可以在PHP中构建功能强大的电子商务引擎,以处理数百万客户。您还可以构建一个小型站点,自动维护指向不断变化的文章或新闻稿列表的链接。当您将PHP用于更简单的项目时,它不会妨碍您只关注大型系统的问题。当您需要高级功能(如缓存,自定义库或动态图像生成)时,它们可用。如果您不需要它们,您不必担心它们。您可以专注于处理用户输入和显示输出的基础知识。
PHP在行动
准备好第一次尝试PHP?本节包含一些程序清单和对它们的作用的解释。如果您不了解每个列表中发生的一切,请不要担心!这就是本书的其余部分。阅读这些列表以了解PHP程序的外观以及它们如何工作的概述。不要冒汗了。
当给定要运行的程序时,PHP引擎仅关注PHP开始和结束标记之间的程序部分。无论这些标签之外的什么都打印出来,没有任何修改。这使得在主要包含HTML的页面中嵌入少量PHP变得容易。PHP引擎运行<?php
(PHP开始标记)和 ?>
(PHP结束标记)之间的命令 。PHP页面通常存在于名称以.php结尾的文件中。例1-1显示了一个带有一个PHP命令的页面。
例1-1 Hello, World!
1 2 3 4 5 6 7 8 9 10 | <html> <head><title>PHP says hello</title></head> <body> <b> <?php print "Hello, World!"; ?> </b> </body> </html> |
例1-1的输出是:
1 2 3 4 5 6 7 | <html> <head><title>PHP says hello</title></head> <body> <b> Hello, World!</b> </body> </html> |
在Web浏览器中,如图1-3所示。
但是,打印一个永不改变的消息并不是PHP的一个非常令人兴奋的用法。您可以在纯HTML页面中包含“Hello,World!”消息,但结果相同。更有用的是打印动态数据 – 即更改的信息。PHP程序最常见的信息来源之一是用户:浏览器显示一个表单,用户在其中输入信息并点击“提交”按钮,浏览器将该信息发送到服务器,服务器最终传递它在PHP引擎上,程序可以使用它。
示例1-2是没有PHP的HTML表单。表单只包含一个名为的文本框user
和一个“提交”按钮。表单提交sayhello.php,通过<form>
标签的action
属性指定。
例1-2。用于提交数据的HTML表单
1 2 3 4 5 | <form method="POST" action="sayhello.php"> Your Name: <input type="text" name="user" /> <br/> <button type="submit"">Say Hello</button> </form> |
您的Web浏览器将示例1-2中的HTML呈现为图1-4 中所示的表单。
示例1-3显示了sayhello.php程序,该 程序向表单文本框中指定的任何人打印问候语。
例1-3。动态数据
1 2 3 4 5 6 | <?php print "Hello, "; // Print what was submitted in the form parameter called 'user' print $_POST['user']; print "!"; ?> |
如果您Ellen
在文本框中键入并提交表单,则会 打印示例1-3Hello, Ellen!
。图1-5显示了Web浏览器的显示方式。
$_POST
保存提交的表单参数的值。在编程术语中,它是一个 变量,因为你可以改变它所拥有的值。特别是,它是一个数组 变量,因为它可以包含多个值。第7章讨论了这个特殊的数组。第4章讨论了一般的数组。
在这个例子中,该行 首先//
称为 注释行。注释行适用于源代码的人类读者,并且被PHP引擎忽略。注释对于使用有关其工作方式的信息来注释程序非常有用。“评论”更详细地讨论了评论。
您也可以使用PHP打印出来允许某人为其提交值的HTML表单user
。这在例1-4中示出 。
例1-4。打印表格
1 2 3 4 5 6 7 8 9 | <?php print <<<_HTML_ <form method="post" action="$_SERVER[PHP_SELF]"> Your Name: <input type="text" name="user" /> <br/> <button type="submit">Say Hello</button> </form> _HTML_; ?> |
示例1-4使用字符串语法叫 这里的文件。将<<<_HTML_
和 之间的所有 _HTML_
内容传递print
给要显示的命令。就像在例1-3中一样,字符串中的变量被替换为其值。这一次,变量是$_SERVER[PHP_SELF]
。这是一个特殊的PHP变量,包含当前页面的URL(没有协议或主机名)。如果示例1-4中页面的URL 是 http://www.example.com/users/enter.php,则 $_SERVER[PHP_SELF]
包含 /users/enter.php
。
使用$_SERVER[PHP_SELF]
表单操作,您可以放置用于打印表单的代码以及在同一页面中使用提交的表单数据执行某些操作。示例1-5 将示例1-3和1-4组合成一个页面,该页面显示表单并在提交表单时打印问候语。
例1-5。打印问候语或表格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php // Print a greeting if the form was submitted if ($_POST['user']) { print "Hello, "; // Print what was submitted in the form parameter called 'user' print $_POST['user']; print "!"; } else { // Otherwise, print the form print <<<_HTML_ <form method="post" action="$_SERVER[PHP_SELF]"> Your Name: <input type="text" name="user" /> <br/> <button type="submit">Say Hello</button> </form> _HTML_; } ?> |
实施例1-5使用该if()
构建体 查看浏览器是否为form参数发送了值 user
。它使用它来决定要做的两件事中的哪一件:打印问候语或打印表单。第3章谈到if()
。第7章$_SERVER[PHP_SELF]
讨论了使用 和处理表单。
PHP有一个庞大的内部函数库,您可以在程序中使用它。这些功能可帮助您完成常见任务。一个内置函数number_format()
,它提供数字的格式化版本。例1-6用于number_format()
打印数字。
例1-6。打印格式化的数字
1 2 3 | <?php print "The population of the US is about: "; print number_format(320853904); ?> |
例1-6打印:
1 | The population of the US is about: 320,853,904 |
第5章是关于功能的。它向您展示了如何编写自己的内容并解释了调用和处理函数结果的语法。许多功能,包括 number_format()
,具有返回值。这是运行该功能的结果。在例1-6中,print
给出打印的第二个语句的数据是来自的返回值number_format()
。 在这种情况下,它是逗号格式的人口编号。
用PHP编写的最常见的程序类型之一是显示包含从数据库检索的信息的网页。当您让提交的表单参数控制从数据库中提取的内容时,您将打开通往网站上交互性世界的大门。示例1-7显示了一个PHP程序,它连接到数据库服务器,根据表单参数的值检索菜单列表及其价格meal
,并在HTML表格中打印这些菜肴和价格。
例1-7。显示数据库中的信息
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 | <?php // Use the SQLite database 'dinner.db' $db = new PDO('sqlite:dinner.db'); // Define what the allowable meals are $meals = array('breakfast','lunch','dinner'); // Check if submitted form parameter "meal" is one of // "breakfast", "lunch", or "dinner" if (in_array($_POST['meal'], $meals)) { // If so, get all of the dishes for the specified meal $stmt = $db->prepare('SELECT dish,price FROM meals WHERE meal LIKE ?'); $stmt->execute(array($_POST['meal'])); $rows = $stmt->fetchAll(); // If no dishes were found in the database, say so if (count($rows) == 0) { print "No dishes available."; } else { // Print out each dish and its price as a row // in an HTML table print '<table><tr><th>Dish</th><th>Price</th></tr>'; foreach ($rows as $row) { print "<tr><td>$row[0]</td><td>$row[1]</td></tr>"; } print "</table>"; } } else { // This message prints if the submitted parameter "meal" isn't // "breakfast", "lunch", or "dinner" print "Unknown meal."; } ?> |
例1-7中有很多内容,但它证明了PHP的简单性和强大功能,它只需要大约20行代码(没有注释)来制作这个动态的,数据库支持的网页。以下描述了这20行中发生的情况。
将new PDO()
在功能示例的顶部设置与特定文件中的SQLite数据库的连接。这些功能,如在本实施例中使用的其它的数据库功能(prepare()
,execute()
,和 fetchAll()
),更详细地说明在 第8章。
事情的程序,有开始$
,如 $db
,$_POST
, $stmt
,和$row
,是变量。 变量保存的值可能随程序运行或在程序中的某一点创建而更改,并保存以供以后使用。第2章讨论变量。
连接到数据库后,下一个任务是查看用户请求的餐点。该$meals
阵列初始化为保持允许的饭菜:breakfast
,lunch
,和 dinner
。该语句in_array($POST['meal'], $meals)
检查提交的表单参数 meal
(值 $_POST['meal']
)是否在 $meals
数组中。如果没有,执行将跳到示例的末尾,在最后一个之后else
,程序将打印出来Unknown meal
。
如果一个可接受的饭被提交,prepare()
并且execute()
将查询发送到数据库。例如,如果用餐是breakfast
,则发送的查询如下:
1 | SELECT dish,price FROM meals WHERE meal LIKE 'breakfast' |
1 2 3 4 5 6 7 8 9 | Five plus five is: <?php print 5 + 5; ?> <p> Four plus four is: <?php print 4 + 4; ?> <p> <img src="vacation.jpg" alt="My Vacation" /> |
每组<?php
?>
标记内的PHP源代码由PHP引擎处理,页面的其余部分按原样打印。例1-8打印:
1 2 3 4 5 | Five plus five is: 10<p> Four plus four is: 8<p> <img src="vacation.jpg" alt="My Vacation" /> |
一些较旧的PHP程序<?
用作开始标记而不是<?php
。它<?
被称为短开标签,因为它短于<?php
。通常最好使用常规 <?php
开放标记,因为它可以保证在运行PHP引擎的任何服务器上运行。可以使用PHP配置设置打开或关闭对短标签的支持。 附录A向您展示了如何修改PHP配置以控制哪些开放标记在您的程序中有效。
本章的其余示例都以<?php
start标记开头,以 end结尾 ?>
。在后续章节中,并非所有示例都有开始和结束标记 – 但请记住,您的程序需要它们才能让PHP引擎识别您的代码。
1 | <?php print "Hello"; print " World!"; ?> |
例1-10。这个PHP太庞大了
1 2 3 4 5 6 7 8 | <?php print "Hello"; print " World!"; ?> |
例1-11。这个PHP恰到好处
1 2 3 4 | <?php print "Hello"; print " World!"; ?> |
除了忽略行之间的空格外,PHP引擎还忽略了语言关键字和值之间的空格。你可以有零个空间,一个空间,或百位之间 print
并"Hello, World!"
又一次之间"Hello, World!"
,并在该行的最后的分号。
良好的编码风格是print
在打印值之间放置一个空格 ,然后立即用分号跟随值。例1-12显示了三条线,一条线间距太大,一条线太少,另一条线条恰好合适。
例1-12。间距
1 2 3 4 5 | <?php print "Too many spaces" ; print"Too few spaces"; print "Just the right amount of spaces"; ?> |
语言关键字(如print
)和函数名称(例如number_format
)不区分大小写。当您在程序中放置这些关键字和函数名称时,PHP引擎不关心您是使用大写字母,小写字母还是两者。 从引擎的角度来看,例1-13中的陈述是相同的。
例1-13。关键字和函数名称不区分大小写
1 2 3 4 5 6 7 | <?php // These four lines all do the same thing print number_format(320853904); PRINT Number_Format(320853904); Print number_format(320853904); pRiNt NUMBER_FORMAT(320853904); ?> |
注释
正如您在本章的一些示例中看到的那样,注释是向其他人解释您的程序如何工作的一种方式。源代码中的注释是任何程序的重要组成部分。当你编码的时候,你所写的内容在你看来可能是非常清楚的。然而,几个月之后,当你需要返回并修改程序时,你的聪明逻辑可能就不那么明显了。这就是评论的用武之地。通过简单的语言解释程序是如何工作的,评论使程序更容易理解。
当需要修改程序的人不是原作者时,评论更为重要。做你自己和其他可能有机会阅读你的源代码的人,并为你的程序填写很多评论。
也许是因为它们非常重要,PHP提供了许多方法来在您的程序中添加注释。 您已经看到的一种语法是开始一行//
。这告诉PHP引擎将该行上的所有内容视为注释。在行结束后,代码将被正常处理。这种注释方式也用于其他编程语言,如C ++,JavaScript和Java。您还可以//
在语句后放置一行,以将该行的其余部分视为注释。PHP还支持Perl和shell风格的单行注释。这些是以开头的行#
。您可以使用 #
启动在您使用相同的地方注释//
,而现代风格的喜欢 //
过#
。例1-14中显示了一些单行注释。
例1-14。带//或#的单行注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php // This line is a comment print "Smoked Fish Soup "; print 'costs $3.25.'; # Add another dish to the menu print 'Duck with Pea Shoots '; print 'costs $9.50.'; // You can put // or # inside single-line comments // Using // or # somewhere else on a line also starts a comment print 'Shark Fin Soup'; // I hope it's good! print 'costs $25.00!'; # This is getting expensive! # Putting // or # inside a string doesn't start a comment print 'http://www.example.com'; print 'http://www.example.com/menu.php#dinner'; ?> |
对于多线 注释,开始 评论 /*
并结束 */
。/*
和之间的所有内容都*/
被PHP引擎视为注释。多行注释对于暂时关闭一小段代码非常有用。例1-15显示了一些多行注释。
例1-15。多行注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php /* We're going to add a few things to the menu: - Smoked Fish Soup - Duck with Pea Shoots - Shark Fin Soup */ print 'Smoked Fish Soup, Duck with Pea Shoots, Shark Fin Soup '; print 'Cost: 3.25 + 9.50 + 25.00'; /* This is the old menu: The following lines are inside this comment so they don't get executed. print 'Hamburger, French Fries, Cola '; print 'Cost: 0.99 + 1.25 + 1.50'; */ ?> |
章节总结
本章包括:
- PHP用于Web服务器创建响应或文档以发送回浏览器
- PHP作为服务器端语言,意味着它在Web服务器上运行(这与客户端语言(例如在Web浏览器中运行的JavaScript)形成对比)
- 当您决定使用PHP时注册的内容:它是免费的(在金钱和语音方面),跨平台,流行,并为Web编程而设计
- 如何显示打印信息,处理表单和与数据库通信的PHP程序
- PHP程序结构的一些基础知识,例如PHP开始和结束标记(
<?php
和?>
),空格,区分大小写和注释