···························································· 
第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. 
另外,可以使用以下语法对数组进行遍历: