05模块PHP语言轻松入门

本模块主要介绍PHP语言的基础知识,包括PHP语言基础、变量和常量、数据类型、运算符、流程控制语句、字符串处理、数组、日期时间函数、图像处理函数和其他函数等。


(1) 会编写简单的PHP网页。
(2) 熟悉预定义变量和常量的使用。
(3) 掌握常用字符串处理函数的使用。
(4) 熟悉数组的声明和遍历。
(5) 熟悉PHP内置函数的使用。
(6) 会编写和调用简单自定义函数。
(7) 熟悉PHP图像处理函数的使用。


(1) 文件格式和标记的用法。
(2) 变量的命名、可变变量和预定义变量。
(3) 常量的声明使用和预定义常量。
(4) 整型、浮点型和字符串型等常用数据类型。
(5) 算术、赋值、逻辑和比较等常用运算符。
(6) if、switch和for循环等流程控制语句。
(7) trim()、explode()和strcmp()等字符串处理函数。
(8) 数组的声明、遍历、排序和二维数组等。
(9) date()、getdate()和strtotime()等日期时间函数。
(10) echo()、print()和include()等内置函数以及自定义函数。
(11) getimagesize()、imagecreate()和imagecreatefrompng()等图像处理函数。


知识储备

知识1PHP语言基础
PHP是一种创建动态交互性站点的、强有力的服务器端脚本语言。对于熟悉ASP代码的读者,学习PHP的代码就相对简单,因为PHP代码和ASP代码一样都是嵌入在HTML代码中的,然后通过一定的标记来区分HTML代码、客户端和服务器端代码。
1. PHP文件格式
PHP文件格式非常简单,实质上就是一个文本文件。因此可以通过任何文本编辑工具,如记事本、Dreamweaver等
来编写PHP代码,然后将其保存成扩展名为php的文件即可。
PHP文件无须编译即可运行,只要配置好PHP的运行环境,然后将PHP文件放置在相应的发布目录中,就可以通过浏览器浏览文件了。




一个完整的PHP文件由HTML标记、PHP标记、PHP代码、注释和空格等元素构成。
例如,以下为一个简单PHP程序代码(lt51.php)。

<html>

<head>

<title>Hello World!</title>

</head>

<body>

<?php 

//输出I like php.

echo "I like php.";

?>

</body>

</html>
在以上代码中,<html>和<head>等表示HTML代码,<?php…?>表示PHP标记,“echo"I like php.";”表示PHP代码,“//输出I like php.”表示代码注释。
2. PHP标记
由于PHP嵌入在HTML中,因此需要标记对来区分。通常情况下,可以用以下四种区分方式标记PHP代码。
(1) <?php…?>; 
(2) <?…?>; 
(3) <script language=php>…</script>; 
(4) <%…%>。
当使用<?…?>将PHP代码嵌入HTML文件中时,可能会同XML发生冲突。为了适应XML和其他编辑器,可以在开始的问号后面加上
php使PHP代码适应于XML分析器,如<?php…?>
; 也可以像其他脚本语言那样使用<script language=php>…</script>
脚本标记; 还可以使用<%…%>
脚本标记,但由于这一脚本标记也为ASP语言所采用,所以为了区别ASP和PHP,尽量少使用该脚本标记。本书推荐使用
<?php…?>脚本标记。
3. PHP语法与注释
PHP语法主要借鉴C/C++语言,也部分参考了Java和Perl语言的语法,因此熟悉C/C++语言的读者,可以很快地掌握PHP语法。在书写PHP代码时,每句完整代码后面都要加分号“;”。而对于控制语句,一般不需要加分号“;”,如下面代码。

if(a==b)

echo "a和b一样大";
其中“if(a==b)”语句后面不需要加分号。如果控制语句下面有多行代码,则必须使用大括号“{…}”括起来,如下所示。 

if(a==b)

{

echo " a与b一样大";

echo "欢迎学习php语言";

}
任何一种编程语言,都少不了对代码的注释。因为一个比较好的应用程序源代码,代码注释总是非常详细的。良好的代码注释对后期的维护、升级能够起到非常重要的作用。
在PHP程序中,加入注释的方法很灵活。可以使用C语言、C++语言或者是UNIX的Shell语言的注释方式,还可以混合使用。在PHP中可以使用“//”(C/C++语言注释风格)或者使用“#”(UNIX Shell语言注释风格)来进行单行代码的注释,同时还可以通过“/*…*/”进行大段代码的注释。但是不能嵌套使用“/*…*/”注释符号,否则会出现编译错误。
知识2PHP变量和常量
任何一种编程语言都有变量,变量就是一个保存了一小块数据的“对象”。从变量的字面意思理解,表示该数据块中的值是随时都可以改变的,即在不同的时段内代表不同的实体。
1. 变量的命名
一般来说,每种编程语言都会遵循变量声明的某些规则。这些规则包括变量的最大长度,是否能够包含数字或者字母字符,变量名称是否能够包含特殊字符以及变量名是否能够以数字开头。
在PHP中,对变量名的长度没有任何限制,在变量名中可以使用数字和字母等字符,但是需要满足以下约定。
(1) PHP变量名是区分大小写的,这和C语言是一致的; 
(2) 变量名必须以美元符号($)开始; 
(3) 变量名必须以字母或下画线“_”开头,不能以数字字符开头; 
(4) 变量名只能包含字母、数字、字符以及下画线; 
(5) 变量名不能包含空格。如果变量名由多个单词组成,那么应该使用下画线进行分隔(如$my_string),或者以大写字母开头(如$myString)。
例如变量名$my_name和$_age是合法的变量,而变量名$999和$6_age是不合法的。在给变量命名时,最好让变量名具有一定的含义,能够代表一定的信息,这样有利于阅读源代码,同时也有利于对变量名的引用。
2. 变量的赋值
与很多语言不同,在PHP使用变量前不需要声明变量,只需给变量赋值即可。变量赋值,是指给变量一个具体的数据值,对于字符串和数字类型的变量,可以通过赋值运算符“=”来实现。语法格式如下。

<?php $name=value; ?>
例如: 

<?php

$myname="James";

$yourname="Jackson";

?>
以上代码给变量赋值的方式是直接赋值。除此之外,还有两种给变量赋值的方式: 一种是变量间的赋值,变量间的赋值是指赋值后两个变量使用各自的内存,互不干扰。以下代码演示了变量间的赋值(lt52.php)。

<?php

$myname="James";   //给变量$myname直接赋值

$yourname=$myname;     //使用$myname初始化$yourname

$myname="Jeffery";       //改变变量$myname的值

echo $yourname;          //输出变量$yourname的值

?>
以上代码的输出结果为: James。
从上面的输出结果可以看出,改变变量$myname的值后,变量$yourname的值并没有跟着变化。
另一种是引用赋值,引用的概念是用不同的名字访问同一个变量内容。当改变其中的一个变量的值时,另一个也跟着发生变化。使用&来表示引用。以下代码演示了引用赋值(lt53.php)。

<?php

$myname="James";        //给变量$myname直接赋值

$yourname=&$myname;     //使用引用赋值,此时$yourname的值为"James"

$myname="Jeffery";      //改变$myname的值,此时$yourname的值也变为"Jeffery"

echo $yourname;         //输出变量$yourname的值

?>
以上代码的输出结果为: Jeffery。
从上面输出结果可以看出,改变变量$myname的值后,变量$yourname的值也随之发生了变化。
3. 可变变量
可变变量是一种独特的变量,它允许动态改变一个变量名称。其工作原理是该变量的名称由另外一个变量来确定,实现过程是在变量的前面再多加一个美元符号"$"。以下代码演示了可变变量(lt54.php)。

<?php

$change_name = "temp";		  //声明变量$change_name

$temp = "You can see me!";	  //声明变量$temp

echo $change_name ;     	    	  //输出变量$change_name

echo "&nbsp;&nbsp;" ;

echo $$change_name ;    	    	  //通过可变变量输出$temp的值

?>
以上代码输出结果为: temp You can see me!
以上代码首先定义两个变量$change_name和$temp,并且输出变量$change_name的值,然后使用可变变量来改变变量$change_name的名称(变为$temp),最后输出改变名称后的变量值(变量$temp的值)。
4. 预定义变量
PHP还提供了很多非常实用的预定义变量,通过这些预定义变量可以获取用户会话、客户机操作系统的环境和服务器操作系统的环境信息。常用的预定义变量如表51所示。


表51预定义变量


变量的名称说明


$_SERVER['SERVER_ADDR']当前运行脚本所在服务器的IP地址
$_SERVER['SERVER_NAME']
当前运行脚本所在服务器的主机名称,如果该脚本运行在一个虚拟主机上,则该名称由虚拟主机所设置的值决定
$_SERVER['SERVER_PORT']
服务器所使用的端口,默认值为80
$_SERVER['SERVER_SIGNATURE']
包含服务器版本和虚拟主机名的字符串
$_SERVER['REMOTE_ADDR']
正在浏览当前页面用户的IP地址
$_SERVER['REMOTE_HOST']
正在浏览当前页面用户的主机名
$_SERVER['REMOTE_PORT']
用户连接到服务器所使用的端口
$_SERVER['REQUEST_METHOD']
访问页面时的请求方法,如GET、POST、PUT和HEAD等
$_SERVER['DOCUMENT_ROOT']
当前运行脚本所在的文档根目录
$_SERVER['SCRIPT_FILENAME']
当前执行脚本的绝对路径名
$_COOKIE
通过HTTPCookie传递到脚本的信息
$_SESSION
包含与所有会话变量有关的信息。$_SESSION变量主要应用于会话控制和页面间值的传递
$_POST
包含通过POST方法传递的参数的相关信息。主要用于获取通过POST方法提交的数据
$_GET
包含通过GET方法传递的参数的相关信息。主要用于获取通过GET方法提交的数据
$GLOBALS
由所有已定义全局变量组成的数组。变量名就是该数组的索引。它可以称为所有超级变量的超级集合
5. 常量的声明和使用
常量可以理解为值不变的量。常量值被定义后,在脚本的其他任何地方都不能改变。一个常量由英文字母、下画线和数组组成,但数字不能作为首字母出现。
在PHP中使用define()函数来定义常量,该函数的语法为: 

bool define(string $constant_name, mixed $value [, bool $case_insensitive=False])
该函数有3个参数,constant_name为必选参数,代表常量名称; value也为必选参数,代表常量的值; case_insensitive为可选参数,指定是否大小写敏感。如果设置为True,则该常量大小写不敏感。默认值是大小写敏感的。
获取常量的值有两种方法: 一种是使用常量名直接获取值; 另一种是使用constant()函数,constant()函数和直接使用常量名输出的效果是一样的,但函数可以动态地输出不同的常量,在使用上更加灵活方便。函数的语法格式为: 

Mixed constant(string $constant_name)
参数constant_name为要获取常量的名称,也可为存储常量的变量。如果成功则返回常量的值,否则提示错误信息常量没有被定义。
要判断一个常量是否已经定义,可以使用defined()函数。函数的语法格式为: 

bool defined(string $constant_name)
参数constant_name为要获取常量的名称,成功则返回True,否则返回False。
以下代码演示了常量的声明和使用(lt55.php),运行结果如图51所示。

<?php

define("PI","3.1415926");

echo PI."<BR>";					  //输出常量PI

echo Pi."<BR>";					  //输出Pi,表示没有该常量

define("COUNT","大小写不敏感的字符串",True);

echo COUNT."<BR>";				  //输出常量COUNT

echo Count."<BR>";				  //输出常量COUNT,因为设定大小写不敏感

$name = "count";

echo constant($name)."<BR>"; 	  //输出常量COUNT

echo(defined("PI"))."<BR>"; 	  //如果定义了常量则返回True,输出显示为1

?>


图51常量的声明和使用


6. 预定义常量
PHP可以使用预定义常量获取PHP中的信息。常用的预定义常量如表52所示。


表52预定义常量


常量的名称功 能 说 明


__FILE__
默认常量,PHP程序文件名
__LINE__
默认常量,PHP程序当前行数
PHP_VERSION
内建常量,PHP程序的版本,如4.0.8_dev
PHP_OS
内建常量,执行PHP解析器的操作系统名称,如Windows
TRUE
该常量是一个真值(True)
FALSE
该常量是一个假值(False)
NULL
该常量是一个null值
E_ERROR
该常量指到最近的错误处
E_WARNING
该常量指到最近的警告处
E_PARSE
该常量指到解析语法有潜在问题处
E_NOTICE
该常量为发生不寻常处的提示,但不一定是错误处
 注意: “__FILE__”和“__LINE__”中的“__”是两条下画线,而不是一条下画线“_”。
