···························································· 第5 章 chapter5 PHP入门 5.1 PHP 简介与开发环境搭建 5.1.1 PHP 简介 PHP(PageHypertextPreprocessor)即页面超文本预处理器,是一种被广泛使用的 Web后端开发技术。它通常被嵌入HTML之中,构成一个以php为扩展名的文件。下 面给出一个PHP的例子。PHP代码通过<?php?>标签嵌入HTML中。 <html> <head> <title>Example</title> </head> <body> <?php echo "Hello PHP!"; ?> </body> </html> 这个页面在服务器端会经过预先处理,PHP代码会被执行,而其输出结果则被替换 在PHP代码的位置上。浏览器收到的页面中并不会包含任何PHP代码,如下所示。 PHP代码中的echo函数是最常用的输出函数,用于向页面输出一个文本。 <html> <head> <title>Example</title> </head> <body> Hello PHP! </body> </html> 那么,服务器端如何执行带有PHP的页面呢? 使用什么来执行呢? 答案是通过嵌 6 4 ◆W eb 开发与安全 入Web服务器软件中的PHP 插件来执行。使用最为广泛的Web服务器有Apache、 Nginx和IIS等。PHP插件包含PHP所使用的可执行程序php.exe和符合Apache和 Nginx插件规范的DLL 文件,图5-1 展示了PHP 目录中文件的一小部分。其中 php5apache2_filter是用于将PHP和Apache结合起来的Apache插件,而php5isapi.dll 则是PHP的IIS插件。 图5-1 PHP目录中的文件 5.1.2 PHP 安装过程 PHP通常作为Web服务器的插件而存在,这意味着不能单独安装PHP,而是需要 在安装了Web服务器的基础上再安装PHP。为简化安装过程,这里使用PHP的套件 PHPnow。套件是指包含了PHP运行所需的几个软件的结合。PHPnow 是一个稍显古 老的套件,目前已经停止更新,但因为它使用的PHP版本较低,所以方便用来复现本书 中的例子。如果希望使用较新的版本,则可以使用最新的PHPStudy套件,因为所包含 的PHP版本较高,所以一些旧的PHP漏洞的例子无法复现。 在Linux下有一套叫作LAMP的套件是中小型网站所常用的。LAMP是由Linux、 Apache、MySQL和PHP这4个单词的首字母构成的,整个单词正好有了“灯”的含义。 在Windows下,只需安装AMP(Apache、MySQL和PHP的首字母组合)即可。其 中,Apache是Web服务器、MySQL是数据库,PHP是服务器端语言支持。PHPnow 中 ◆ 第 5 章 PHP 入门65 包含了这三者,且安装过程非常简单。这里以PHPnow1.6版本为例进行说明。 -5. 首先下载PHPnow1.6.i解压到一个不包含中文路径和空格的文件夹下。不包 -5.zp, 含中文路径和空格这一点尤为重要,编者建议软件应安装在不包含空格的英文路径中。 以管理员身份运行cmd.如图52所示。 exe, 图5- 2 以管理员身份运行c.x mdee 接着,使用cd命令切换到解压的PHPnow 目录下,如图5-3所示。 图5- 3 切换目录 执行Sucmd,按照提示选择Apce和MySQL 的版本,这里选择Apahe2.63 版 0.ntente-4 etp.ahc0. 本和MySQL5.90 版本。在界面中输入20,按Er键,再输入50,按Er键,如图5 所示。 随后可以看到文件在快速解压,并提示“是否执行Icmd 初始化?”,这里输入“” 选择继续安装,如图5-5所示。 nit.y ◆ 66 W eb 开发与安全 图5- 4 执行Setucmd p. 图5- 5 执行Ii.md ntc 这时可以看到,Apache和MySQL 在安装(见图5-6), 并提示为MySQL 的root用户 设置密码,这时输入123456 这个弱口令,以方便演示。很多粗心的学生常常忘记自己设 置的初始密码,所以在实验中不得不采用这种统一的密码。请切记不要在真正执行上线 的项目(常被称作生产环境)中使用这种密码,这会让服务器不堪一击。 ◆ 第 5 章 PHP 入门67 图5- 6 输入MySQL管理员口令 安装程序自动弹出一个浏览器界面并对软件进行测试。在“MySQL 用户密码”一栏 输入123456,随后单击“连接”按钮,就可以看到测试成功的提示,如图5-7所示。 图5- 7 PHPnow 测试 6 8 ◆W eb 开发与安全 至此,套件就安装成功了。这是一个正常的安装过程,当然也会出现意外。第一个 可能出现的意外:没有以管理员身份运行导致无法安装Apache和MySQL服务。第二 个可能出现的意外:端口80和3306被占用,这个问题在安装过程中会提示,只需输入一 个新的端口号,如81、3307就可以解决了。另外,杀毒软件也有可能导致安装失败。 5.2 PHP 语法 5.2.1 PHP 执行过程 PHP是一种服务器端描述语言,其主要功能是访问数据库和处理文本。其语法是由 Perl语言演变而来的,而Perl语言本身就非常擅长处理文本,下面的代码在Perl和PHP 中都可以运行。 $a = "world"; $b = "hello $a"; echo $b; 上述代码输出为helloworld。PHP语法规定所有变量必须以$开头,变量不需要提 前声明就可以直接使用,并且双引号字符串中出现变量名则会直接将内容替换,字符串 中的$a被替换为world,所以$b的值为helloworld。 当用户在浏览器中输入一个网址或单击一个链接时,浏览器会使用HTTP向服务器 端发送一个GET请求,服务器端收到这个请求后会根据请求内容的不同做不同的处理。 如果请求得到一个HTML页面,或者CSS文件、JavaScript文件,那么服务器端程 序会直接读取文件内容并使用HTTP发送给浏览器作为这次请求的响应。如果浏览器 请求的内容是以php为扩展名的文件,那么,支持PHP的服务器会调用PHP解释执行 程序对页面中所包含的代码进行处理,将代码的输出结果发送给用户。 常见的Web服务器程序,如Apache、Nginx、IIS,都可以通过配置添加对PHP的支 持。初学者可以直接使用PHPnow、PHPStudy这种包含了Apache、MySQL和PHP的 学习套件来进行一键安装,如图5-8所示。在学习PHP时也可以直接使用线上的PHP 执行环境(http://www.runoob.com/try/runcode.php?filename=demo_intro&type= php)。 下面给出一个简单的PHP页面。 <!DOCTYPE html> <html> <body> <?php echo "hello world!"; ?> </body> </html> 第◆5 章 PHP 入门6 9 图5-8 PHPnow 目录结构 在htdocs目录下,新建test.php,然后在其中输入PHP代码。 <?php echo "hello"; ?> 随后在浏览器中输入http://127.0.0.1/test.php,如果能在页面中看到hello字样, 则运行成功(见图5-9)。在学习PHP语法时可以直接将本节例子复制到test.php中保 存,然后刷新浏览器,就可以看到执行结果。 图5-9 test.php执行结果 如果使用的是其他PHP套件,可以尝试在浏览器中输入http://127.0.0.1:8080/ test.php,其中8080代表端口号,Apache有可能不在80端口监听,而在8080端口监听。 如果新建的文件名不是test.php,可以根据文件名修改上面的URL。例如,文件为 abc.php,则URL应为http://127.0.0.1/abc.php。 PHP页面与普通的HTML页面的不同是,PHP页面包含一个<?php ?>标签,在 这个标签中包含PHP代码,代码中使用echo输出一个文本。这个代码会在服务器端执 行,发送给浏览器的页面如下: <!DOCTYPE html> <html> <body> hello world! </body> </html> 7 0 ◆W eb 开发与安全 可以看到,PHP代码并没有泄露给用户,用户得到的是PHP代码的执行结果。 5.2.2 PHP 变量与流程控制 PHP中的变量是隐式类型的变量,变量不需要声明就可以使用,它们必须以符号$ 开头,$后必须以字母或下画线字符开始,并且只能包含字母、下画线和数字。除了符号 $,其他规则与C语言相同。下面给出几个变量例子。 $a = 12; //正确 $12 = 3 ; //有语法错误 $_ = "ss" ; //正确 $a_3 = 3.5 ; //正确 注意:在PHP文件中,所有的PHP代码均必须包裹在<?php?>标签中,否则会被 认为是纯文本而不被执行。例如: <html> <body> echo 'hello'; </body> </html> 这个程序会直接在浏览器页面输出“echo'hello';”,而不是输出执行结果hello。 PHP变量的类型由赋值语句的右侧决定,而且可以随时变化。例如: $a = 12; $a = "hello"; 在执行完第一条语句后,$a的类型为整数类型;在执行完第二条语句后,它的类型变 为字符串类型。 PHP的表达式语法与C语言一致,这是因为PHP演化自Perl语言,Perl语言演化 自C语言,与Java、JavaScript、C#等语言一样都从属于C家族语言。这种相似性大大降 低了开发者的学习成本。 PHP中的分支语句写法与C语言完全相同,也包含if语句和switch语句。下面看 一下if语句: <?php $t=date("H"); if($t<20) { echo "Good day!"; }else{ echo "Good night!"; } ?> 这段代码使用date函数获取了当前的24小时制的小时,放到变量$t中,随后判断 第◆5 章 PHP 入门7 1 $t是否在20点之前,如果是,则显示“Goodday!”,否则显示“Goodnight!”。 switch语句与if语句类似,只不过C语言中的switch语句仅可以支持整数和字符 条件,而PHP中的switch语句可以支持字符串条件,下面举例说明。 $favcolor="red"; switch($favcolor) {c ase "red": echo "你喜欢红色!"; break; case "blue": echo "你喜欢蓝色!"; break; case "green": echo "你喜欢绿色!"; break; default: echo "你喜欢的颜色不是红色、蓝色或绿色!"; } 例子中的switch条件为变量$favcolor,这个变量是字符串类型的。case语句的条 件也是字符串类型的。 PHP中的循环同C语言一样,也支持while语句、do-while语句和for语句。 <html> <body> <?php $i=1; while($i<=5){ echo "$i<br>"; $i++; } ?> </body> </html> 5.2.3 PHP 数组 PHP中的数组与C语言中的数组在语法上有较大不同,可以用以下两种方法构建 数组。第 一种方法:使用array函数。 $cp = array("apple","xiaomi","thinkpad"); echo "I like $cp[1]"; 7 2 ◆W eb 开发与安全 上述代码中,$cp为一个长度为3的数组,$cp[1]的值为xiaomi,页面运行结果如 图5-10所示。 图5-10 PHParray示例 第二种方法:在PHP5.4之后的版本中也可以使用方括号来构建。 $cp = ["apple","xiaomi","thinkpad"]; 低版本PHP运行此代码会报如下错误: Parse error: syntax error, unexpected '[' in C:\dev\PHPnow\htdocs\test.php on line 1 使用count函数可以获取数组长度,方便对数组进行遍历。例如: $cp=array("thinkpad","xiaomi","apple"); $cp[3]='aaa'; $n=count($cp); for($i=0;$i<$n;$i++){ echo $cp[$i]; echo ","; } 运行结果如下: thinkpad,xiaomi,apple,aaa, 可以看到,使用array函数创建了一个长度为3的数组,第二行使用赋值语句对 $cp[3]进行了赋值,导致数组长度加1,在下面的遍历中输出了4个元素。这种写法在 C语言这类强类型语言中是不被允许的,会导致语法错误。 另外,PHP中的数组还可以以字符串作为下标,这时数组更像哈希表(HashTable)。 符号=>的前面为键,后面为值。后面代码中$age['Tom']的值为35。 $age=array("Tom"=>"35","Ben"=>"37","Joe"=>"43"); echo "Tom is " . $age['Tom']. " years old."; 代码输出如下: Tom is 35 years old. 另外,可以使用以下语法对数组进行遍历: