第2章 PHP开发基础
学习一门语言,首先要学习这门语言的语法,PHP也不例外。本章开始学习PHP的基础知识,它是PHP的核心内容。不论是从事网站制作,还是对应用程序进行开发,没有扎实的基本功是不行的。开发一个功能模块,如果一边查函数手册一边写程序代码,大概需要15天;但基础好的人只需要3~5天,甚至更少的时间。为了将来应用PHP程序开发Web程序节省时间,现在就要认真地从基础学起,牢牢掌握PHP的基础知识。只有做到这一点,才能在以后的开发过程中事半功倍。
本章要点
- PHP标记及注释
- PHP数据类型
- PHP数据的输出
- PHP编码规范
2.1 PHP基本语法
2.1.1 PHP标记符
PHP标记符能够让Web服务器识别PHP代码的开始和结束,两个标记之间的所有文本都会被解释为PHP代码,而标记之外的任何文本都会被认为是普通的HTML,这就是PHP标记的作用。PHP一共支持4种标记风格,分别如下。
PHP 标记符
1.XML风格
<?php
echo "这是标准风格的标记";
?>
这是本书中使用的标记风格,也是推荐读者使用的标记风格。
2.脚本风格
<script language="php">
echo '这是脚本风格的标记';
</script>
在XHTML或者XML中推荐使用这种标记风格,它符合XML语言规范的写法。
3.简短风格
<?
echo "这是简短风格的标记";
?>
这种标记风格最为简单,输入字符最少,但要想使用它,必须更改PHP配置文件php.ini。不推荐使用这种标记风格。
4.ASP风格
<%
echo "这是ASP风格的标记";
%>
这种标记风格和ASP相同,不推荐使用。
注意
如果使用简短风格“<? ?>”和ASP风格“<% %>”,需要分别在配置文件php.ini中做如下设置。将代码段中的“OFF”改为“ON”,更改后的代码如下。
short_open_tag = On asp_tags = On
保存修改后的php.ini文件,然后重新启动Apache服务器,即可支持这两种标记风格。
2.1.2 PHP注释
注释可以理解为代码的解释说明,一般添加到代码的上方或代码的尾部(添加到代码的尾部时,代码和注释之间用<Tab>键分开一定的距离,以方便程序阅读)。使用注释不仅能够提高程序的可读性,而且有利于程序的后期维护工作。在执行代码时,注释部分会被解释器忽略,因此注释不会影响到程序的执行。
PHP 注释
PHP支持以下3种风格的程序注释。
1.单行注释(//)
<?php
echo 'PHP编程词典'; //输出字符串(但单行标记后的注释内容不被输出)
?>
2.多行注释(/…/)
<?php
/*多行
注释内容
不被输出
*/
echo '只会看到这句话。';
?>
注意
多行注释是不允许进行嵌套操作的。
3.Shell风格的注释(#)
<?php
echo '这是Shell脚本风格的注释'; #这里的内容是看不到的
?>
注意
在单行注释里的内容不要出现“?>”的标志,因为解释器会认为它是PHP脚本结束的标志,而去执行注释中“?>”后面的代码。例如
<?php echo '这样会出错的!!!!!' #不会看到?>会看到 ?>
结果为:这样会出错的!!!!!会看到?>
2.1.3 PHP语句和语句块
PHP程序由一条或多条PHP语句构成,每条语句都以英文分号“;”结束。在书写PHP代码的时候,一条PHP语句一般占用一行。虽然一行写多条语句或者一条语句占多行也是可以的,但是这样会使代码的可读性变差,不建议这样做。
如果多条PHP语句之间存在着某种联系,可以使用“{”和“}”将这些PHP语句包含起来形成一个语句块。示例代码如下。
<?php
{
echo "你好PHP";
echo "<br />";
echo date("Y-m-d H:i:s");
}
?>
语句块一般不会单独使用。只有和条件判断语句、循环语句、函数等一起使用时,语句块才会有意义。
2.2 PHP的数据类型
在计算机的世界里,数据是计算机操作的对象。每一个数据都有其类型,具备相同类型的数据才可以进行运算操作。虽然PHP是弱类型语言,但是在某些特定的场合,仍然需要正确的类型。
PHP的数据类型可以分成3种,即标量数据类型、复合数据类型和特殊数据类型。
2.2.1 标量数据类型
标量数据类型是数据结构中最基本的单元,只能存储一个数据。PHP中标量数据类型包括4种,如表2-1所示。
表2-1 PHP中标量数据类型
类 型 |
说 明 |
---|---|
boolean(布尔型) |
这是最简单的类型。只有2个值:真值(true)和假值(false) |
string(字符串型) |
字符串就是连续的字符序列,可以是计算机能表示的一切字符的集合 |
integer(整型) |
整型数据类型只能包含整数,可以是正整数或负整数 |
float(浮点型) |
浮点数据类型用来存储数字。和整型不同的是,它有小数位 |
下面对各个数据类型进行详细介绍。
1.布尔型(boolean)
布尔型是PHP中较为常用的数据类型之一。它保存一个真值true或者假值false。设定一个布尔型的变量,只需将true或者false赋值给变量即可。
布尔型(boolean)
【例2-1】 布尔型变量通常都是应用在条件或循环语句的表达式中。下面在if条件语句中判断变量$b的值是否为true,如果为true,则输出“我们要努力学好PHP”,否则输出“出错!”。
本程序关键代码如下。
<?php
$b = true; //定义布尔型变量
if($b == true) //使用if条件语句判断变量值是否为真
echo "<font color='blue'>我们要努力学好PHP</font>";
else
echo "出错!";
?>
运行结果如图2-1所示。
图2-1 判断变量值是否为真
说明
(1)在PHP中,不是只有false值才为假的。在一些特殊情况下,如0、0.0、“0”、空白字符串( " " )、只声明没有赋值的数组等,它们的布尔值也被认为是false。
(2)$b是定义的变量名称。PHP中的变量名称用$和标识符表示。关于变量的详细介绍,请参考3.2节。
2.字符串型(string)
字符串是连续的字符序列,由数字、字母和符号组成。字符串中的每个字符只占用一字节。在PHP中,定义字符串有以下3种方式。
字符串型(string)
- 单引号(');
- 双引号(");
- 定界符(<<<)。
单引号和双引号是经常被使用的定义方式,定义格式如下。
$a ='string1';
或
$a ="string2";
如果在单引号和双引号定义的字符串中包含变量名,那么它们的输出结果是完全不同的。双引号中所包含的变量名会自动被替换成变量的值,而单引号中包含的变量名则按普通字符串输出。
【例2-2】 分别应用单引号和双引号输出同一个变量,其输出的结果完全不同,双引号输出的是变量的值,而单引号输出的是字符串“$a”。
本实例关键代码如下。
<?php
$a = "你好,欢迎来到PHP的世界!";
echo "<h3>$a</h3>"; //用双引号输出
echo '<h4>$a</h4>'; //用单引号输出
?>
运行结果如图2-2所示。
图2-2 单引号和双引号的区别
说明
在定义简单的字符串时,使用单引号是更加合适的处理方式。如果使用双引号,PHP将花费一些时间来处理字符串的转义和变量的解析。因此,在定义字符串时,如果没有特别的要求,建议尽量使用单引号。
定界符(<<<)是从PHP 4.0开始支持的。定界符用于定义格式化的大文本。格式化是指文本中的格式将被保留,所以文本中不需要使用转义字符。在使用时后接一个标识符,然后是格式化文本(字符串),最后是同样的标识符结束字符串。
定界符格式如下。
<<<str
格式化文本
str
其中,符号“<<<”是关键字,必须使用;str为用户自定义的标识符,用于定义文本的起始标识符和结束标识符,前后的标识符名称必须完全相同。
结束标识符必须从行的第一列开始。也必须遵循 PHP 中其他任何标签的命名规则:只能包含字母、数字、下划线,而且必须以下划线或非数字字符开始。
【例2-3】 应用定界符定义字符串并输出。可以看到,它和双引号没什么区别,字符串中包含的变量也被替换成实际变量的值。
代码如下。
<?php
$i = "PHP";
echo <<<std //使用定界符
Hello ,welcome to here!<p>
Do you like $i?
std; //定界符结束标志
?>
运行结果如图2-3所示。
图2-3 使用定界符定义字符串
注意
结束标识符必须单独另起一行,并且不允许有空格。如果在标识符前后有其他符号或字符,则会发生错误。
3.整型(integer)
整型数据类型只能包含整数。在32位的操作系统中,有效的范围是-2 147 483 648~+2 147 483 647。整型数可以用十进制、八进制和十六进制来表示。如果用八进制,数字前面必须加0;如果用十六进制,则需要加0x。
整型(integer)
【例2-4】 在下面的实例中,分别输出定义的十进制、八进制和十六进制变量的结果。
本实例完整代码如下。
<?php
/*
八进制、十进制和十六进制是相对于整型数据来说的,在
实际应用中并不十分广泛
*/
$str1 = 123; //十进制变量
$str2 = 0123; //八进制变量
$str3 = 0x123; //十六进制变量
echo "数字123不同进制的输出结果:<p>";
echo "十进制的结果是:$str1<br>";
echo "八进制的结果是:$str2<br>";
echo "十六进制的结果是:$str3";
?>
运行结果如图2-4所示。
图2-4 输出八进制、十进制和十六进制数据
注意
如果给定的数值超出了int类型所能表示的最大范围,将会被当作float型处理,这种情况叫作整数溢出。同样,如果表达式的最后运算结果超出了int的范围,也会返回float型。
4.浮点型(float)
浮点数据类型可以用来存储整数,也可以保存小数。它提供的精度比整数大得多。在32位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP 4.0以前的版本中,浮点型的标识为double,也叫双精度浮点数,两者没什么区别。
浮点型(float)
浮点型数据默认有2种书写格式,一种是标准格式,例如
3.14159
0.365
-91.8
还有一种是科学记数法格式,例如
3.62E1
859.63E-3
【例2-5】 下面的实例是输出圆周率的近似值,用了3种书写方法:圆周率函数、传统书写格式和科学记数法。比较3种方法的输出结果。
本实例完整代码如下。
<font face='楷体_gb2312' color='blue'>
<?php
echo "圆周率的三种书写方法:<p>";
echo "第一种:pi() = ".pi()."<p>"; //圆周率函数
echo "第二种:3.14159265359 = ". 3.14159265359 ."<p>"; //传统书写格式
echo "第三种: 314159265359E-11 = ". 314159265359E- 11 ."<p>"; //科学记数法
?>
</font>
运行结果如图2-5所示。
图2-5 输出浮点型的数值
注意
浮点型的数值只是一个近似值,所以要尽量避免在浮点型之间比较大小,因为最后的结果往往是不准确的。
2.2.2 复合数据类型
复合数据类型将多个简单数据类型组合在一起,存储在一个变量名中,包括2种(数组和对象),如表2-2所示。
复合数据类型
表2-2 复合数据类型
类 型 |
说 明 |
---|---|
array(数组) |
就是一组数据的集合 |
object(对象) |
对象是类的实例,使用关键字new来创建 |
1.数组(array)
数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据,如标量数据、数组、对象、资源,以及PHP中支持的其他语法结构等。
数组中的每个数据称为一个元素,元素包括索引(又叫键名)和值两部分。元素的索引可以由数字或字符串组成,元素的值可以是多种数据类型。定义数组的语法格式如下。
$array = ("value1","value2"……)
或
$array[key] = "value";
或
array(key1 => value1, key2 => value2……)
其中,参数key是数组元素的下标(索引),value是数组下标所对应的元素的值。
【例2-6】 PHP数组的下标既可以是数字,也可以是字符串的形式。在下面的实例中使用数字和字符串作为数组的下标,创建一个数组$arr,并且输出数组中的值。
(1)定义变量名为$arr的数组并给数组赋值。
(2)输出数组内容,实例代码如下。
<?php
$arr = array(0 => 1,1 => 2,'hi' => "hello"); //定义数组
//输出数组中的第一个元素。由于数组下标是从0开始计数的,所以第一个元素的下标是0
echo $arr[0];
echo "<br>";
echo $arr['hi'];
?>
运行结果如下。
1
hello
2.对象(object)
现在,编程语言用到的方法有2种:面向过程和面向对象。在PHP中,用户可以自由使用这2种方法。有关面向对象的技术将在后面的章节中进行详细介绍。
特殊数据类型
2.2.3 特殊数据类型
特殊数据类型包括2种:资源和空值,如表2-3所示。
表2-3 特殊数据类型
类 型 |
说 明 |
---|---|
resource(资源) |
又叫作“句柄”,由编程人员来分配,处理外部事务的函数 |
null(空值) |
特殊的值,表示变量没有值,唯一的值就是null |
1.资源(resource)
资源是由专门的函数来建立和使用的。它是一种特殊的数据类型,并由程序员分配。在使用资源时,要及时地释放不需要的资源。如果忘记了释放资源,系统会自动启用垃圾回收机制,避免内存消耗殆尽。
2.空值(null)
空值表示没有为该变量设置任何值。另外,空值(null)不区分大小写,null和NULL效果是一样的。被赋予空值的情况有以下3种。
- 没有赋任何值;
- 被赋值null;
- 被unset()函数处理过的变量。
下面分别对这3种情况举例说明,具体代码如下:
<?php
$a; //没有赋值的变量
$b=null; //被赋空值的变量
$c=10;
unset($c); //使用unset()函数释放变量$c的值,$c的值为空
?>
2.2.4 检测数据类型
PHP还内置了检测数据类型的系列函数,可以对不同类型的数据进行检测,判断其是否属于某个类型。检测数据类型的函数如表2-4所示。
检测数据类型
表2-4 检测数据类型的函数
函 数 |
检 测 类 型 |
---|---|
is_bool |
检测变量是否为布尔类型 |
is_string |
检测变量是否为字符串类型 |
is_float/is_double |
检测变量是否为浮点类型 |
is_integer/is_int |
检测变量是否为整数 |
is_null |
检测变量是否为null |
is_array |
检测变量是否为数组类型 |
is_object |
检测变量是否为一个对象类型 |
is_numeric |
检测变量是否为数字或由数字组成的字符串 |
【例2-7】 下面通过几个检测数据类型的函数来检测相应的字符串类型,具体代码如下。
<?php
$a=true;
$b="你好PHP";
$c=123456;
echo "1. 变量是否为布尔型:".is_bool($a)."<br>"; //检测变量是否为布尔型
echo "2. 变量是否为字符串型:".is_string($b)."<br>"; //检测变量是否为字符串型
echo "3. 变量是否为整型:".is_int($c)."<br>"; //检测变量是否为整型
echo "4. 变量是否为浮点型:".is_float($c)."<br>"; //检测变量是否为浮点型
?>
运行结果如图2-6所示。
图2-6 检测变量数据类型
说明
由于变量$c不是浮点型,所以第4个判断的返回值为false,即空值。
2.3 PHP数据的输出
PHP中最常用的输出语句是echo语句。除了echo语句之外,还可以使用print语句向浏览器中输出数据。在实际的编程过程中,经常使用输出语句对PHP程序进行调试。
PHP数据的输出
2.3.1 print和echo
print语句和echo语句的作用非常相似,都用于向页面中输出数据。例如,应用print语句和echo语句输出数据的代码如下。
print "输出当前的日期和时间:";
echo date("Y-m-d H:i:s");
print语句和echo语句的区别如下。
- 使用print语句一次只能输出一个字符串,而使用echo语句可以同时输出多个字符串,多个字符串之间用逗号隔开。
- 在echo语句前不能使用错误屏蔽运算符“@”。
- print语句可以看作一个有返回值的函数,因此print语句能作为表达式的一部分,而echo语句不能。
2.3.2 输出运算符“<?= ?>”
如果需要在HTML代码中只嵌入一条PHP输出语句,可以使用PHP提供的另一种便捷的方法:使用输出运算符“<?= ?>”来输出数据。例如,将页面的背景颜色设置为蓝色,代码如下。
<body bgcolor="<?='blue'?>">
</body>
2.4 PHP编码规范
很多初学者对编码规范很不以为然,认为对程序开发没有什么帮助,甚至因为要遵循规范而影响了学习和开发的进度;或者因为经过一段时间的使用,已经形成了自己的一套风格,所以不愿意去改变。这种想法是很危险的。
举例说明,如今的Web开发不再是一个人就可以全部完成的,尤其是一些大型的项目,需要十几人甚至几十人来共同完成。在开发过程中,难免会有新的开发人员参与进来,那么这个新的开发人员在阅读前任留下的代码时,就会有问题了——这个变量起到什么作用?那个函数实现什么功能?TmpClass类在哪里用到了……诸如此类。这时,编码规范的重要性就体现出来了。
PHP编码规范
2.4.1 什么是编码规范
以PHP开发为例,编码规范就是融合开发人员长时间积累下来的经验,形成了一种良好统一的编程风格,这种良好统一的编程风格会在团队开发或二次开发时起到事半功倍的效果。编码规范是一种总结性的说明和介绍,并不是强制性的规则。从项目长远的发展以及团队效率来考虑,遵守编码规范是十分必要的。
遵守编码规范的好处如下。
- 编码规范是团队开发成员的基本要求。
- 开发人员可以了解任何代码,理清程序的状况。
- 提高程序的可读性,有利于相关设计人员交流,提高软件质量。
- 防止新接触PHP的人出于节省时间的需要,自创一套风格并养成终生的习惯。
- 有助于程序的维护,降低软件成本。
- 有利于团队管理,实现团队后备资源的可重用。
2.4.2 PHP书写规则
1.缩进
使用制表符(<Tab>键)缩进,缩进单位为4个空格左右。如果开发工具的种类多样,则需要在开发工具中统一设置。
2.大括号{}
有两种大括号放置规则是可以使用的。
- 将大括号放到关键字的下方、同列。
if ($expr)
{
…
}
- 首括号与关键词同行,尾括号与关键字同列。
if ($expr){
…
}
两种方式并无太大差别,但多数人都习惯选择第一种方式。
3.关键字、小括号、函数、运算符
- 不要把小括号和关键字紧贴在一起,要用空格隔开它们。例如
if ($expr){ //if和"("之间有一个空格
…
}
- 小括号和函数要紧贴在一起,以便区分关键字和函数。例如
round($num) //round和"("之间没有空格
- 运算符与两边的变量或表达式要有一个空格(字符连接运算符“.”除外)。例如
while ($boo == true){ //$boo和"=="、true和"=="之间都有一个空格
…
}
- 当代码段较大时,上、下应当加入空白行,两个代码块之间只使用一个空行,禁止使用多行。
- 尽量不要在return返回语句中使用小括号。例如
return 1; //除非是必要,否则不需要使用小括号
2.4.3 PHP命名规则
就一般约定而言,类、函数和变量的名字应该能够让代码阅读者容易地知道这些代码的作用,避免使用模棱两可的命名。
1.类命名
- 使用大写字母作为词的分隔,其他的字母均使用小写。
- 名字的首字母使用大写。
- 不要使用下划线('_')。
如Name、SuperMan、BigClassObject。
2.常量命名
常量的命名应该全部使用大写字母,单词之间用'_'分隔。例如
define('DEFAULT_NUM_AVE',90);
define('DEFAULT_NUM_SUM',500);
3.变量命名
- 所有字母都使用小写。
- 使用'_'作为每个词的分界。
如$msg_error、$chk_pwd等。
4.数组命名
数组是一组数据的集合,它是一个可以存储多个数据的容器。因此在对数组进行命名时,尽量使用单词的复数形式。如$names、$books等。
5.函数命名
函数的命名规则和变量的命名规则相同。所有的名称都使用小写字母,多个单词使用“_”分隔。例如:
function this_good_idear(){
…
}
6.类文件命名
PHP类文件在命名时都是以.class.php为后缀,文件名和类名相同。例如,类名为DbMysql,则类文件名为DbMysql.class.php。
小结
本章主要介绍了PHP语言的基本语法、数据类型以及编码规范。熟练掌握PHP的基本语法是学习PHP语言的第一步。通过本章的学习,读者可以从整体上对PHP的组成部分有一个清楚的认识。
上机指导
首先定义3个变量:$a、$b和$c,然后应用检测数据类型是否为整型的函数is_int()来检测3个变量的值是否为整型。程序运行结果如图2-7所示。
图2-7 检测数据类型
代码如下。
<?php
$a=true; //定义变量$a的值
$b=”欢迎来到PHP的世界"; //定义变量$b的值
$c=123456; //定义变量$c的值
echo “第一个变量是否为整型:".is_int($a)."<br>"; //检测变量$a是否为整型并输出字符串
echo “第二个变量是否为整型:".is_int($b)."<br>"; //检测变量$b是否为整型并输出字符串
echo “第三个变量是否为整型:".is_int($c)."<br>"; //检测变量$c是否为整型并输出字符串
?>
习题
2-1 PHP的标记符支持哪几种标记风格?
2-2 PHP注释种类有哪些?PHP注释的主要作用是什么?
2-3 PHP的数据类型主要有哪几种?
2-4 print语句和echo语句的区别是什么?