以下代码演示了预定义常量(lt56.php),运行结果如图52所示。

<?php

echo "当前文件路径: ".__FILE__;

echo "<br>当前行数:".__LINE__;

echo "<br>当前PHP版本信息:".PHP_VERSION;

echo "<br> 当前操作系统: ".PHP_OS ;

?>


图52应用PHP预定义常量输出信息


知识3PHP的数据类型
PHP是一种类型比较弱的语言,这意味着变量可以包含任意给定的数据类型,该类型取决于使用变量的上下文环境。在PHP中,对变量的数据类型不需要声明,可以直接为其赋值,如下所示: 

$number=100;      //表示$number为整型

$str="I like PHP";   //表示$str为字符串型
事实上,PHP中变量数据类型的定义是通过为变量赋值(初始化),由系统自动设定的。PHP中的数据类型分为两种: 一种是标量数据类型,这是编程语言中最常见的简单数据类型; 另一种表示复合数据类型,即将多个简单的数据类型组合在一起,并将它们存储在一个变量名中。在PHP中,标量数据类型有如下几种。
(1) 布尔型(boolean); 
(2) 整型(integer); 
(3) 浮点型(float); 
(4) 字符串(string)。
复合数据类型有如下几种。
(1) 数组(array); 
(2) 对象(object)。
另外,PHP中还有两种特殊的数据类型。
(1) 资源(resource); 
(2) 空值(NULL)。
下面分别介绍这些数据类型。
1. 布尔型
在所有的PHP变量中,布尔型是最简单的变量。布尔变量保存一个True或者False值。其中True或者False是PHP的内部关键字。要设定一个变量为布尔型时,只需要将True或False赋值给该变量,如下所示: 

$my_boolean_var=True;
True和False实际上代表数字1和0,因此True在输出时显示为1,False在输出时显示为0。当转换布尔型时,以下值被认为是False。
(1) 布尔值False; 
(2) 整型值0(零); 
(3) 浮点型值0.0(零); 
(4) 空白字符串和字符串“0”; 
(5) 没有成员变量的数组; 
(6) 空值NULL。
而其他所有值都被认为是True。通常布尔值可以用一些表达式来返回。如“a>b”“a=b”等,可以在条件语句中应用。
2. 整型
整型数据类型只能包含整数。这些数据类型可以是正数也可以是负数。可以在数字前面加上“.”符号来表示负整数。整型数的取值范围是-2147483647~+2147483648。在给一个整型变量赋值的时候,可以采用十进制、十六进制或者八进制形式来指定。十进制就是日常使用的数字; 八进制,数字前必须加上0; 十六进制,数字前必须加0x。例如: 

$int1=100;     //一个十进制整数

$int2=-100;    //一个十进制负数

$int3=0666;    //一个八进制整数

$int4=0x64;    //一个十六进制整数
3. 浮点型
浮点数也称为双精度数或实数(PHP中不使用单精度浮点数)。浮点型数据类型可以用来存储数字,也可以用来保存小数。它提供了比整数大得多的精度。浮点数的字长和平台相关,在PHP中,浮点数可以表示-1.8e308~+1.8e308的数据,并具有14位十进制数字的精度(64位IEEE格式)。
浮点数既可以表示为简单的浮点数常量,如3.14,也可以写成科学记数法的形式,尾数和指数之间用e或E隔开,例如314e-2表示314×10-2,注意这种表示形式基数是10,如果尾数的小数点左边或右边没有数字则表示这一部分为零,如3.e-1、.987等。
4. 字符串
字符串是连续的字符序列,字符串中的每个字符只占用一字节。字符串在每种编程语言中都有广泛的应用。在PHP中,定义字符串有以下三种方式。
(1) 单引号形式。单引号字符串的赋值方式如下。

$str = '我是单引号中的字符串';
如果要将字符串输出到浏览器中,可以使用关键字echo或者print,如下所示。

echo $str;

或者

print $str;

使用单引号表示字符串时,如果要在字符串中显示反斜线和单引号时,应该使用反斜线来进行转义。即输出'\'和'\\'字符串时才能正确显示单引号和反斜线。在用单引号定义字符串中写变量名
时,PHP不会将其按照变量进行处理。例如会将'\$var'直接输出$var。
(2) 双引号方式。双引号字符串的赋值方式如下。

$str = "我是双引号中的字符串";
同理,如果要将字符串输出到浏览器中,也可以使用关键字echo或者print。双引号比单引号支持更多种类的转义字符,如\n(换行),\t(水平制表符,与Tab键相当),\"(显示双引号),\\(显示反斜线),\$(显示一个$符号,否则会被当成变量),\r(回车键)。
使用双引号和单引号都可以定义字符串,但是绝不是说两者就是等价的。当使用单引号时,程序不会首先去判断该字符串中是否含有变量,而是将全部的内容当成字符串来输出。当使用双引号时,程序首先会去判断字符串中是否含有变量,如果含有变量,则直接输出变量的值。
(3) 定界符方式。
定界符采用两个相同的标识符来定义字符串,使用定界符来定义字符串时要特别注意开始和结束符必须相同,标识符必须符合变量的命名规则。使用定界符来定义字符串的时候要特别注意开始标识符前面必须有三个尖括号<<<,结束标识符必须在一行的开始处,前面不能有任何空格或者任何其他多余的字符,开始和结束标识符后面的任何空格都会导致语法错误。
例如下面代码使用定界符方式定义了字符串变量$heredoc_str,通过输出语句echo $heredoc_str; 可以输出该变量的值(lt57.php),运行结果如图53所示。

$xh="03060011";

$xm="张三";

$xb="男";

$heredoc_str =<<<heredoc_mark

<table width="300" border="1" cellspacing="0" cellpadding="0">

 <tr>

<td height="40" align="center">学号</td>

<td align="center">姓名</td>

<td align="center">性别</td>

</tr>

<tr>

<td height="40" align="center">$xh</td>

<td align="center">$xm</td>

<td align="center">$xb</td>

</tr>

</table>

heredoc_mark;

echo $heredoc_str;
注意: 上面代码中的定界符heredoc_mark可以自己命名,只要符合变量命名规则即可。


图53定界符字符串输出结果


定界符和双引号的使用效果相同,也就是说定界符可以直接输出变量的值,同时也支持使用各种转义字符。唯一的区别就是使用定界符定义字符串中的双引号不需要使用转义字符就可以实现。
关于复合数据类型数组和对象,在后面会有专门的章节进行详细介绍。关于特殊数据类型,由于使用频率不高,所以不做详细介绍。
数据类型转换是编程语言的常用功能,通常有以下三种方式进行数据类型转换。
1. 强制类型转换
在变量或值前面加上要转换的类型可以进行强制转换,PHP支持下列几种强制类型转换。
(array)数组
(bool)或(boolean)布尔值
(int)或(integer)整数
(object)对象
(real)或(double)或(float)浮点数
(string)字符串
将一个双进度数强制转换成整数时,将直接忽略小数部分。

$a = (int) 14.8;  //$a = 14
将字符串转换成整数时,取字符串最前端的所有数字进行转换,若没有数字,则为0。

$a = (int) "There is 1 tree."    //$a = 0

$a = (int) "48 trees"    //$a = 48
任何数据类型都可以转换成对象,其结果是,该变量成了对象的一个属性。

$model = "Toyota";

$obj = (object) $model;
然后可以如下引用这个值。

print $obj->scalar;         	  //返回 "Toyota"
2. 类型自动转换
当字符串和数值做加法运算时,字符串转换成数值对应的类型。
若希望数值当成字符串和原有的字符串进行合并操作,可以使用拼接操作符".",例如: 

$a = "This is";

$b = 3;

echo $a.$b;  //输出字符串This is 3
3. 利用类型转换函数进行转换
常用的类型转换函数有以下两种。
1) 获取类型

string gettype(mixed $var)
2) 转换类型

boolean settype(mixed $var, string $type)
函数将var变量转换成type指定的类型。type可以是下列7个值之一: array、boolean、float、integer、null、object、string。如果转换成功,返回True; 否则返回False。
例如: 

$num=12.6; 

$flg=settype($num,"int"); 

var_dump($flg);    //输出bool(true) 

var_dump($num);   //输出int(12)
以上代码中的var_dump()函数为一个简单的判断变量类型的函数,另外还可以使用3个具体类型的转换函数intval()、floatval()和strval()进行类型的转换,例如: 

$str="123.9abc"; 

$int=intval($str);   //转换后数值为123

$float=floatval($str);    //转换后浮点值为123.9 

$str=strval($float);     //转换后字符串为"123.9"
PHP提供一系列函数来识别变量的值是否是指定的类型,具体如下。

is_array()  //是否数组

is_bool()  //是否布尔值

is_float()  //是否浮点数

is_integer()  //是否整数

is_null()  //是否空

is_numeric()  //是否数值

is_object() //是否对象

is_resource()  //是否资源类型

is_scalar()  //是否标量,标量变量仅包含integer、float、string或boolean的变量

is_string()  //是否字符串
以下代码演示了常量类型的判断(lt58.php),运行结果如图54所示。

$a=0.3;

$b='hello';

$c=True;

if (is_numeric($a))

echo '$a是数值型<br>';

else

echo '$a不是数值型<br>';

if (is_int($a))

echo '$a是整型<br>';

else

echo '$a不是整型<br>';

if (is_string($b))

echo '$b是字符串型<br>';

else

echo '$b不是字符串型<br>';

if (is_bool($c))

echo '$c是布尔型<br>';

else

echo '$c不是布尔型<br>';


图54判断变量类型


知识4PHP运算符
运算符是一个特殊符号,它对一个值或一组值执行一个指定的操作。PHP具有C语言、C++语言和Java语言中常见的运算符,这些运算符的优先级也是一致的。
在PHP中包含算术运算符、比较运算符、赋值运算符和逻辑运算符。下面分别详细介绍各种常用的运算符。
1. 算术运算符
算术运算符用来处理四则运算,是最简单和最常用的符号,尤其是数字的处理,几乎都会使用到算术运算符。常见的算术运算符如表53所示。


表53算术运算符


运算符说明例子结果


+
加
$x=2
$x+3
5
-
减
$x=2

6-$x
4
*
乘
$x=2

$x*5
10
/
除
10/5
10/4
2
2.5
%
取余
5%2
10%8
10%2
1
2
0
++
自增
$x=5
$x++
$x=6
--
自减
$x=5

$x--
$x=4
自增和自减运算符既可以放在变量的前面,也可以放在变量的后面。当放在变量的前面时,首先将变量的值加1或者减
1,然后返回变量的值; 当放在变量的后面时,先返回变量的当前值,然后将变量的值加1或者减1。以下代码演示了自增和自减运算符的使用(lt59.php),运行结果如图55所示。

$a=20;

echo "a++:" . $a++ ."<br>";  //后加

echo "变量a的新值:" . $a ."<br>";

$a=20;  //重新赋值

echo "++a:" . ++$a ."<br>";  //先加

echo "变量a的新值:" . $a ."<br>";

$a=20;  //重新赋值

echo "a--:" . $a-- ."<br>";  //后减

echo "变量a的新值:" . $a ."<br>";

$a=20;  //重新赋值

echo "--a:" . --$a ."<br>";  //先减

echo "变量a的新值:" . $a ."<br>";


图55自增和自减运算结果


2. 比较运算符
比较运算符是PHP中运用比较多的运算符。常见的比较运算符如表54所示。


表54比较运算符


运算符说明


==
等于,如果$a等于$b,返回True
===
全等于,如果$a等于$b,同时数据类型也相同,返回True
!=或<>
不等于,如果$a不等于$b,返回True
!==
非全等于,如果$a不等于$b,或者它们的类型不同,返回True
>
大于,如果$a大于$b,返回True
<
小于,如果$a小于$b,返回True
>=
大于或等于,如果$a大于或等于$b,返回True
<=
小于或等于,如果$a小于或等于$b,返回True
3. 赋值运算符
在做简单的操作时,赋值运算符起到把运算结果值赋给变量的作用。在PHP中,除了基本的赋值运算符“=”之外,还提供了若干组合赋值运算符。这些赋值运算符提供了做基本运算和字符串运算的方法。常见的赋值运算符如表55所示。


表55赋值运算符


运算符说明例子展 开 形 式


=
赋值
$x=2
$x=2
+=
加
$x+=2
$x=$x+2
-=
减
$x-/=2
$x=$x-2
*=
乘
$x*=2
$x=$x*2
/=
除
$x/=2
$x=$x/2
.=
连接字符串
$x.="2"
$x=$x."2"
%=
取余数
$x%=2
$x=$x%2
4. 逻辑运算符
逻辑运算符是程序设计中不可缺少的一组运算符。常见的逻辑运算符如表56所示。


表56逻辑运算符


运算符说明


and
逻辑与,$a and $b或$a && $b,如果$a和$b都为True,则返回True
or
逻辑或,$a or $b或$a || $b,如果$a或$b任一为True,则返回True
xor
逻辑异或,$a xor $b,如果$a或$b任一为True,但不同时是,则返回True
not
逻辑非,!$a,如果$a不为True,则返回True
PHP中运算符的优先顺序与C语言、C++语言和Java语言差不多。一般是算术运算优先比较运算,比较运算优先赋值运算,赋值运算优先逻辑运算。
知识5PHP流程控制语句
理论证明,无论多么复杂的逻辑结构,最终都可以简化为三种逻辑的组合。这三种逻辑就是顺序逻辑、选择逻辑和循环逻辑。所以在面向过程的结构化程序设计语言中,都有专门的程序语法来构成这三种结构。
1. 顺序结构程序设计
顺序结构是最简单的程序结构,就是按照程序书写的顺序逐条语句地执行。在此不做赘述。
2. 选择结构
选择程序结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程。使用选择结构语句时,要用条件表达式来描述条件。在PHP中,经常使用的条件语句有: if…else…elseif和switch…case。下面分别对这两种条件语句进行说明。
1) if语句
if语句的基本表达式如下所示。

if(条件表达式)

语句;
在上面基本if语句结构中,如果条件表达式的值为True就执行语句,否则不执行语句。例如: 

if($a>$b)

echo "a大于b";
如果按条件执行的语句不止一条,则需要将这些语句放入语句组中,通过大括号对“{”和“}”括起来。例如: 

if($a>$b)

{

echo "a大于b";

$b=$a;

}
经常需要在满足某个条件时执行一条语句,而不满足该条件时执行其他语句,这正是else的功能。else延伸了if语句,可以在if语句中的表达式的值为False时执行语句。例如: 

if($a>$b){

echo "a大于b";

}else{

echo "a小于b";

}
如果需要同时判断多个条件,则上面的if…else语句满足不了需求,PHP提供了elseif来扩展需求。elseif通常在if和else语句之间。例如: 

<?php

if($a>$b){

echo "a大于b";

}elseif($a == $b){

echo "a等于b";

}else{

echo "a小于b";

}

?>
下面程序代码是一个完整的多分支if语句的应用实例,根据学生的考试成绩输出不同的结果(lt510.php),运行结果如图56所示。

<?php

$chengji=91;

if ($chengji <60)

echo "你不及格";

elseif ($chengji >=60 && $chengji <70)

echo "你刚刚及格了";

elseif ($chengji >=70 && $chengji <80)

echo "你得了良好";

elseif ($chengji >=80 && $chengji <90)

echo "你很优秀哦!";

else

echo "你简直太棒了!"

?>


图56if语句应用实例


2) switch语句
switch语句和具有同样表达式的一系列的if语句相似。很多情况下需要把同一个变量(或表达式)与很多不同的值进行比较,并根据它等于哪个值来执行不同的代码。这正是switch语句的用途。switch语句的语法如下。

switch(表达式)

{

case表达式1:

语句1;

break;

case表达式2:

语句2;

break;

…

case表达式n: 语句n;

default:

语句n+1;

break;

}
switch语句执行时,先求解表达式的值,然后将其值与其后的多个case后面的表达式的值逐个进行比较,如果和第m个相等,则执行语句m、语句m+1,……,直到语句n+1或碰到break语句为止。通常在设计switch语句段时,需要在每个case语句段的最后写上break语句。一个case的特例是default。它匹配了任何其他case都不匹配的情况,并且应该是最后一条case语句。以下代码演示了switch语句的使用(lt511.php),运行结果如图57所示。

<?php

switch (date("D")) {

case "Mon":

echo "今天星期一";

break;

case "Tue":

echo "今天星期二";

break;

case "Wed":

echo "今天星期三";

break;

case "Thu":

echo "今天星期四";

break;

case "Fri":

echo "今天星期五";

break;

default:

echo "今天放假";

break;

}

?>


图57switch语句的使用


3. 循环结构
循环语句用于反复执行一系列的语句,直到条件表达式保持真值。为了保证循环的正确执行,条件表达式中计算的值应该在每次执行循环语句时进行修改。下面分别介绍两种最常用的循环语句。
1) for循环
for循环的语法如下。

for(表达式1; 表达式2; 表达式3)

循环体语句;
如果循环体语句有多条时,要用大括号括起来。在for循环中,先执行一次表达式1。然后判断表达式2的值是否为真,如果值为真,则执行循环体,再执行表达式3。表达式3执行完又返回判断表达式2的值,直到表达2的值为假就此结束循环。以下代码演示了for循环语句的应用(lt512.php),利用for循环计算10的阶乘,运行结果如图58所示。

<?php

$sum = 1;

for ($i = 1;$i <=10;$i++){

$sum *=$i;

}

echo "10!=".$sum;

?>



图58for循环语句的应用


2) while循环
while循环是PHP中最简单的循环类型。while循环的语法为:

while(表达式)

循环体语句;
如果循环体语句有多条时,要用大括号括起来。其执行流程是先判断表达式的值,如果值为真(True)则执行循环体语句,执行完后,程序流程继续开始判断表达式的值,如果值为真,继续执行循环体语句。如此循环执行,直到表达式的值为假(False)为止。如果 while表达式的值一开始就是False,则循环语句一次都不会执行。以下代码演示了while循环语句的应用(lt513.php),利用while循环计算20以内的偶数,运行结果如图59所示。

<?php

$i=1;

$str="20以内的偶数为:";

while($i<=20){

if($i % 2==0){

$str.=$i." ";

}

$i++;

}

echo $str;

?>


图59while循环语句的应用


while循环的另外一种使用方式是do…while。do…while语句的语法为:

do

循环体语句;

while(表达式)
如果循环体语句有多条时,要用大括号括起来。do…while语句的流程是先执行一条循环体语句,后判断表达式的值。如果表达的值第一次就为False,do…while循环也会至少执行一次循环体语句。这是do…while循环与while循环的主要区别。
3) foreach
foreach循环是PHP 4中引入的,只能用于数组。在PHP 5中,又增加了对对象的支持。foreach()有两种用法: 

foreach(array_name as $value)

{

语句块;

}
这里的array_name是要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环会得到下一个元素。

foreach(array_name as $key => $value)   

{       

语句块;     

}  
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。例如book[0]=1中的0,book[id]="001"中的id。以下代码演示了foreach语句的应用(lt514.php),利用foreach语句输出数组中的内容到一个表格中,运行结果如图510所示。

<?php

$book = array("1"=>"联想笔记本","2"=>"数码相机","3"=>"小米9手机","4"=>"瑞士手表");

$price = array("1"=>"4998元","2"=>"2588元","3"=>"2766元","4"=>"76698元");

$counts = array("1"=>2,"2"=>1,"3"=>2,"4"=>2);

echo '<table width="580" border="1">

<tr>

<td width="145" align="center">商品名称</td>

<td width="145" align="center">价格</td>

<td width="145" align="center">数量</td>

<td width="145" align="center">金额</td></tr>';

foreach($book as $key=>$value){   //以book数组做循环,输出键和值

echo '<tr>

<td height="25" align="center">'.$value.'</td>

<td align="center">'.$price[$key].'</td>

<td align="center">'.$counts[$key].'</td>

<td align="center">'.$counts[$key]*$price[$key].'</td></tr>';

}

echo '</table>';

?>


图510foreach语句的应用


PHP常用循环中,经常会遇到需要中止循环的情况。而处理方式主要使用break及continue两个流程控制指令。通过这两个语句可以增强编程的灵活性,提高编程效率,下面分别介绍这两种语句。
1) break语句
结束当前for、foreach、while、do…while、switch结构的执行。break可以接受一个可选的数字参数来决定跳出几重循环。以下代码演示了break语句的应用(lt515.php),运行结果如图511所示。

<?php

 $num = 0;

 while (++$num)

 {

switch ($num)

{

case 5:

echo "At 5<br />\n";

break 1; //只跳出switch循环,1为参数

case 10:

echo "At 10; quitting<br />\n";

break 2;  //跳出while和switch循环,2为参数

default:

break;

}

}

?>


图511break语句的应用


2) continue循环
continue用来跳过本次循环中剩余的代码,并在条件求值为真时开始执行下一次循环。continue还可接受一个可选的数字参数来决定跳过几重循环到循环结尾。以下代码演示了continue语句的应用(lt516.php),运行结果如图512所示。

<?php

$i=0;

while($i++<5)

{

if($i==2) //跳出,也就是不会输出 i am 2

{

continue;

}

echo "i am $i<br>";

}

$i=0;

while($i++<5)

{

echo "外层<br>\n";

while(1)

{

echo"&nbsp;&nbsp;中间层<br>\n";

while(1)

{

echo "&nbsp;&nbsp;&nbsp;&nbsp;内层<br>\n";

$i=6;

continue 3;

}

//因为每次到内层时,就跳到第一层,不会被执行

echo "我永远不会被输出的。<br>\n";

}

echo "我也是不会被输出的。<br>\n";

}

?>


图512continue语句的应用


知识6PHP字符串处理
在PHP编程中,字符串总是会被大量的生成和处理。正确地使用和处理字符串就显得越来越重要了,下面按照功能介绍常用字符串处理函数。
1. 获取字符串长度
获取字符串长度可通过strlen()函数实现,语法格式如下。

int strlen(string $str)
参数str为需要计算长度的字符串,成功则返回字符串str的长度; 如果str为空,则返回0。
例如: 

<?php

$str = 'abcdef';

echo strlen($str);   //字符串的长度为6

$str = ' ab cd ';

echo strlen($str);   //因为有3个空格,所以字符串的长度为7

?>
2. 去除字符串多余空格
用户在输入数据时,经常会无意中输入空格。而在有些情况下字符串中不允许出现空格。这个时候就需要去除字符串中的空格,在PHP中提供了以下函数去除字符串中的空格。
1) trim()函数
trim()函数用于去除字符串开始位置以及结束位置的空格,并返回去掉空格后的字符串。语法格式如下。

string trim(string $str [, string $charlist])
此函数返回字符串$str去除首尾空白字符后的结果。如果不指定第二个参数,trim()函数默认将去除的字符如下。

" " (ASCII为32 (0x20)),普通空格符

"\t" (ASCII为9 (0x09)),制表符

"\n" (ASCII为10 (0x0A)),换行符

"\r" (ASCII为13 (0x0D)),回车符

"\0" (ASCII为0 (0x00)),空字节符

"\x0B" (ASCII为11 (0x0B)),垂直制表符
2) ltrim()函数
ltrim()函数用于去除字符串左边的空格或者指定字符串。其默认去除的字符串同trim()函数一样。该函数的语法格式如下。

string ltrim(string $str [, string $charlist])
3) rtrim()函数
rtrim()函数用于去除字符串右边的空格或者指定字符串。用法同trim()和ltrim()函数一样。该函数的语法格式如下。

string rtrim(string $str [, string $charlist])
3. 字符串的连接和分割
很多时候,需要将一个包含很多信息的字符串分离开来,例如一个字符串中包含有联系人的姓名、性别、年龄以及个人爱好等。在PHP中提供了若干个进行字符串连接和分割的函数。
1) explode()函数
该函数的功能是按照指定的分隔符将一个字符串分开。该函数的语法格式如下。

array explode(string $separator , string $str [, int $limit])
explode函数一共有三个参数,其中第一个参数separator表示分隔符,也就是按照什么原则来进行分割,如果分隔符被设置为空,则函数返回False,如果要被分割的字符串中不包含分隔符,则返回整个原始字符串; 第二个参数str表示要被分割的字符串; 第三个参数limit用来限制被分割后的字符串片段的数量。被分割后的字符串存储在一个数组中。以下代码演示了explode函数的应用(lt517.php),运行结果如图513所示。

<?php

echo "通过空格分隔字符串: <br>";

$str  = "a1 a2 a3 a4 a5 a6";

//通过空格分隔

$str_array = explode(" ", $str);

//输出返回数组的前两个元素

echo $str_array [0] . "<BR>"; //输出a1

echo $str_array [1]. "<BR>"; //输出a2

//将分隔后的元素保存到list变量中

echo "将变量保存在list变量中:<br>";

$data = "myname:*:512:1000";

list($user, $pass, $uid, $gid) = explode(":", $data);

echo $user. "<BR>"; //输出myname

echo $pass. "<BR>"; //输出*

echo "限制分隔的字符串数:<BR>";

$limit="a;b;c;d;e;f;";

$back_array=explode(";",$limit,3);

print_r($back_array);

?>


图513explode()函数的应用


2) implode()函数
implode()函数的作用刚好和explode()函数的作用相反,将一些字符串通过指定的分隔符连成一个字符串。该函数的语法格式如下。

string implode(string $separator , array $str_array)
该函数有两个参数: 第一个参数separator表示连接字符串的连接符号; 第二个参数str_array表示需要连接成字符串的数组。例如: 

<?php

$myarray = array('firstname', 'email', 'phone');

//用逗号分隔符连接数组

$comma_separated = implode(",", $myarray);

echo $comma_separated;

?>
以上代码输出结果如下。

firstname, email, phone
3) substr()函数
substr()函数用于返回一个指定字符串的起始位置和结束位置的子字符串。该函数的语法格式如下。

string substr(string $str , int $start [, int $length])
该函数有三个参数,其中参数str是原始字符串,参数start是子字符串的起始位置,参数length为子字符串的长度。该函数返回需要提取的子字符串。如果省略了参数start,则默认从0开始,即从字符串的第一个字符开始; 如果省略了参数length,则默认提取从起始位置之后的所有字符。例如: 

<?php

$rest = substr("abcdef", 1);   //返回"bcdef"

$rest = substr("abcdef", 0, 4);     //返回"abcd"

//字符串也可以直接通过索引直接访问其字符

$string = 'abcdef';

echo $string{0};                	  //返回a

echo $string{3};                	  //返回d

//使用负数作为起始位置

$rest = substr("abcdef", -1);      //返回"f"

$rest = substr("abcdef", -3, 1);    //返回"d"

?>
4. 字符串比较函数
直接比较字符串是否完全一致,可以使用“==”来进行,但是有时候可能需要进行更加复杂的字符串比较,如部分匹配等。在PHP中提供了若干进行字符串比较的函数。
1) strcmp()函数
strcmp()函数进行字符串之间的比较。该函数的语法格式如下。

int strcmp(string $str1 , string $str2)
该函数对传入的两个字符串参数进行比较,如果两个字符串完全相同,则返回0; 如果按照字典顺序str1在str2后面,则返回一个正数; 如果str1在str2前面,则返回一个负数。例如: 

<?php

$a="i like to fly";

$b="i like to climb";

$back=strcmp($a,$b);

if ($back>0) 

echo '$a大于$b';

elseif ($back<0)

echo '$a小于$b';

else

echo '$a等于$b';

?>
以上代码输出结果为: $a大于$b。
2) strcasecmp()函数
strcasecmp()函数同strcmp()函数基本一致,但是该函数在比较时不区分大小写,而strcmp()函数在比较时是区分大小写的。该函数的语法格式如下。

int strcasecmp(string $str1 , string $str2)
3) strnatcmp()函数
strnatcmp()函数同strcmp()函数基本一致,但是比较的原则有所不同。该函数并不是按照字典顺序排列,而是按照“自然排序”比较字符串。所谓“自然排序”就是按照人们的习惯来进行排序。例如用strcmp()函数来进行排序,“3”会大于“13”,而在实际中,数字“13”要大于“3”,因此strnatcmp()函数是按照后者来进行比较的。该函数的语法格式如下。

int strnatcmp(string $str1 , string $str2)
以下代码演示了字符串比较函数的应用(lt518.php),运行结果如图514所示。

<?php

$arr1 = $arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");

echo "正常比较:<br>";

//usort()函数表示按照指定的函数进行排序

//此处表示用strcmp()函数对数组元素进行排序

usort($arr1, "strcmp");

print_r($arr1);

echo "<br>按照自然数比较<br>";

//使用strnatcmp()函数对数组进行排序

usort($arr2, "strnatcmp");

print_r($arr2);

?>


图514字符串比较函数的应用


4) strnatcasecmp()函数
strnatcasecmp()函数用法同strnatcmp()函数,只是该函数不区分大小写。该函数的语法格式如下。

int strnatcasecmp(string $str1, string $str2)
5. 字符串的查找和替换
在PHP编程中经常要进行字符串的查找和替换等操作,在PHP中提供了若干个进行字符查找和替换的函数。
1) strstr()函数
strstr()函数用于在一个字符串中查找匹配的字符或者字符串。该函数的语法格式如下。

string strstr(string $str , string $search_str)
其中,第一个参数str表示原始字符串; 第二个参数search_str表示要被查询的关键字,即子字符或者字符串。如果找到了search_str的一个匹配,则该函数返回从search_str开始到整个字符串结束的子字符串; 如果没有匹配,则返回False。如果存在不止一个匹配,则返回从第一个匹配位置之后的所有子字符串。例如: 

<?php

$email = 'zhangsan@souhu.com';

$domain = strstr($email, '@');

echo $domain;

?>
以上代码输出结果如下。

@souhu.com
 注意: strstr()函数还有另外一个别名函数,即strchr()函数,这两个函数用法和含义一样。
2) stristr()函数
stristr()函数的使用方法同strstr()函数基本一致,只是该函数是不区分大小写的。该函数的语法格式同strstr()函数一致。
3) strrchr()函数
strrchr()函数的使用方法同strstr()函数基本一致,只是从最后一个被搜索的字符串开始返回。该函数的语法格式同strstr()函数一致。
4) strpos()函数
strpos()函数在原始字符串中查找目标子字符串第一次出现的位置。该函数的语法格式如下。

int strpos(string $str, string $search_str [, int $offset])
该函数返回第一次出现参数search_str的位置。如果没有找到字符串search_str,则返回False。其中,参数offset表示从原始字符串str的第offset个字符开始搜索。例如: 

<?php

$mystring = 'abcde';

$searchme = 'a';

$pos = strpos($mystring, $searchme);

/*注意判断返回值,因为如果查找到为第1个字符,其位置索引为0,和False的值是一样的,因此

在比较变量$pos和False时要使用===(恒等)比较,既要比较变量的值,也要比较变量的类型*/

if ($pos === False) {

echo "没有找到字符串$searchme";

} else {

echo "找到子字符串$searchme";

echo "其位置为 $pos<br>";

}

//设定起始搜索位置

$newstring = 'abcdef abcdef';

$pos = strpos($newstring, 'b', 2); //$pos = 8

echo "设定初始查询位置为2后,查找字符b所处位置: ";

echo $pos;

?>
以上代码输出结果如下。

找到子字符串a 其位置为 0

设定初始查询位置为2后,查找字符b所处位置: 8
5) strrpos()函数
strrpos()函数同strpos()函数用法基本一致。只是返回最后一次出现被查询字符串的位置。该函数的语法格式同strpos()函数一致。
6) str_replace()函数
str_replace()函数将用新的子字符串替换原始字符串中被指定要替换的字符串。该函数的语法格式如下。

mixed str_replace(mixed $search, mixed $replace, mixed $subject [, int $count])
函数的参数search表示要被替换的目标字符串,参数replace表示替换后的新字符串,参数subject表示原始字符串。参数count表示被替换的次数。
知识7PHP数组
数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。PHP中的数组较为复杂,但比其他许多高级语言的数组更灵活。数组array是一组有序的变量,其中每个变量被称为一个元素。每个元素由一个特殊的标识符来区分,这个标识符称为键(也称为下标)。数组中的每个实体都包含两项: 键和值。可以通过键值来获取相应数组元素,这些键可以是数值键或关联键。如果说变量是存储单个值的容器,那么数组就是存储多个值的容器。下面从多方面介绍数组的初始化和使用。
1. 数组的初始化
在PHP中初始化数组的方式主要有两种: 一种是直接通过给数组元素赋值的方式初始化数组; 另一种是使用array()函数初始化数组。
直接通过给数组元素赋值是一种比较灵活的初始化数组的方式,如果在创建数组时不知道所创建数组的大小,或在实际编写程序时数组的大小可能发生改变,采用这种数组创建的方法比较好。例如: 

<?php

$student[0]="Adam";

$student[1]="James";

$student[2]="Simon";

$student[3]="Tommy";

print_r($student);

?>
输出结果如下。

Array([0] => Adam [1] => James [2] => Simon [3] => Tommy)
使用array()函数可以同时为一个数组分配多个值,这种方式初始化数组比直接给数组元素赋值更加高效。可以使用array()函数按照下面的方式来定义数组$student。

$student = array("Adam","James","Simon","Tommy");
在正常情况下,操作数组使用默认下标。这意味着数组的索引正常情况下从0开始,但是,也可以使用“=>”运算符重载默认下标。在上面的例子中,$student数组中有4个元素,其下标分别是0,1,2,3。可以指定下标从1开始,要实现这一点,可以改写$student数组如下: 

$student = array(1=>"Adam","James","Simon","Tommy");
如果此时输出$student数组,输出结果如下。

Array([1] => Adam [2] => James [3] => Simon [4] => Tommy)
以上数组访问时是通过其数字索引,这种数组被称为数字索引数组。而PHP还支持关联数组,在关联数组中,可以将每个变量值与任何关键字或索引关联起来。例如: 

<?php

$student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25);

print_r($student);

?>
输出结果如下。

Array([Adam] => 22 [James] => 23 [Simon] => 24 [Tommy] => 25)
关联数组也支持数字索引,但只要索引中有一个不是数字,那么这个数组就是关联数组。例如$student数组也可以定义为: 

$student = array("Adam"=>22,23=>"James",24=>"Simon","Tommy"=>25);
虽然上面数组中带有数字索引(如23和24),但该数组还是关联数组。
2. 数组的输出和遍历
在PHP中对数组元素进行输出,可以通过输出语句来实现,如echo语句和print语句等,但使用这种输出方式只能对数组中某一元素进行输出。而通过print_r()函数可以将数组结构进行输出。print_r()函数的语法格式如下。

bool print_r(mixed $expression)
如果该函数的参数expression为普通的整型、字符串和实型变量,则输出该变量本身。如果该参数为数组,则按照一定键值和元素的顺序显示出该数组中的所有元素。例如: 

<?php

$student = array("Adam"=>22,23=>"James",24=>"Simon","Tommy"=>25);

print_r($student);

?>
输出结果如下。

Array([Adam] => 22 [23] => James [24] => Simon [Tommy] => 25)
遍历数组中的元素是常用的一种操作,在PHP中遍历数组的方法有多种,下面介绍最常用的两种方法。
1) 使用foreach()语句结构遍历数组
foreach()语句是一个用来遍历数组中数据的最简单、有效的方法。以下代码演示了foreach输出数组元素值(lt519.php),运行结果如图515所示。

<?php

$student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25);

foreach($student as $value){   //以$student数组做循环,输出每个数组元素的值

echo $value ."<br>";

}

?>


图515foreach输出数组元素值


使用foreach()语句结构遍历数组时可以同时将数组的键值(数字和字符索引)和数组元素值输出。以下代码演示了foreach输出数组元素键(下标)和值(lt520.php),运行结果如图516所示。

<?php

$student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25);

foreach($student as $key=>$value){   //以$student数组做循环,输出键和值

echo $key ." 的年龄为 " . $value ."<br>";

}

?>


图516foreach输出数组的键值和元素值


2) 使用list()函数和each()函数遍历数组
list()函数和each()函数通常配合while循环来遍历数组,而且list()函数仅能用于数字索引的数组,且数字索引从0开始。例如: 

<?php

$student = array("Adam"=>22,"James"=>23,"Simon"=>24,"Tommy"=>25);

while(list($key,$val) = each($student)) {

echo $key ." 的年龄为 " . $val ."<br>";

}

?>
运行结果也如图516所示。
3. 数组的应用
数组作为PHP中的一种重要的数据结构,与其相关的应用还有很多,下面主要按功能介绍数组的常用应用。
1) 统计数组元素个数
在PHP中,使用count()函数对数组中的元素个数进行统计。语法格式如下。

int count (mixed $array[,int $mode])
其中array代表要统计的数组。mode为可选参数,当该值取COUNT_RECURSIVE(或1),函数将递归地对数组计数,这对统计多维数组非常有用。mode的默认值为0,此时只能统计一维数组。
2) 数组的排序
在PHP中,提供了一些函数,可以很方便地对数组进行排序。
sort()函数对数组进行排序,语法格式如下。

bool sort(array $array[,int $sort_flags])
参数array代表要排序的数组,可选参数sort_flags,用以下值改变排序的行为。
 SORT_REGULAR: 正常比较单元(不改变类型)。
 SORT_NUMERIC: 元素被作为数字来进行比较。
 SORT_STRING: 元素被作为字符串来进行比较。
 SORT_LOCALE_STRING: 根据当前的区域(locale)设置来把元素当作字符串进行比较。
sort()函数将数组元素从最低到最高重新排序。同时删除数组元素原有的键名并给排序后数组元素赋予新的键名。而不是仅仅将原有键名重新排序。
asort()函数对数组进行排序,保持数组索引和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。成功时返回True,失败时返回False。asort()函数的语法格式同sort()函数一致。
ksort()函数对数组按照键名排序,保留键名到数据的关联。本函数主要用于关联数组。成功时返回True,失败时返回False。ksort()函数的语法格式同sort()函数一致。以下代码演示了数组的排序(lt521.php),运行结果如图517所示。

<?php

//sort排序

echo "sort排序:";

$fruits = array("lemon", "orange", "banana", "apple");

sort($fruits);

foreach ($fruits as $key => $val) {

echo " $key = $val  "; 

}

//asort排序

echo "<br>asort排序:";

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

asort($fruits);

foreach ($fruits as $key => $val) {

echo " $key = $val  ";

}

//ksort排序

echo "<br>ksort排序:";

$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");

ksort($fruits);

foreach ($fruits as $key => $val) {

echo " $key = $val  ";

}

?>


图517数组排序的应用


与数组排序相关的函数还有rsort()、arsort()和krsort()函数。这三个函数的用法分别同sort()、asort()和ksort()函数类似,只是排序方向相反。
4. 多维数组
可以在另外一个数组中保存不同的变量以及完整的数组,数组的元素若是数组,那么这个数组就是多维数组。若一维数组的元素是一维数组,则该数组就是二维数组。同样,若二维数组的元素是数组,则该数组为三维数组,以此类推可以得到四维数组甚至更高维数组。但二维数组是最常用的。
数组的维数没有限制,数组的维数也可以组合。例如,可以让数组的第一维用整数作为索引,第二维使用字符串作为索引,第三维用整数作为索引等。要访问多维数组的某个元素时需要用到多个下标,例如访问二维数组中的某个元素就需要两个下标。以下代码演示了二维数组的应用(lt522.php),运行结果如图518所示。

<?php

$student=array("0"=>array("name"=>"James","sex"=>"male","age"=>"28"),

"1"=>array("name"=>"John","sex"=>"male","age"=>"25"),

"2"=>array("name"=>"Susan","sex"=>"female","age"=>"24"));

Print_r($student);

echo "<br>";

Print $student[2][age];

?>


图518二维数组的应用


知识8PHP日期和时间函数
日期和时间的处理是PHP编程不可缺少的一部分。很多时候都需要对时间进行编程,如显示当前时间、将时间保存进数据库、从数据库中根据时间进行查询等。
1. 获取日期和时间
在PHP中,要获取当前的日期和时间非常简单,只需使用date()函数即可。date()函数的语法格式如下。

String date(string $format [, int $timestamp])
返回按照指定格式显示的时间字符串。其中参数format为显示格式,而参数timestamp为时间戳。如果没有给出时间戳则使用本地当前时间。timestamp为可选参数,默认值为time()。其中format的选项很多,具体设置如表57所示。


表57format参数的设置


参数值说明应用


日期格式的设置

d
月份中的第几天,有前导零的2位数字
01~31
j
月份中的第几天,没有前导零的数字
1~31
D
星期中的第几天,文本表示的3个字母
Mon到Sun
l(L的小写字母)
星期几,完整的文本格式
Sunday到Saturday
N
ISO8601格式数字表示的星期中的第几天
1(星期一)~7(星期日)
w
星期中的第几天
0(星期日)~6(星期六)
z
年份中的第几天
0~366
S
每月天数后面的英文后缀,2个字符
st、nd、rd或者th。可以和j一起使用
续表



参数值说明应用


月份格式的设置

F
月份,完整的文本格式
January到December
M
3个字母表示的月份
Jan到Dec
m
数字表示的月份,有前导零
01~12
n
数字表示的月份,没有前导零
1~12
t
给定月份所对应的天数
28~31
年份格式的设置

L
是否为闰年
是闰年为1,否则为0
Y
4位数字完整表示的年份
例如: 1998或者2012
y
2位数字完整表示的年份
例如: 98或者12
时间格式的设置

a
小写的上午和下午值
am或者pm
A
大写的上午和下午值
AM或者PM
g
小时,12小时格式,没有前导零
1~12
h
小时,12小时格式,有前导零
01~12
G
小时,24小时格式,没有前导零
0~23
H
小时,24小时格式,有前导零
00~23
i
有前导零的分钟数
00~59
s
有前导零的秒数
00~59
U
从UNIX纪元(January 1 1970 00: 00: 00 GMT)开始至今的秒数
date('U')返回一个长整数型秒数
以下代码演示了日期时间函数的应用(lt523.php),运行结果如图519所示。

<?php

//设置PHP语言时区为Asia/Shanghai,这样读取的时间没有时间差

date_default_timezone_set("Asia/Shanghai");

//输出类似: Monday

echo date("l") . "<br>";

//输出类似: Tuesday 22nd of January 2013 10:35:55 PM

echo date('l dS \of F Y h:i:s A'). "<br>";

echo date('\i\t \i\s \t\h\e jS \d\a\y.'). "<br>";

echo date("F j, Y, g:i a"). "<br>";

echo date("m.d.y"). "<br>";

echo date("j,n,Y"). "<br>";

echo date('h-i-s, j-m-y'). "<br>";

echo date('Y年m月d日'). "<br>";

echo date("H:i:s"). "<br>";

//输出由年、月、日、时、分、秒,组合的字符串

echo date("YmdHis"). "<br>";

echo date("Y-m-d H:i:s"). "<br>";

?>


图519date函数的应用


在PHP语言中默认设置的是标准的格林尼治时间(即采用的是零时区),该时间比系统时间少8小时。所以要获取本地时间必须更改PHP语言中的时区设置,更改PHP时区设置的函数如下。

date_default_timezone_set($timezone);
参数timezone为PHP可识别的时区名称,在PHP手册中提供了各种时区[1]名称列表,其中,设置我国北京时间可以使用的时区包括PRC(中华人民共和国)、Asia/Chongqing(重庆)、Asia/Shanghai(上海)或者Asia/Urumqi(乌鲁木齐),这几个时区名称是等效的。
2. 使用getdate()函数获得日期信息
getdate()函数用于取得日期时间信息,语法格式如下。

array getdate([int $timestamp])
返回一个根据timestamp得出的包含日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。返回的数组元素如表58所示。


表58getdate()函数返回的关联数组元素说明


键名说明


seconds
秒,返回值为0~59
minutes
分钟,返回值为0~59
hours
小时,返回值为0~23
mday
月份中的第几天,返回值为1~31
wday
星期中的第几天,返回值为0(星期日)~6(星期六)
mon
月份数字,返回值1~12
year
4位数字表示的完整年份,返回的值如2013
yday
一年中的第几天,返回值为0~366
weekday
星期几的完整文本表示,返回值为Sunday到Saturday
month
月份的完整文本表示,返回值为January到December
以下代码演示了getdate()函数的应用(lt524.php),运行结果如图520所示。

<?php

date_default_timezone_set("Asia/Shanghai");

$arr_date = getdate();

echo $arr_date[year]."-".$arr_date[mon]."-".$arr_date[mday]." ";

echo $arr_date[hours].":".$arr_date[minutes].":".$arr_date[seconds]." ".$arr_ date[weekday];

echo "<br>";

echo "Today is the $arr_date[yday]th of year";

?>


图520getdate()函数的应用


3. 使用mktime()函数取得一个日期的时间戳
PHP使用mktime()函数将一个时间转换成UNIX的时间戳值。时间戳是一个长整数,包含了从UNIX纪元(January 1 1970 00:
00:00 GMT)到给定时间的秒数。该函数的语法格式如下。

int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。参数说明如表59所示。


表59mktime()函数的参数说明


键名说明


hour
小时数
minute
分钟数
second
秒数(一分钟之内)
month
月份数
day
天数
year
可以是两位或四位数字,0~69对应于2000~2069,70~100对应于1970~2000
is_dst
参数is_dst在夏令时可以被设置为1,如果不是则设置为0; 如果不确定为夏令时则设置为-1(默认值)

mktime()函数对于日期运算和验证非常有用。它可以自动校正越界的输入。以下代码演示了mktime()函数的应用(lt525.php),运行结果如图521所示。

<?php

echo date("M-d-Y",mktime(0,0,0,12,36,2011))."<br>";

echo date("M-d-Y",mktime(0,0,0,14,1,2011))."<br>";

echo date("M-d-Y",mktime(0,0,0,1,1,2011))."<br>";

echo date("M-d-Y",mktime(0,0,0,1,1,13))."<br>";

?>


图521mktime()函数的应用


4. 日期和时间的应用
1) 比较两个时间的先后
在实际的开发中经常会对两个时间的先后进行判断,PHP中的时间是不可以直接进行比较的。所以需要将时间解析为时间戳的格式,然后再进行比较。在PHP中将时间解析为时间戳的函数是strtotime(),其语法格式如下。

int strtotime(string $time[,int $now])
该函数有两个参数。如果参数time的格式是绝对时间,则now参数不起作用; 如果参数time的格式是相对时间,那么其对应的时间就是参数now来提供的; 如果没有提供参数now,对应的时间为当前时间。成功则返回时间戳,否则返回False。
以下代码利用strtotime函数实现两个时间的比较(lt526.php),运行结果如图522所示。

<?php

date_default_timezone_set("Asia/Shanghai");

$datetime1 = date("Y-m-d H:i:s");

$datetime2 = "2012-12-23 17:30:02";

echo "变量\$datetime1的时间为: ".$datetime1."<br>";

echo "变量\$datetime2的时间为: ".$datetime2."<br>";

if((strtotime($datetime1) - strtotime($datetime2)) < 0){

echo "\$datetime1 早于 \$datetime2 ";

}else{

echo "\$datetime1 晚于 $datetime2 ";

}

?>


图522使用strtotime()函数比较两个时间的先后


2) 实现倒计时功能
利用strtotime()函数除了可以比较两个日期的先后,还可以精确地计算出两个日期的差值。以下代码利用strtotime()函数实现倒计时功能(lt527.php),运行结果如图523所示。

<?PHP

$time1 = strtotime(date("Y-m-d H:i:s"));

$time2 = strtotime("2020-5-1 17:10:00");

$time3 = strtotime("2020-10-1");

$sub1 = ceil(($time2 - $time1) / 3600);	  //1小时等于60×60秒

$sub2 = ceil(($time3 - $time1) / 86400);	  //1天等于60×60×24秒

echo "离2020年五一国际劳动节放假还有<font color=red> $sub1 </font>小时!!!" ;

echo "<br>";

echo "离2020年国庆节还有<font color=red>$sub2 </font>天!!!";

?>


图523计算两个时间的差值


3) 计算页面脚本的运行时间
要计算PHP程序的执行时间需要使用到microtime()函数,该函数返回当前UNIX时间戳和微秒数。返回格式为"msec sec"的字符串,其中sec是自UNIX纪元(January 1 1970 00:00:00 GMT)起到现在的秒数,msec是微秒部分。字符串的两部分都是以秒为单位返回的。函数语法格式如下。

mixed microtime(void)
以下代码利用microtime()函数计算页面的执行时间(lt528.php),运行结果如图524所示。

<?PHP

$pagestartime=microtime();

$time1 = strtotime(date("Y-m-d H:i:s"));

$time2 = strtotime("2020-5-1 17:10:00");

$time3 = strtotime("2020-10-1");

$sub1 = ceil(($time2 - $time1) / 3600);	  //60 * 60

$sub2 = ceil(($time3 - $time1) / 86400);	  //60 * 60 * 24

echo "离2020年五一国际劳动节放假还有<font color=red> $sub1 </font>小时!!!" ;

echo "<br>";

echo "离2020年国庆节还有<font color=red>$sub2 </font>天!!!<br>";

$pageendtime = microtime();

$starttime = explode(" ",$pagestartime);

$endtime = explode(" ",$pageendtime);

$totaltime = $endtime[0]-$starttime[0]+$endtime[1]-$starttime[1];

$timecost = sprintf("%s",$totaltime);

echo "页面运行时间: $timecost 秒";

?>


图524计算页面的执行时间


知识9PHP函数
在开发过程中,经常要重复某种操作或处理,如数据查询、字符操作等。这些重复和独立的操作就可以使用函数来实现,PHP函数主要分为内置函数、自定义函数和变量函数。
1. 内置函数
PHP中有许多使用频率很高的内置函数,下面分别介绍这些函数。
1) echo()函数
echo()函数用于输出一个或者多个字符串,其语法格式如下。

void echo(string $arg1 [, string $…])

严格来说echo()并不是一个函数,而是一个语言结构,因此不一定要使用小括号来指明参数,单引号或双引号都可以。另外,如果想给echo()传递多个参数,那么就不能使用小括号。以下代码演示了echo函数的应用(lt529.php),运行结果如图525所示。

<?php

//输出字符串,字符串放在双引号和单引号中都可以

echo "Hello World<br>";

echo 'How do you do<br>';

//可以在字符串中输出变量的值,但变量必须放在双引号字符串中

$foo = "football";

$bas = "basketball";

echo "foo is $foo<br>";      //foo is football

echo 'foo is $foo<br>';      //foo is $foo

//也可以用字符串连接符"."连接变量输出

echo "bas is ".$bas."<br>"; //bas is basketball

//可以用echo输出数组元素

$baz = array("key" => "volleyball");

echo "vol is {$baz['key']} !<br>"; //vol is volleyball !

?>


图525echo()函数的应用



2) print()函数
另外一个常用的输出函数名为print,其语法格式如下。

int print(string $arg)
该函数总是返回1。严格来说print也不是一个函数,而是一个语法结构,因此输出的时候参数不需要括号。print语句的用法同echo类似,在此不再赘述。
3) include()和require()函数
include()函数在PHP网页设计中非常重要。它可以很好地实现代码的可重用性,同时还可以简化文件代码。include语句包含并运行指定文件,假如现在有文件a.php,在a.php中包含b.php文件,此时只需在a.php文件中使用“include 'b.php';”语句即可。当服务器执行a.php到这一行的时候,就会自动读取b.php文件并执行其中的代码。
此方法非常有用,如在网页设计中,很多时候,大部分页头和页尾都是一样的。为了减少每个网页的代码重用,可以将页头和页尾分别做成header.php和footer.php页面。然后在页面中包含该页面,代码如下所示。

<?php

include 'header.php';

//其他代码

include 'footer.php';

?>
另外,在PHP编程时也经常将一些常用的访问数据库函数写到一个文件中,然后用include函数将这个文件导入即可。
require()函数的用法和include()函数基本一样。这两种结构除了在如何处理失败之外完全一样。include()产生一个警告而require()则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用require()。include()就不是这样,脚本会继续运行。
2. 自定义函数
1) 定义和调用函数
函数,就是将一些重复使用的功能写在一个独立的代码块中,在需要时单独调用。创建函数的基本语法格式如下。

function fun_name($arg1,$arg2,…,$argn){

fun_body;

}

其中,function为声明自定义函数时必须使用到的关键字; fun_name为自定义函数的名称; arg1,arg2,…,argn为函数的参数; fun_body为自定义函数的主体,是功能实现部分。
当函数被定义好后,所要做的就是调用这个函数。调用函数的操作十分简单,只需要引用函数名并赋予正确的参数即可完成函数的调用。例如: 

<?php

function square($num){

return "$num * $num = ".$num * $num;

}

echo square(5);

?>
以上代码执行结果为: 5*5=25。
2) 在函数间传递参数
在调用函数时,需要向函数传递参数,被传入的参数称为实参,而函数定义的参数为形参。参数传递的方式有按值传递、按引用传递和默认参数三种。
按值传递方式将实参的值复制到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到形参,即函数返回后,实参的值不会改变。例如: 

<?php

function fun($m){                 //定义一个函数

$m = $m * 8 + 10;

echo "在函数内: \$m = ".$m;         //输出形参的值

}

$m = 1;

fun($m);                           //传值: 将$m的值传递给形参$m

echo "<br>在函数外: \$m = $m";      //实参的值没有发生变化,输出m=1

?>
以上代码执行结果如下。

在函数内: $m = 18

在函数外: $m = 1
按引用传递方式将实参的内存地址传递到形参中,在函数内部的所有操作都会影响到形参的值,即函数返回后,实参的值会发生变化。引用传递方式就是传值时在原基础上加&号即可。例如: 

<?php

function fun(&$m){                    //定义一个函数

$m = $m * 8 + 10;

echo "在函数内: \$m = ".$m;           //输出形参的值

}

$m = 1;

fun($m);                           	  //传值: 将$m的内存地址传递给形参$m

echo "<br>在函数外: \$m = $m";    	  //实参的值发生了变化,输出$m=18

?>
以上代码执行结果如下。

在函数内: $m=18

在函数外: $m=18
还有一种设置参数的方式,即默认参数(可选参数)。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且指定其默认值。例如: 

<?php

function fun($price,$tax="1"){

$price=$price+($price*$tax);

echo "价格:$price<br>";

}

fun(100,0.35);     	  //为可选参数赋值0.35

fun(100);          	  //没有给可选参数赋值时使用默认参数

?>
以上代码执行结果如下。

价格:135

价格:200
 注意: 当使用默认参数时,默认参数必须放在非默认参数的右侧,否则参数可能出错。
3) 从函数中返回值
通常函数将返回值传递给调用者的方式是使用关键字return。return将函数的值返回给函数的调用者,即将程序控制权返回到调用者的作用域。如果在全局作用域内使用return关键字,那么将终止脚本的执行。例如: 

<?php

function fun($price,$tax=0.35){	  //定义一个函数,函数中的一个参数有默认值

$price=$price+($price*$tax); 	  //计算金额

return $price;					  //返回金额

}

echo fun(100);						  //调用函数

?>
以上代码执行结果为: 135。
return只能返回一个结果,不能一次返回多个结果。如果返回多个结果,就要在函数中定义一个数组,将返回值存储在数组中返回。
4) 对函数的引用
引用不仅可以用于普通变量、普通参数,也可以作用于函数本身。对函数的引用,就是对函数返回结果的引用。例如: 

<?php

function &fun($temp_str=0){			  //定义一个函数,别忘了加"&"符

return $temp_str;					  //返回参数$temp_str

}

$str = &fun("函数引用");	    			  //声明一个函数的引用$str

echo $str."<br>";

?>
以上代码执行结果为: 函数引用。
在上面代码中,首先定义一个函数,这里需要在函数名前加“&”符号,接着变量$str将引用该函数,最后输出该变量$str,实际上就是$temp_str的值。
5) 取消引用
当不再需要引用时,可以取消引用。取消引用使用unset()函数,它只是断开了变量名和变量内容之间的绑定,而不是销毁变量内容。以下代码演示了unset函数的应用(lt530.php),运行结果如图526所示。

<?php

$str = "I like PHP";				      //声明一个字符串变量

$math = &$str;						  //声明一个对变量$str的引用$math

echo "\$math is:  ".$math."<br>";	  //输出引用$math

unset($math);						  //取消引用$math

echo "\$math is: ".$math."<br>";	      //再次输出引用

echo "\$str is:  ".$str;			      //输出原变量

?>


图526unset()函数的应用


以上代码首先声明一个变量($str)和对变量的引用($math),输出引用后取消引用,再次调用引用和原变量。可以看到,取消引用后对原变量没有任何影响。
3. 变量函数
PHP支持变量函数的概念。这意味着如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且将尝试执行它。除了别的事情以外,这个可以被用于实现回调函数、函数表等。变量函数不能用于语言结构,例如echo()、print()、unset()、isset()、empty()、include()、require()以及类似的语句。需要使用自己的外壳函数来将这些结构用作变量函数。以下代码演示了变量函数的应用(lt531.php),运行结果如图527所示。

<?php

function comm() {					  //定义comm函数

echo "I like PHP<br>";

}

function like($name = "jack") {	  //定义like函数

echo $name." like PHP<br>";

}

function hate($name)				  //定义hate函数

{

echo "$name hate PHP<br>";

}

$func = "comm";						  //声明一个变量,将变量赋值为"comm"

$func(); 							  //使用变量函数来调用函数comm()

$func = "like";						  //重新给变量赋值

$func("James"); 					  //使用变量函数来调用函数like()

$func = "hate";						  //重新给变量赋值

$func("John");						  //使用变量函数来调用函数hate();

?>


图527变量函数的应用


知识10PHP图像处理函数
1. 获取图像信息

获取图像信息的函数有getimagesize()、imagesx()和imagesy()等。
getimagesize()函数将测定任何gif、jpg、png、swf、swc、psd、tiff、bmp、iff、jp2、jpx、jb2、jpc、xbm或wbmp格式的图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通HTML文件中img标记中的height/width文本字符串。该函数的语法格式如下。

array getimagesize(string $filename [, array &$imageinfo])
该函数有两个参数,参数filename表示图片路径,可选参数 imageinfo允许从图像文件中提取一些扩展信息。getimagesize()函数可结合list()函数一起使用获取图像信息,如下面代码(lt532.php)可以获取图片信息(宽、高、文件类型和IMG标记文本字符串)分别放在四个变量$width、$height、$type、$attr中。

<?php

list($width, $height, $type, $attr) = getimagesize("img/flag.jpg"); //获取图像信息

echo $width."&nbsp;&nbsp;";   //输出图像宽度

echo $height."&nbsp;&nbsp;";  //输出图像高度

echo $type."<br>";           //输出图像类型

echo $attr;                  //输出图像height/width文本字符串

?>
以上代码输出结果如下。

300  400  2

width="300" height="400"
 imagesx()函数用于取得图像宽度,该函数的语法格式如下。

int imagesx(resource $image)
imagesx()返回image所代表的图像的宽度。
 imagesy()函数用于取得图像高度,该函数的语法格式及用法和imagesx()基本相同。
2. 创建图像和销毁图像
创建图像的函数有imagecreate()和imagecreatetruecolor()。
 imagecreate()用于新建一个基于调色板的图像,该函数的语法格式如下。

resource imagecreate(int $x_size, int $y_size)
 imagecreate()返回一个图像标识符,代表了一幅大小为x_size和y_size的空白图像。
 imagecreatetruecolor()用于新建一个真彩色图像,该函数的语法格式如下。

resource imagecreatetruecolor(int $width, int $height)
 imagecreatetruecolor()返回一个图像标识符,代表了一幅大小为width和height的黑色图像。
imagecreate()和imagecreatetruecolor()两者在改变背景颜色时有些区别,imagecreatetruecolor()需要用imagefill()来填充颜色,不填充时为黑色。而imagecreate()必须用imagecolorallocate()添加背景色。
下面代码(lt533.php)使用imagecreatetruecolor()函数创建一个红色的方块。

<?php

$img = imagecreatetruecolor(100,100);        //创建真彩图像资源

$color = imagecolorallocate($img,255,0,0);    //给图像分配颜色

imagefill($img,0,0,$color);            //从左上角开始填充颜色

header('content-type:image/jpeg');     //指定输出内容为jpeg格式图片

imagejpeg($img);                      //输出图像到浏览器

imagedestroy($img);               //销毁图像

?>
下面代码(lt534.php)使用imagecreate()函数创建一个红色的方块。

<?php

$img = imagecreate(100,100);         //创建大小为100×100的图像

imagecolorallocate($img,255,0,0);      //给图像分配颜色

header('content-type:image/jpeg');       //指定输出内容为jpeg格式图片

imagejpeg($img);                    //输出图像到浏览器

imagedestroy($img);                 //销毁图像

?>
要销毁已经创建的图像资源可以使用imagedestroy()函数。函数语法格式如下。

bool imagedestroy(resource $image)
imagedestroy()释放与image关联的内存。image是由图像创建函数返回的图像标识符。
如上面两段代码中由imagecreatetruecolor或imagecreate创建的图像标识符$img。
3. 载入图像
常用的载入图像函数如下: 
 imagecreatefromjpeg()用于创建一块画布,并从jpg格式文件、jpeg文件或URL地址载入一幅图像。
 imagecreatefrompng()用于创建一块画布,并从png格式文件或URL地址载入一幅图像。
 imagecreatefromgif()用于创建一块画布,并从gif格式文件或URL地址载入一幅图像。
 imagecreatefrombmp()用于创建一块画布,并从bmp格式文件或URL地址载入一幅图像。
imagecreatefromjpeg()函数的语法格式如下。

resource imagecreatefromjpeg(string $filename)
imagecreatefromjpeg()返回一图像标识符,代表了从给定的文件路径filename中取得的图像,其他几个载入图像函数的语法格式基本相同。
4. 输出图像
常用的输出图像函数如下。
 imagepng()以png格式将图像输出到浏览器或文件。
 imagejpeg()以jpeg格式将图像输出到浏览器或文件。
 imagegif()以gif格式将图像输出到浏览器或文件。
 imagebmp()以bmp格式将图像输出到浏览器或文件。
imagepng()函数的语法格式如下。

bool imagepng(resource $image [, string $filename ])
imagepng()将GD图像流(image)以png格式输出到标准输出(通常为浏览器),如果用filename给出了文件名则将其输出到该文件,其他几个输出图像函数的语法格式基本相同。如下面代码(lt535.php)可输出图像到浏览器或文件。

<?php

$image = imagecreatefrompng("img/flag.png");   //载入png格式图像

header('content-type:image/png');          //指定输出内容为png格式图片

imagepng($image);                     //输出图像到浏览器

imagepng($image, "img/test.png");        //输出图像到文件(img/test.png)

imagedestroy($image);                  //销毁图像

?>
5. 分配和取消图像颜色
为图像分配颜色的函数有imagecolorallocate()和imagecolorallocatealpha(),取消图像颜色分配的函数有imagecolordeallocate()。
 imagecolorallocate()函数用于为图像分配颜色,该函数的语法格式如下。

int imagecolorallocate(resource $image, int $red, int $green, int $blue)
imagecolorallocate()返回一个标识符,代表了由给定的 RGB 成分组成的颜色。red、green 和blue分别是所需颜色的红、绿、蓝成分。这些参数为0~255的整数或者十六进制的0x00~0xFF。imagecolorallocate()必须被调用以创建每一种用在image所代表的图像中的颜色。
 imagecolorallocatealpha()函数用于为图像分配颜色和透明度,该函数的语法格式如下。

int imagecolorallocatealpha(resource $image, int $red, int $green, int $blue, int $alpha)
imagecolorallocatealpha()的行为和imagecolorallocate()相同,但多了一个额外的透明度参数alpha,其值为0~127。0表示完全不透明,127表示完全透明。
 imagecolordeallocate()函数用于取消图像颜色分配,该函数的语法格式如下。

bool imagecolordeallocate(resource $image, int $color)
该函数取消先前由imagecolorallocate()或imagecolorallocatealpha()分配的颜色。
6. 复制和合并图像
复制和合并图像的函数有imagecopy()、imagecopyresized()、imagecopyresampled()、imagecopymerge()和imagecopymergegray()。
 imagecopy()函数用于复制图像的一部分。该函数的语法格式如下。

bool imagecopy(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h)
该函数将src_im图像中坐标从src_x、src_y开始,宽度为src_w,高度为src_h的一部分复制到dst_im图像中坐标为dst_x和dst_y的位置上。如以下代码(lt536.php)用imagecopy()实现图片水印,运行结果如图528所示。

 <?php

function mark_pic($background, $waterpic, $x, $y){ 

$back=imagecreatefromjpeg($background);  //载入jpg格式图像

$water=imagecreatefrompng($waterpic);    //载入png格式图像

$w_w=imagesx($water);     //获得图像宽度

$w_h=imagesy($water);     //获得图像高度

imagecopy($back, $water, $x, $y, 0, 0, $w_w, $w_h); //复制图像

imagejpeg($back,"img/mark_pic.jpg"); //输出图片到文件

header("Content-type: image/jpeg");  //指定输出内容为jpeg格式图片

imagejpeg($back);                //输出图片到浏览器

imagedestroy($back);              //销毁图像

imagedestroy($water);             //销毁图像

 } 

mark_pic("img/penguins.jpg", "img/water.png", 50, 100);

?>


图528图片水印


 imagecopyresized()函数用于复制部分图像并调整大小,该函数的语法格式如下。

bool imagecopyresized(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, 
int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h)
该函数将src_im图像中坐标从src_x、src_y开始,宽度为src_w,高度为src_h的一部分复制到dst_im图像中坐标为dst_x和dst_y的位置上,且设置目标图像的宽度为dst_w和dst_h。
 imagecopyresampled()函数用于重采样复制部分图像并调整大小,该函数的语法格式和imagecopyresized()函数相同。
 imagecopymerge()函数用于复制并合并图像的一部分,该函数的语法格式如下: 

bool imagecopymerge(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, 

int $src_y, int $src_w, int $src_h, int $pct)
该函数将src_im图像中坐标从src_x、src_y开始,宽度为src_w,高度为src_h的一部分复制到dst_im图像中坐标为dst_x和dst_y的位置上。同时用pct指定复制部分图像的透明度,两图像将根据pct的值来决定合并程度,其值为0~100。当pct=0时,实际上什么也没做,当pct=100时对于imagecopymerge()函数和imagecopy()函数的作用完全一样,它对真彩色图像实现了alpha透明。如以下代码(lt537.php)将两幅图像合并后输出到浏览器。

<?php

$src_im=imagecreatefromjpeg("img/yzm.jpg");  //载入jpg格式图像

$dst_im=imagecreatefromjpeg("img/flag.jpg");  //载入jpg格式图像

$src_x=0;

$src_y=0;

$dst_x=100;

$dst_y=100;

$src_w=102;

$src_h=22;

$pct=50;       //设置透明度

imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);

header('Content-Type: image/jpeg');  //设置内容类型标头为image/jpeg

imagejpeg($dst_im);              //输出目标图像到浏览器

imagedestroy($src_im);               //销毁图像

imagedestroy($dst_im);               //销毁图像

?>
 imagecopymergegray()实现用灰度复制并合并图像的一部分,该函数和imagecopymerge()完全一致,但该函数会在合并时通过在复制操作前将目标像素转换为灰度级来保留图像原色度。
7. 绘制文字和图形
绘制文字和图形的函数有imagestring()、imagestringup()、imageline()、imagearc()、imageellipse()、imagerectangle ()和imagepolygon()等函数。
 imagestring()函数可水平地画一行字符,该函数的语法格式如下。

bool imagestring(resource $image,int $font,int $x,int $y,string $s,int $col)
imagestring()用col颜色将字符串s画到image所代表的图像的x、y坐标处(这是字符串左上角坐标,整幅图像的左上角为0,0)。如果font是1,2,3,4或5,则使用内置字体。如以下代码(lt538.php)


图529验证码图片


使用imagecreate()、imagecolorallocate()和imagestring()等函数输出一个验证码图片到浏览器,运行结果如图529所示。

<?php  

$cimg = imagecreate(100, 20);    

imagecolorallocate($cimg, 14, 114, 180);     //指定图像背景颜色   

$red = imagecolorallocate($cimg, 255, 0, 0);   //创建颜色,返回颜色标识符$red,这里的$red

//代表红色,用于作为输出字符串的颜色

$num1 = rand(1, 99);  //产生一个1~99的随机数1

$num2 = rand(1, 99);  //产生一个1~99的随机数2

session_start();       //启动session

$_SESSION['code'] = $num1 + $num2;  //将两个随机数相加存储在session中

//输出两个随机数相加的图片

imagestring($cimg, 5, 5, 5, $num1, $red);  //输出第一个随机数

imagestring($cimg, 5, 30, 5, "+", $red);   //输出“+”号

imagestring($cimg, 5, 45, 5, $num2, $red); //输出第二个随机数

imagestring($cimg, 5, 70, 5, "=?", $red);  //输出“=?”

header("Content-type: image/png");        //指定输出内容为png格式图片

imagepng($cimg)                       //输出图像到浏览器

imagedestroy($cimg);                    //销毁图像

?>
 imagestringup()函数可垂直地画一行字符串,该函数参数和使用方法和imagestring()函数基本相同。
 imageline()函数用于画一条线段,该函数的语法格式如下。

bool imageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color)
imageline()用color颜色在图像image中从坐标x1,y1到x2,y2(图像左上角为 0, 0)画一条线段。
 imagearc()函数用于画一个椭圆弧,该函数的语法格式如下。

bool imagearc(resource $image, int $cx, int $cy, int $w, int $h, int $s, int $e, int $color)
 imagearc()以cx、cy(图像左上角为 0, 0)为中心在image所代表的图像中画一个椭圆弧。w和h分别指定了椭圆的宽度和高度,起始和结束点以s和e参数以角度指定。0°位于三点钟位置,以顺时针方向绘画。
如以下代码(lt539.php)将画出一个白色的圆。

<?php

$img=imagecreatetruecolor(200,200);     //创建一个200×200的图像

$white=imagecolorallocate($img,255,255,255);   //白色

imagearc($img,140,75,50,50,0,360,$white);      //画白色椭圆弧

header("Content-type: image/png");  //指定输出内容为png格式图片

imagepng($img);       //输出图像到浏览器

imagedestroy($img);    //销毁图片

?>
 imageellipse()函数用于画一个椭圆,该函数的语法格式如下。

bool imageellipse(resource $image, int $cx, int $cy, int $w, int $h, int $color)
imageellipse()以cx、cy(图像左上角为 0, 0)为中心在image所代表的图像中画一个椭圆弧。w和h分别指定了椭圆的宽度和高度,color指定椭圆线的颜色。
如以下代码(lt540.php)将画出一个白色的椭圆。

<?php

$image=imagecreatetruecolor(400, 300);    //创建一个400×300的图像

$bg=imagecolorallocate($image, 0, 0, 0);  //填充背景色为黑色

$white = imagecolorallocate($image, 255, 255, 255); //选择椭圆的颜色为白色

imageellipse($image, 200, 150, 300, 200, $white);   //画一个椭圆

header("Content-type: image/png");       //指定输出内容为png格式图片

imagepng($image);                        //输出图像到浏览器

imagedestroy($image);                     //销毁图像

?>
 imagerectangle()函数用于画一个矩形,该函数的语法格式如下。

bool imagerectangle(resource $image, int $x1, int $y1, int $x2, int $y2, int $col)
imagerectangle()用col颜色在image图像中画一个矩形,其左上角坐标为x1、y1,右下角坐标为x2、y2,图像的左上角坐标为0, 0。
 imagepolygon()函数用于画一个多边形,该函数的语法格式如下。

bool imagepolygon(resource $image, array $points, int $num_points, int $color)
imagepolygon()在图像中创建一个多边形。points是一个数组,包含了多边形的各个顶点坐标,即 points[0] = x0,points[1] = y0,points[2] = x1,points[3] = y1,以此类推。num_points 是顶点的总数,color为多边形线的颜色。
8. 图像填充
图像填充的函数有imagefill()、imagefilledarc()、imagefilledellipse()、imagefilledrectangle()和imagefilledpolygon()等函数。
 imagefill()函数用于区域填充,该函数的语法格式如下。

bool imagefill(resource $image, int $x, int $y, int $color)
imagefill()在image图像的坐标x,y(图像左上角为 0, 0)处用color颜色执行区域填充(即与x, y点颜色相同且相邻的点都会被填充)。
 imagefilledarc()函数用于画一椭圆弧且填充,该函数的语法格式如下。

bool imagefilledarc(resource $image, int $cx, int $cy, int $w, int $h, int $s, int $e, int $color, int $style)
imagefilledarc()以cx,cy(图像左上角为 0, 0)为中心在image所代表的图像中画一个椭圆弧且填充。w和h分别指定了椭圆的宽度和高度,起始和结束点以s和e参数以角度指定。0°位于三点钟位置,以顺时针方向绘画。style代表椭圆弧类型,可选值有IMG_ARC_PIE、IMG_ARC_CHORD、IMG_ARC_NOFILL和IMG_ARC_EDGED。IMG_ARC_CHORD 只是用直线连接了起始和结束点,IMG_ARC_PIE 则产生圆形边界。IMG_ARC_NOFILL 指明弧或弦只有轮廓,不填充。IMG_ARC_EDGED 指明用直线将起始和结束点与中心点相连。
 imagefilledellipse()函数可画一椭圆并填充,函数语法格式及用法和imageellipse()函数基本相同。
 imagefilledrectangle()函数可画一矩形并填充,函数语法格式及用法和imagerectangle()函数基本相同。
 imagefilledpolygon()函数可画一多边形并填充,函数语法格式及用法和imagepolygon()函数基本相同。
9. 图像旋转
图像旋转函数有imagerotate(),该函数实现用给定角度旋转图像,该函数的语法格式如下。

resource imagerotate(resource $image, float $angle, int $bgd_color [, int $ignore_transparent = 0])
将image图像用给定的angle角度旋转。bgd_color指定了旋转后没有覆盖到的部分的颜色。旋转的中心是图像的中心,旋转后的图像会按比例缩小以适合目标图像的大小(边缘不会被剪去)。ignore_transparent如果被设为非零值,则透明色会被忽略(否则会被保留)。
例如下面代码(lt541.php)实现了图像的旋转。

<?php

$filename = 'img/flag.jpg';  //文件路径

$degrees = 180;              //旋转角度

$source = imagecreatefromjpeg($filename);  //载入JPEG格式图像

$rotate = imagerotate($source, $degrees, 0); //旋转图像

header('Content-type: image/jpeg');  //指定输出内容为JPEG格式图片

imagejpeg($rotate);  //输出图像到浏览器

imagedestroy($source);             //销毁图像

imagedestroy($rotate);              //销毁图像

?>
10. 字体写入
字体写入函数有imagettftext(),该函数实现用TrueType字体向图像写入文本,该函数的语法格式如下。

array imagettftext(resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text)
参数image代表由图像函数创建的图像资源,size代表字体尺寸,angle代表文本角度,x和y定义了第一个字符的左上角,color代表文字颜色,fontfile为字体路径,text为要写入的文本。例如下面代码(lt542.php)实现在图像中输出文字水印的功能。

<?php

function mark_text($background, $text, $x, $y){ 

$back=imagecreatefromjpeg($background);   //载入JPEG格式图像

$color=imagecolorallocate($back, 0, 255, 0);  //为图像分配颜色

imagettftext($back, 20, 0, $x, $y, $color, "simhei.ttf", $text);  //向图像写入文本

imagejpeg($back, "img/test.jpg");    //输出图像到文件

header("Content-type: image/jpeg");  //指定输出内容为JPEG格式图片

imagejpeg($back);                //输出图像到浏览器

imagedestroy($back);             //销毁图像

 } 

mark_text("img/penguins.jpg", "网站建设PHP版", 50, 50);

?>
知识11PHP面向对象功能
在面向对象的程序设计(Objectoriented programming,OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。PHP从4.0版本后开始逐渐支持面向对象功能,PHP 4.0版本只能支持简单的面向对象的功能,从5.0版本后对面向对象的功能支持已经比较强大。
1. 对象的主要三个特性
行为: 可以对对象施加操作,例如,开灯、关灯就是行为。

状态: 当施加方法时对象如何响应,以及对象的颜色、尺寸、外形。
表示: 对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
2. 面向对象的常用术语
PHP面向对象常用术语包括类、对象、成员变量和成员函数等,各术语的解释如下。
类: 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象: 是类的实例。
成员变量: 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。
成员函数: 定义在类的内部,可用于访问对象的数据。
继承: 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类: 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类: 一个类继承其他类称为子类,也可称为派生类。
多态: 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载: 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性: 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装: 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数: 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与NEW运算符一起使用在创建对象的语句中。

析构函数: 析构函数(DESTRUCTOR)与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用NEW开辟了一片内存空间,应在退出前在析构函数中用DELETE释放)。
3. PHP类的定义及创建
PHP 定义类通常语法格式如下。

<?php

class phpClass {

var $var1;

var $var2 = "constant string";  

function myfunc($arg1, $arg2) {

[..]

}

[..]

}

?>

类使用class关键字后加上类名定义。类名后的一对大括号({})内可以定义变量和方法。类的变量使用var来声明,变量也可以初始化值。函数定义类似PHP函数的定义,但函数只能通过该类及其实例化的对象访问。以下代码创建了一个类Site,在类的内部设置了相应的成员变量和成员方法。

<?php

class Site {

/* 成员变量 */

var $url;

var $title;  

/* 成员方法 */

function setUrl($par){

$this->url = $par;

}  

function getUrl(){

echo $this->url . "<br>";

}  

function setTitle($par){

$this->title = $par;

}  

function getTitle(){

echo $this->title . "<br>";

}

}

?>

变量$this代表自身的对象。类创建后,可以使用new运算符来实例化该类的对象,代码如下: 

$pinduoduo = new Site;

$taobao = new Site;

$jingdong = new Site;

以上代码创建了三个对象,三个对象各自都是独立的,在实例化对象后就可以通过>操作符访问该对象的成员变量和成员方法,且该对象的成员方法只能操作该对象的成员变量。

//调用成员方法,设置标题和URL

$pinduoduo->setTitle("拼多多"); 

$taobao->setTitle("淘宝"); 

$jingdong->setTitle("京东"); 

$pinduoduo->setUrl('www.pinduoduo.com'); 

$taobao->setUrl('www.taobao.com'); 

$jingdong->setUrl('www.jd.com'); 

//调用成员方法,获取标题和URL

$pinduoduo->getTitle(); 

$taobao->getTitle(); 

$jingdong->getTitle(); 

$pinduoduo->getUrl(); 

$taobao->getUrl(); 

$jingdong->getUrl();

以上实例完整代码请参照lt543.php页面,执行后输出结果为: 

拼多多

淘宝

京东

www.pinduoduo.com

www.taobao.com

www.jd.com

4. PHP构造函数和析构函数
(1) 构造函数
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,在创建对象的语句中与new运算符一起使用。
PHP5允许开发者在一个类中定义一个方法作为构造函数,语法格式如下: 

void __construct([mixed $args [, $... ]])

在上面的例子中我们就可以通过构造方法来初始化$url和$title变量。

function __construct($par1, $par2) {

$this->url = $par1;

$this->title = $par2;

}

现在我们就不需要再调用setTitle和setUrl方法了,使用下面的构造函数即可在实例化对象的同时设置成员变量的值。

$pinduoduo = new Site('www.pinduoduo.com', '拼多多');

$taobao = new Site('www.taobao.com', '淘宝');

$jingdong = new Site('www.jd.com', '京东');

(2) 析构函数
析构函数(destructor)与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。PHP调用析构函数来将一个对象从内存中销毁,默认地PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源。PHP5引入了析构函数的概念,这类似于其他面向对象的语言,其语法格式如下: 

void __destruct (void)

以下代码在Site类的定义中添加一个析构函数。

function __destruct(){

echo "销毁 ".$this->url."<br>";

echo "销毁 ".$this->title."<br>";

}

构造函数和析构函数的使用请参考lt544.php页面,执行后输出结果为: 

拼多多

淘宝

京东

www.pinduoduo.com

www.taobao.com

www.jd.com

销毁 www.jd.com

销毁 京东

销毁 www.taobao.com

销毁 淘宝

销毁 www.pinduoduo.com

销毁 拼多多

5. 类的继承和方法重写
(1) 类的继承
PHP使用关键字extends来继承一个类,PHP不支持多继承,语法格式如下: 

class Child extends Parent {

// 代码部分

}

下面代码中Child_Site类继承了Site类,并扩展了功能。

<?php 

//子类扩展站点类别

class Child_Site extends Site {

var $category;

function setCate($par){

$this->category = $par;

}  

function getCate(){

echo $this->category . "<br>";

}

}

(2) 方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
下面代码中重写了getUrl与getTitle方法。

function getUrl() {

echo $this->url . "<br>";

return $this->url;

}

function getTitle(){

echo $this->title . "<br>";

return $this->title;

}

如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为private的话)。
和构造函数一样,子类中如果定义了析构函数,父类的析构函数也不会被子类隐式调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用parent::__destruct()。子类如果自己没有定义析构函数则会继承父类的析构函数。继承和方法重写的使用请参考lt545.php页面。
6. 访问控制和常量
(1) 访问控制
PHP对属性或方法的访问控制,是通过在前面添加关键字public(公有)、protected(受保护)或private(私有)来实现的。
public(公有): 公有的类成员可以在任何地方被访问。
protected(受保护): 受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有): 私有的类成员则只能被其定义所在的类访问。
类中的属性必须定义为公有、受保护、私有中的一种。如果用var定义,则被视为公有。类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
(2) 常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用$符号。常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。自PHP5.3.0起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如self,parent或static)。以下代码(lt546.php)定义了一个类并演示了常量的定义和使用。

<?php

class ConstantClass

{

const constant = '常量值';

function showConstant() {

echo  self::constant . "<br>";

}

}

echo ConstantClass::constant . "<br>";

$classname = "ConstantClass";

echo $classname::constant . "<br>"; //自PHP5.3.0起

$class = new ConstantClass();

$class->showConstant();

echo $class::constant . "<br>";     //自PHP 5.3.0起

?>

以上代码输出结果为: 

常量值

常量值

常量值

常量值

7. static和final关键字
(1) static关键字
声明类属性或方法为static(静态),就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。静态属性不可以由对象通过>操作符来访问。自PHP5.3.0起,可以用一个变量来动态调用类。但该变量的值不能为关键字self,parent或static。以下代码(lt547.php)演示了static关键字的使用。

<?php

class staticClass {

public static $my_static = 'static';  

public function staticValue() {

return self::$my_static;

}

}

print staticClass::$my_static . "<br>";

$staticClass = new staticClass();

print $staticClass->staticValue() . "<br>";

?>

执行以上程序,输出结果为: 

static

static

(2) final关键字
PHP5新增了一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为final,则不能被继承。
以下代码(lt548.php)演示了final关键字的使用。

<?php

class FatherClass {

public function test1() {

echo "FatherClass::test1() called" . "<br>";

}

final public function test2() {

echo "FatherClass::test2() called" . "<br>";

}

}

class ChildClass extends FatherClass {

public function test2() {

echo "ChildClass::test2() called"  . "<br>";

}

}

?>

执行以上代码将报如下错误: 

Fatal error: Cannot override final method FatherClass::test2()


知识点拓展

[1] 整个地球分为24个时区,每个时区都有自己的本地时间。同一时间,每个时区的本地时间相差1~23小时,例如,英国伦敦本地时间与北京本地时间相差8小时。在国际无线电通信领域,使用一个统一的时间,称为通用协调时间(University Time Coordinated,UTC),UTC与格林尼治标准时间(Greenwich Mean Time,GMT)相同,都与英国伦敦本地时间相同。
地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计算,而且还要以分和秒来计算,这给人们带来不便。所以为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1~12区,西1~12区。每个时区横跨经度15°,时间正好是1小时。最后的东、西第12区各跨经度7.5°,以东、西经180°为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间迟1小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表向前拨1小时(如2点拨到1点); 凡向东走,每过一个时区,就要把表向后拨1小时(如1点拨到2点)。并且规定英国(格林尼治天文台旧址)为本初子午线,即零时(24时)经线。
实际上,世界上不少国家和地区都不是严格按时区来计算时间。但为了在全国范围内采用统一的时间,一般都把某一个时区的时间作为全国统一采用的时间。例如,我国把首都北京所在的东8区的时间作为全国统一的时间,称为北京时间。

职业技能知识点考核

1. 填空题
(1) 在PHP中,heredoc是一种特殊的字符串,它的结束标志必须。
(2) 获取PHP程序文件名的预定义常量为。获取PHP程序当前行数的预定义常量为。
(3) 去除字符串左右两边空格的函数为。按照指定的分隔符将一个字符串分开并返回字符串数组的函数为。
(4) 能对数组进行排序,保持数组索引和单元关联的函数是。能对数组按照键名排序,保留键名到数据关联的函数是。
(5) 获取图像宽度和高度的函数分别是和等。
(6) PHP画一个矩形的函数是。
(7) PHP中定义类使用的关键词是。
(8) PHP在实例化对象后通过操作符访问该对象的成员变量和成员方法。
(9) PHP用来在创建对象时初始化对象,即为对象成员变量赋初始值的方法是。
(10) PHP使用关键字来继承一个类。
(11) PHP中声明类属性或方法为,就可以不实例化类而直接访问。
(12) PHP中如果父类的方法被声明为,则子类无法覆盖该方法。
2. 简答题
(1) 在网页中标记PHP代码的方式有哪些?
(2) 语句include和require都能把另外一个文件包含到当前文件中,它们的区别是什么?
(3) imagecreate()和imagecreatetruecolor()函数在改变背景颜色时有什么区别?
3. 编程题
(1) 声明一个关联数组,并使用foreach()结构遍历数组,输出数组的键值和元素值。
(2) 用PHP打印出前一天的时间,格式是20200510 08:09:21(年月日 时:分:秒)。
(3) 用PHP图像处理函数编写一个PHP程序实现图像旋转和图像大小调整。

练习与实践

1. 现有一个字符串"姓名 王力,年龄 30,籍贯 陕西,住址 西安市雁塔区,爱好 足球",请综合运用字符串处理函数、数组和循环语句输出该字符串到一个表格中,要求输出的表格如下所示。





姓名王力


年龄
20
籍贯
陕西
住址
西安市雁塔区
爱好
足球
2. 使用三种以上方式获取一个文件的扩展名,例如从文件路径“dir/upload_image.jpg”中找出.jpg或者jpg,必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以写成函数,如get_ext1($file_name), get_ext2($file_name)。