第10 章 PHP技术介绍

10.1 PHP简介

PHP(Hypertext.Preprocessor,超文本预处理器)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到HTML中,尤其适合Web开发。该语言的语法利用了C、 Java和Perl,易于学习。该语言的主要目标是允许Web开发人员快速编写动态生成的 Web页面。

10.1.1 简介

PHP继承自一个老的工程PHP/FI。PHP/FI在1995年由Rasmus Lerdorf创建,最初只是一套简单的Perl脚本,用来跟踪访问他主页的人们的信息。他给这一套脚本取名为“Personal Home Page Tools”(个人主页工具)。随着更多功能需求的增加,Rasmus写了一个更大的C语言的实现,它可以访问数据库,可以让用户开发简单的动态Web程序。 Rasmus发布了PHP/FI的源代码,以便每个人都可以使用它,同时大家也可以修正它的 Bug并且改进它的源代码。

PHP主要是用于服务端的脚本程序,因此可以用PHP来完成任何其他CGI程序能够完成的工作,例如收集表单数据、生成动态网页,或者发送/接收Cookies。

PHP脚本主要用于以下三个领域:

(1)服务端脚本。这是PHP最传统也是最主要的目标领域。开展这项工作需要具备 PHP解析器(CGI或者服务器模块)、Web服务器和Web浏览器。需要在运行Web服务器时安装并配置PHP,然后可以用Web浏览器来访问PHP程序的输出,即浏览服务端的PHP页面。如果只是实验PHP编程,所有的这些都可以运行在PC机中。

(2)命令行脚本。可以编写一段PHP脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要PHP解析器来执行。这种用法对于依赖cron(Unix或者 Linux环境)或者Task Scheduler(Windows环境)的日常运行的脚本来说是理想的选择。这些脚本也可以用来处理简单的文本,具体请参阅PHP的命令行模式以获取更多信息。

(3)编写桌面应用程序。对于有着图形界面的桌面应用程序来说,PHP或许不是一种最好的语言,但是如果用户非常精通PHP,并且希望在客户端应用程序中使用PHP的一些高级特性,可以利用PHP-GTK来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK是PHP的一个扩展,在通常发布的PHP包中并不包含它。

PHP能够用在所有的主流操作系统上,包括Linux、Unix的各种变种(包括HP-UX、 Solaris和OpenBSD)、Microsoft Windows、MacOSX和RISCOS等。如今,PHP已经支持大多数的Web服务器,包括Apache、Microsoft Internet Information Server (IIS)、Personal Web Server(PWS)、Netscape以及iPlant Server、Oreilly Website Pro Server、Caudium、 Xitami以及OmniHTTPd等。对于大多数的服务器,PHP提供了一个模块,还有一些PHP支持 CGI标准,使得PHP能够作为CGI处理器来工作。

使用PHP,可以自由地选择操作系统和Web服务器,同时还可以在开发时选择使用面向过程和面向对象或者两者混和的方式来开发。使用PHP,并不局限于输出HTML,还能用来动态输出图像、PDF文件甚至Flash动画(使用libswf和Ming)。PHP还能够非常简便地输出文本,例如XHTML以及任何其他形式的XML文件。PHP能够自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者将它们存储到文件系统中。

PHP最强大、最显著的特性之一,是它支持很大范围的数据库。利用PHP编写数据库支持的网页,简单得难以置信。PHP支持目前主流的数据库,还支持ODBC(Open Database Connection Standard,开放数据库连接标准),因此可以连接任何其他支持该世界标准的数据库。

10.1.2 Apache服务器

Apache是世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。 Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchyserver”,意思是充满补丁的服务器。因为它是自由软件,所以不断有人来为它开发新的功能、新的特性,修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可作为代理服务器使用。

Apache web服务器软件拥有以下特性:

(1)支持最新的HTTP/1.1通信协议。

(2)拥有简单而强有力的基于文件的配置过程。

(3)支持通用网关接口。

(4)支持基于IP和基于域名的虚拟主机。

(5)支持多种方式的HTTP认证。

(6) 集成Perl处理模块。

(7)集成代理服务器模块。

(8)支持实时监视服务器状态和定制服务器日志。

(9)支持服务器端包含指令(Server Side Include,SSI)。

(10)支持安全Socket层(Secure Socket Layer,SSL)。

(11)提供用户会话过程的跟踪。

(12)支持FastCGI。

(13)通过第三方模块可以支持Java Servlets。

10.1.3 PHP语言

PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法,它可以比CGI或者Perl更快速地执行动态网页。与其他的编程语言相比,用PHP做出的动态页面是将程序嵌入到 HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。PHP具有非常强大的功能,能实现所有的CGI功能,而且支持几乎所有流行的数据库以及操作系统。最重要的是,PHP可以用C、C++进行程序的扩展。

PHP的特性包括:

(1)开放的源代码。事实上所有的PHP源代码都可以免费得到。

(2)PHP是免费的。和其他技术相比,PHP本身免费。

(3)PHP的快捷性。程序开发快,运行快,技术本身学习快。

(4)嵌入于HTML。因为PHP可以被嵌入于HTML语言,它相对于其他语言而言编辑简单,实用性强,更适合初学者。

(5)跨平台性强。由于PHP是运行在服务器端的脚本,可以运行在Unix、Linux和 Windows下。

(6)效率高。PHP消耗相当少的系统资源。

(7)图像处理。用PHP可以动态创建并编辑图像。

(8)面向对象。PHP4和PHP5在面向对象方面都有了很大的改进,现在PHP完全可以用来开发大型商业程序。

(9)专业、专注。PHP支持脚本语言为主,同为类C语言。

10.1.4 MySQL数据库

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司,该公司在2008年1月16日被Sun公司收购,而2009年Sun公司又被Oracle收购。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL(结构化查询语言)是用于访问数据库的最常用标准化语言。MySQL软件采用了GPL(General Public License,通用公共许可证),由于其体积小、速度快、总体拥有成本低,尤其是开放源代码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了以MySQL作为网站数据库。

MySQL数据库的特性如下:

(1)使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。

(2)支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、 OS/2 Wrap、Solaris和Windows等多种操作系统。

(3)为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、 PHP、Eiffel、Ruby和Tcl等。

(4)支持多线程,充分利用CPU资源。

(5)优化的SQL查询算法,有效地提高了查询速度。

(6)既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。

(7)提供TCP/IP、ODBC和JDBC等多种数据库连接途径。

(8)提供用于管理、检查、优化数据库操作的管理工具。

(9)可以处理拥有上千万条记录的大型数据库。

(10)支持多种存储引擎。

10.2 PHP工作环境

“工欲善其事,必先利其器”,学习PHP脚本编程之前,必须先搭建PHP开发环境。 PHP的开发环境一般指LAMP平台,即在Linux操作系统上分别安装Apache网页服务器、 PHP应用服务器和MySQL数据库管理系统以及一些相关的扩展。在Windows平台上也可以安装部署PHP的开发环境。

10.2.1 安装和测试Apache

在Linux平台下安装PHP,可以使用配置和编译过程或者使用各种预编译的包。LAMP环境最理想的搭建方法是从各自的官方网站上免费下载安装程序的源代码文件,并在自己的系统上编译。这种安装方式会根据操作系统的环境有针对性地进行优化,也最为复杂。

安装之前,首先到相应的网站上下载安装所需要的最新软件源代码文件,包括最新的 Apache、MySQL、PHP以及相关库文件的源码包,并把下载的源码包放到Linux系统下的/usr/local/src/目录中。

下载的软件的源文件都是使用C语言编写的,需要在本机编译后才能安装使用,因此在安装前首先要检查一下系统中编译工具gcc是否已经安装。可以在命令行中使用“gcc -v”来查看是否安装了gcc。

目前发行的RedHatLinux操作系统版本中,如果选择默认全部安装,就已经安装了版本较低的LAMP环境。可以再安装一个LAMP环境和原来的并存,但同时只能开启一个 LAMP环境。所以在安装前,先检查一下系统中是否已经安装了低版本的环境,如果已经安装,应停止原来的服务运行或者把原来的环境卸载掉。命令如下所示:

10.2.2 配置Apache服务器

Apache服务器的设置文件位于/usr/local/apache/conf/目录下,传统上使用三个配置文件httpd.conf、access.conf和srm.conf来配置Apache服务器的行为。

httpd.conf提供了最基本的服务器配置,是对守护程序httpd如何运行的技术描述; srm.conf是服务器的资源映射文件,告诉服务器各种文件的MIME类型以及如何支持这些文件;access.conf用于配置服务器的访问权限,控制不同用户和计算机的访问限制。这三个配置文件控制着服务器各个方面的特性,因此为了正常运行服务器,需要设置好这三个文件。

除了这三个配置文件之外,Apache还使用mime.types文件标识不同文件对应的MIME类型。magic文件设置不同MIME类型文件的一些特殊标识,使得Apache服务器在通过文档后缀无法判断文件的MIME类型时,能通过文件内容中的这些特殊标记来判断文档的 MIME类型。

在新版本的Apache中,所有的设置都被放在了httpd.conf中,因此只需要调整这个文件中的设置。以下使用缺省提供的httpd.conf为例,解释Apache服务器的各个设置选项。然而不必因为它提供设置的参数太多而烦恼,基本上这些参数都很明确,也可以不加改动地运行Apache服务器。但如果需要调整Apache服务器的性能或增加对某种特性的支持,就需要了解这些设置参数的含义。

10.2.3 管理Apache服务器

1.服务器访问控制

access.conf文件包含一些指令,控制允许什么用户访问Apache目录。应该把deny from all作为初始化指令,然后使用allowfrom指令打开访问权限,允许来自某个域、IP地址或者IP段的访问,例如:order deny,allow deny from all allow from sans.org。

2.密码保护

使用.htaccess文件,可以把某个目录的访问权限赋予某个用户。系统管理员需要在 httpd.conf或者srm.conf文件中使用AccessFileName指令打开目录的访问控制。以下是一个.htaccess示例文件:

3.Apache日志文件

系统管理员可以使用日志格式指令来控制日志文件的信息。使用LogFormat "%a %l"指令,可以把发出HTTP请求浏览器的IP地址和主机名记录到日志文件。出于安全的考虑,至少应该记录那些验证失败的Web用户,在http.conf文件中加入LogFormat"%401u"指令可以实现这个目的。这个指令还有其他许多参数,用户可以参考Apache的文档。另外, Apache的错误日志文件对于系统管理员来说也非常重要,错误日志文件中包括服务器的启动、停止以及CGI执行失败等信息。

10.2.4 安装和配置PHP

首先检查当前系统中是否安装了PHP模块,如果已经安装旧版本,需要先卸载旧版本,命令行如下:

10.3 PHP语言基础

PHP是一种被广泛应用的开放源代码的多用途脚本语言。可以将PHP简单地看作一种较流行的开发动态网页的程序语言,是一种服务器端的、嵌入到HTML中的脚本语言,是 Web应用程序开发的理想工具。PHP融合了现代编程语言(如C、Java和Perl)的一些最佳特性,PHP和Apache、MySQL的组合已经成为Web服务器开发的利器。

10.3.1 PHP基础知识

PHP可以做很多事,但主要是在Web开发中用于服务器端的脚本程序。PHP需要安装 PHP应用程序服务器去解释执行,用来协助Web服务器工作的编程语言,也可以认为是对Web服务器功能的扩展。主要用PHP来完成以下工作:

(1)收集表单数据。网页编程中经常使用表单来录入提交数据,表单提交时可以使用GET或者POST方法将数据发送给PHP程序脚本。在PHP脚本中,可以用PHP变量的形式来访问每一个表单域。

(2)生成动态网页。PHP脚本程序可以根据客户端用户的不同输入请求,在服务器端运行脚本后,动态输出用户请求的内容。

(3)字符串处理。PHP把字符串作为一种基本的数据类型来处理,提供了丰富的字符串处理函数,使用强大的正则表达式来处理字符串。

(4)动态输出图像。PHP通过使用GD扩展库动态输出图像,如验证码、数据统计图等,还可以编辑图像,如添加水印效果等。

(5)处理服务器端文件系统。PHP可以利用文件系统函数操作服务器中的目录或者文件。

(6)编写数据库访问的网页。PHP可以连接任何支持世界标准的数据库。

(7)会话跟踪控制。PHP使用会话控制思想在网站中跟踪某个用户,从而实现用户登录,并根据会话控制记录用户的行为。

(8)处理XML文件。PHP支持POSIX扩展或者Perl正则表达式来解析XML文档。PHP还支持SAX和DOM标准,也可以使用XSLT扩展库来处理XML文档。

(9)支持大量的网络协议。PHP支持如LDAP、IMAP、SNMP、NNTP、POP、 HTTP、COM等协议的服务,还可以使用开发的网络端口,使别的协议能够协同工作。

PHP能够用在所有的主流操作系统上,包括Linux、Unix的各种变种、Microsoft Windows、Mac OS X、RISCOS等,也支持大多数的Web服务器,如Apache、IIS、PWS、 Netscape以及OmniHTTPd等。同时,还可以在开发时选择面向过程、面向对象或者混合方式来开发。

10.3.2 数据类型

PHP支持八种原始类型,分别是四种标量类型(布尔类型boolean、整型integer、浮点型float和字符串类型string),两种复合类型(数组array和对象object),还有两种特殊类型(资源resource和空类型NULL)。为了确保代码的易读性,还介绍三种伪类型:mixed、 number和callback。

变量的类型通常不是由程序员指定的,而是由PHP根据变量使用的上下文在运行时决定的。如果想查看某个变量或表达式的值和类型,可以使用var_dump()函数,代码如下:

1.布尔类型

布尔类型(boolean)是最简单的类型。boolean表达了真值,可以为True或False。

在PHP进行关系运算以及布尔运算时,返回的都是布尔结果,是PHP逻辑控制的判断依据。任何类型的值都可以转换为布尔类型的值,转换原则为整数值0、浮点型值0.0、空字符串和字符串“0”、没有成员变量的数组、没有单元的对象以及NULL类型都被认为 False,其他的值被认为True。

2.整型

整型 (integer)变量是集合Z={...,-2,-1, 0,1,2,...}中的一个数。整型值可以用十进制、十六进制或八进制符号指定,前面可以加上可选的符号(一或者+)。如果用八进制符号,数字前必须加上0(零),用十六进制符号数字前必须加上0x。整型数的字长和平台有关,如果给定的一个数超出了integer的范围,将会被解释为float。PHP 不支持无符号整数。

3.浮点数

浮点数(float或double)也叫浮点数、双精度数或实数,是包含小数部分的数,通常用来表示整数无法表示的数据。浮点数只是一种近似的数值,如果用浮点数表示一个整数1,内部表示是类似0.9999999……,因此不要以为浮点数结果精确到了最后一位,也不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用数学函数或者 gmp()函数。

4.字符串

o字符串 (string)是一系列字符。在PHP中,字符和字节一样,一个字符串可以只有一个字符,也可以包含任意多的字符。字符串可以使用单引号、双引号和定界符三种字面上的方法定义。这三种字符串定义和区别如下:

(1)指定一个简单字符串的最简单的方法是用单引号(字符’)括起来,单引号里面不能再包含单引号,要表示一个单引号,需要用反斜线(\)转义。单引号字符串中出现的变量不会被变量的值替代,即PHP不会解析单引号中的变量,而是将变量名原样输出。因此单引号定义字符串效率会比较高,如没有特别需求,应使用单引号定义字符串。

(2) 如果用双引号括起字符串,PHP包含更多特殊字符的转义序列。另外,双引号字符串最重要的一点是其中的变量名会被变量值替代,即可以解析双引号中包含的变量。

(3)另一种给字符串定界的方法是使用定界符语法(“<<<”)。应该在‘<<<”之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。结束标识符必须从行的第一列开始。同样,标识符也必须遵循PHP中其他任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。定界符文本表现得和双引号字符串一样,只是没有双引号,这意味着在定界符文本中不需要转义引号,不过仍然可以用以上所列的转义代码。变量会被解析,但当在定界符文本中表达复杂变量时,和字符串一样同样也要注意。

5.数组

数组(array)是PHP中一种重要的复合数据类型。前面所述四种变量类型所定义的变量只能存放一个数据,而数组可以存放多个数据,并且可以存放任何类型的数据。PHP中的数组实际上是一个有序图。图是一种把values映射到keys的类型,此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量)、散列表(是图的一种实现)、字典、集合、栈、队列以及更多可能性。因为可以用另一个PHP数组作为值,因而也可以很容易地模拟树。

在PHP中,可以使用多种方法构造一个数组,这里介绍使用array()语言结构来新建一个数组。它接受一定数量用逗号分隔的key=>value参数对。

6.对象

在PHP中,对象(object)和数组一样都是一种复合数据类型,但对象是一种更高级的数据类型。一个对象类型的变量由一组属性值和一组方法构成,其中属性表明对象的状态,方法通常表明对象的功能。要初始化一个对象,可用new语句将对象实例到一个变量中。

7.资源类型

资源(resource)是一种特殊类型的变量,保存了外部资源的一个引用。资源是通过专门的函数来建立和使用的。使用资源类型变量保存一些特殊句柄,如打开文件、数据库连接等。资源由程序员创建、使用和释放。任何资源在不需要的时候应该及时释放,同时系统具有垃圾回收机制,会根据资源应用情况自动释放资源所占的内存。

8.NULL类型

特殊的NULL值表示变量没有值,NULL类型的取值只能是NULL。NULL不表示空格,也不表示零,也不是空字符串,而是表示一个变量的值为空。NULL不区分大小写。

9.伪类型介绍

伪类型不是PHP语言的基本数据类型。PHP是弱类型语言,在一些函数中,一个参数可以接收多种类型的数据。为了确保代码的易读性,介绍以下几个伪类型:

(1)mixed:说明一个参数可以接受多个不同的类型变量。

(2)number:说明一个参数可以是integer或float。

(3) callback:可以作为参数传递用户自定义函数,称为callback函数。下面给出各种类型定义的实例:

10.3.3 流程控制语句

任何一门程序化设计语言中,都支持结构化所需的三种基本结构:顺序结构、分支结构和循环结构。在PHP中,为支持这三种基本结构,提供了实现这三种结构所需的语句。

1.顺序结构

顺序结构就是按照语句出现的先后次序自上而下顺序执行,PHP中的顺序语句主要是赋值语句、输入输出语句等。

2.分支结构

分支结构是依据一定的条件选择执行某些语句,而不是按照语句出现的先后次序执行。分支结构适合于带有逻辑或者关系等条件判断的计算,根据条件的结果来改变程序的执行顺序,即满足条件时执行某一段代码,反之执行另外一段代码。分支结构主要有以下几种形式:单一条件分支结构、双向条件分支结构、多向条件分支结构以及嵌套条件分支结构。

if 结构是单一条件分支结构,对一个表达式进行计算,根据计算结果决定是否执行后面的语句,其格式如下:

if(表达式) //后面不能加分号,否则会出现错误

语句块; //条件成立则执行当前语句块

上面的f语句中,if后面小括号内的“表达式”就是执行的条件,条件只能是布尔类型值。如果是其他类型的表达式,将自动转化为布尔类型的True或者False。如果“表达式”为True,则执行“语句块”,否则不执行。“if(表达式)”和“语句块;”一起组成了完整的if 语句,它们作为一条语句存在。

如果变量a的值大于变量b,则显示“a大于b”,否则没有任何输出,用if语句实现如下:

如果代码块为多条语句,需要用一组花括号“{}”括起来,称为复合语句。任何使用单条语句的地方,都可以使用复合语句。例如,已知两个数a和b,比较它们的大小,如果a大于b,则互换a和b的值,实现如下:

if语句中可以包含else子句,表示if表达式条件不满足的时候执行else子句。if...else称为双向条件分支结构,语法格式如下所示:

10.3.4 数组与函数

1.数组

数组的本质是存储、管理和操作一组变量。数组也是PHP提供的八种数据类型之一,是复合数据类型,可以使用数字存储组织多个变量。

数组的定义有以下两种方法:直接为数组元素赋值即可声明数组和使用array()函数声明数组。

直接为数组元素赋值方法声明一维数组的语法如下所示:

$数组变量名[索引值]=资料内容 //其中索引值可以是一个字符串或一个整数

例如,定义两个数组变量person1和person2,分别用数字和字符串声明数字:

(4)参数列表可以是零个、一个或者多个参数组成,每个参数是一个表达式,用逗号分隔。对于有参函数,在PHP脚本程序中和被调函数之间有数据传递关系。定义函数时,函数名后面括号内的表达式称为形式参数(简称形参),被调用函数名后面括号中的表达式称为实际参数(简称实参)。实参和形参应该个数相等、类型一致。实参和形参按顺序对应传递数据。

PHP有很多标准的函数和结构,还有一些函数需要在特定的PHP扩展模块一起编译,否则编译的时候会出现“未定义函数”的错误。比如,要使用mysql_connect()函数,需要在编译PHP的时候加上MySQL支持。有很多核心函数已经包含在每个版本的PHP中,如字符串和变量函数。调用phpinfo()函数或者get_loaded_extensions(),可以获知PHP加载了哪些扩展库。

标准的PHP5发行包中有1000多个系统函数,这些系统函数都可以在PHP脚本中通过指定函数名直接调用。调用系统函数和调用自定义函数是一样的方式。

10.3.5 字符串与正则表达式

在PHP中提供了大量的字符串处理函数,其功能强大,使用也比较简单。对一些比较复杂的字符串操作,则需要借助PHP所支持的正则表达式来实现。

PHP是弱类型语言,其他类型的数据一般都可以直接应用于字符串处理函数,并自动转换成字符串类型处理,如下所示:

常用的字符串处理函数包括:

(1) echo():输出字符串。

(2)print():输出一个或多个字符串。

(3) die():输出一个消息,并退出当前脚本。

(4) printf():输出格式化字符串。

(5) sprintf()把格式化字符串写入一个变量中。

常见的字符串格式化函数包括:

(1)ltrim():从字符串左侧删除空格或其他预定义字符。

(2) rtrim():从字符串末端开始删除空白字符或者其他预定义字符。

(3) trim():从字符串的两端删除空白字符和其他预定义字符。

(4) str_pad():把字符串填充为新的长度。

(5) strtolower():把字符串转换为小写。

(6) strtoupper():把字符串转换为大写。

(7) ucfirst():把字符串的首字符转换为大写。

(8)ucword():把字符串每个单词的首字符转换为大写。

(9) nl2br():把字符串中的每个新行之前插入HTML换行符。

(10) htmlentities():把字符串转换为HTML实体。

(11)htmlspecialchars():把一些预定义的字符转换为HTML实体。

(12) stripslashes():删除由addcslashes()函数添加的反斜杠。

(13) strip_tags():剥去HTML、XML以及PHP的标签。

(14) number_format():通过千位分组来格式化数字。

(15) strrev():反序字符串。

(16) md5():将一个字符串进行MD5计算。

正则表达式通过构建具有特定规则的模式与输入的字符串信息比较,从而实现字符串的匹配、查找、替换及分割等操作。下面给出了三个模式:

正则作为一个匹配的模板,是由原子、特殊功能的字符以及模式修正符三部分组成的文字模式。原子是正则表达式的最基本的组成单位,包括所有的大写和小写字符、所有数字、所有标点符号以及一些其他符号。元字符是用于构建正则表达式的具有特殊含义的字符,例如“+”、“*”、“?”等。模式修正符在正则表达式定界符之外使用,可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能。

10.3.6 PHP文件编程

1.目录操作

PHP脚本可以方便地对目录进行操作,包括创建目录、遍历目录、复制目录和删除目录等操作。大部分功能可以借助PHP的系统函数来完成,有些功能则需要自定义函数来实现。

Windows和Unix目录的分隔符表示方式不同,Unix系统使用“/”作为路径分隔符,而在Windows系统中默认使用“\”作为路径分隔符,在程序中还需要将“\”转义。为了程序在不同平台下都能正常运行,建议使用“/”作为路径的分隔符。另外,也可以使用 PHP的内置常量DIRECTORY_SEPARATOR,例如:

PHP编程时,要取得一个目录下的文件和子目录,需要用到opendir()函数、readdir()函数、closedir()函数和rewinddir()函数。opendir()用于打开指定目录,readdir()用于读取指定目录,closedir()用于关闭指定目录,rewinddir()用于倒回目录句柄,将目录指针重置到目录开始处,如下所示:

在PHP中,使用mkdir()函数建立一个新目录,使用rmdir()函数删除一个目录,只能删除一个空目录并且目录必须存在。目录的复制需要自定义函数来完成,使用创建目录和文件复制函数copy()来实现目录的复制。

2.文件操作

在PHP中,可以通过标准函数fopen()建立与文件资源的连接,使用fclose()函数关闭通过fopen函数打开的文件资源,使用fwrite函数将字符串内容写入文件中,使用fread()函数读取打开的文件。另外,也可以使用readfile()函数读取指定的整个文件,输出到缓冲区,并返回读取的字节数。

10.4 PHP访问MySQL数据库

Web不仅仅是一个提供信息的地方。如果你有需要进行宣传的产品,通过一个网站,就可以和全世界的人一起分享。但是,这并不是一件很容易的事。当网站越做越大时,你可能会遇到这样的问题:一是网站包含了太多的东西,使得访问者不能够很快找到他们想要的东西,这个问题在某种程度上对一个网站而言是致命的;二是访问者想要向你提供信息,而且这些信息必须保存下来以备后用。这两个问题都可以通过数据库来解决!在 WWW的世界中,数据库无处不在。大如门户网站、电子商务平台,小到一个简单的留言板,都可以看到数据库的用武之地。甚至可以说,数据库是一切高级应用的基础。

10.4.1创建数据库链接

通过PHP脚本程序去管理MySQL服务器中的数据,必须先建立连接,然后才能通过 PHP中的函数向服务器发送SQL查询语句。PHP可以通过MySQL功能模块去连接MySQL服务器,办法是通过调用mysql_connect()函数,方法和使用MySQL客户机程序连接MySQL服务器类似,该函数原型如下:

10.4.2 查询记录

mysql_query函数就是用来对选定的数据库执行一个SQL查询。可以在mysql_query函数中执行任何SQL语句,被执行的SQL语句必须作为一个字符串用双引号括起来,其中的变量要用单引号括起来。有一个要注意的事情:MySQL的语句要用一个分号结束,一行 PHP代码同样也是如此,但是在PHP脚本中的MySQL语句是不能有分号的。

可以使用下面两个函数获得结果数据表的数据行个数和数据列格式,代码片段如下所示:

第8章 ASP.NET动态网站设计

8.1 ASP.NET简介

ASP.NET是Microsoft推出的ASP的下一代Web开发技术。ASP.NET是一个统一的Web开发模型,它包括使用尽可能少的代码生成企业级Web应用程序所必需的各种服务。 ASP.NET作为.NET Framework的一部分提供。当编写ASP.NET应用程序的代码时,可以访问.NET Framework中的类。

8.1.1 ASP.NET语言基础

我们可以使用与公共语言运行库(CLR)兼容的任何语言来编写应用程序的代码,这些语言包括Microsoft Visual Basic、C#、JScript.NET和J#。使用这些语言,可以开发利用公共语言运行库、类型安全、继承等方面优点的ASP.NET应用程序。本章所介绍的 ASP.NET开发均以C#语言为基础。

C#程序有自己的程序结构。C#编程语言类似C++/Java等面向对象编程语言,同样需要编写类、创建对象等。但是C#依旧有与其他面向对象编程语言不同的特性,使用这些特性能够快速、正确地编写C#宿主语言的应用程序,如ASP.NET、WinForm等。

1.C#程序的结构

下面来编写一个较为简单的C#程序,用于说明C#应用程序的基本结构。

以上程序中,using关键字的用途是引用Microsoft的.NET框架中现有的类库资源。该关键字出现在应用程序代码的开头,并在以cs为后缀的文件中使用,格式是:using命名空间名。using关键字通常情况下会出现几次,其目的是引用类库中的各种资源,这些资源不仅包括代码中的System、System.Collections.Generic、System.Text,还包括其他.NET框架的资源,如System.IO、System.Data等。

命名空间(NameSpace)是C#中重要的一部分。System命名空间是由Microsoft.NET类库提供的,用于构建应用程序所需的各种系统功能,以便使用现有的类库进行应用程序的开发。当然,也可以自己创建新的命名空间,如在示例代码中可以看到一个 myHelloWorld命名空间,在当前程序中声明该命名空间,可以在其他的程序中引用这个命名空间,并使用此命名空间下的类和方法。

“class Program”句定义一个类,Program是一个类名,它可以包含程序所要用到的数据以及所要执行的方法的定义。类在程序中是用来描述对象的,上述代码中的类不包含数据,只包含一个方法。

方法用于描述类的行为。示例代码中的staticvoidMain是一个全局静态方法,它指示编译器从此处开始执行程序,相当于程序的入口,程序运行的时候会执行Main方法作为入口。在C#Windows编程中,大部分应用程序必须在其组成程序的其中一个类中包含Main方法。

语句就是在C#应用程序中包含的指令,通过使用分号进行分割,表示一条语句的结束。示例代码中包含两条语句。一些编程语言只允许一行放置一条语句,但是C#允许放置多个语句,也可以将一个语句拆分成多行。虽然C#编译器支持这样的特性,但还是推荐一行放置一个语句,这样不仅提高了可读性,也便于书写。

括号“{”和“}”用来标识程序中代码的范围,如示例代码中的Main方法囊括了Main方法的语句,Program类囊括了类的方法,而namespace myHelloWorld命名空间囊括了此命名空间里的所有类。

注意:在一个类内的所有方法都是独立的,所以每个大括号后面都不需要分号,同样对于命名空间里的所有类也是一样。

2.变量

在任何编程语言中,无论是传统的面向过程还是面向对象都必须使用变量,因此变量都有自己的数据类型。在使用变量的时候,必须使用相同的数据类型进行运算。在程序的运行中,计算中临时存储的数据都必须用到变量,变量的值也会放置在内存当中,由计算机运算后再保存到变量中。由此可见,变量在任何的应用程序开发中都是非常基础也是非常重要的。同样,在C#中也需要变量对数据进行存储。

要声明一个变量,就需要为这个变量找到一个数据类型。在C#中,数据类型由NET Framework和C#语言来决定,表8-1列举了一些预定义的数据类型。

上述代码声明了一个整数型的变量s,同时也声明了一个单精度浮点型变量上证代的要量分为值类型和引用类型。值类型的变量直接通过其低优用,不能要对它进行有,于位类型的变量直接包含值,并且所有的C品部变量都能要机业化后安进标用,所有的值类型均论式地派生自System.ValueType,并且值类型不能派生出新的类。值的类型不能为null。

引用类型的变量又称为对象,可存储对实际数据的引用,常见的引用类型有class、 interface、delegate、object和string。多个引用变量可以附加于一个对象,而且某些引用可以不附加于任何对象。如果声明了一个引用类型的变量却不将它赋给任何对象,那么它的默认值就是null。

3.数据类型和表达式

C#支持两种基本的类型:一种是值(value types),另一种是引用(reference types)。值包括简单类型(char、int和float)枚举(enum):和结构(struct),引用包括类(class)、接口(interface)、委托(dalegate)和数组(array)。

(1)整数型

整数型分为无符号字节型与有符号字节型。无符号字节型不带正负号,系统都认为是正整数;有符号字节型可以带正负号。

无符号字节型包含Byte(无符号字节型)、Ushort(无符号短整型)、Uint(无符号整型)、Ulong(无符号长整型)。

有符号字节型包含Sbyte(有符号字节型)、Short(有符号短整型)、Int(有符号整型)、Long(有符号长整型)。

(2)实数型

实数型包括float、double和decimal,其中float可表示精度为7位,double表示精度为15位或16位,decimal表示精度为28位或29位有效数字,一般用于财会计算。

(3)数组类型

数组是一个引用类型,能够声明数组并初始化数据进行相应的数组操作。数组是一种常用的数据存放方式。具有相同类型的一组数据可以使用数组类型,访问数据组时通过下标来说明。C#中的数组元素可以是任何数据类型。数组可以是一维或多维的。

数组的声明方法是在数据类型和变量名之间插入一组方括号,声明格式如下所示:

资源。而在.NET中,由于使用了垃圾回收机制,从而导致无法控制析构函数何时被

运行。

垃圾回收机制没有固定的工作模式,它的工作间隔是不可预期的。一般情况下,当应用程序占用的内存不足的时候,会启用垃圾回收器释放未被引用的对象的资源。在应用程序使用复杂并昂贵的外部资源时,.NET机制提供接口能够实现垃圾回收和资源释放,通过实现来自IDisposable接口的Dispost方法可以完成显式的资源释放。

在ASP.NET开发中,显式地使用Dispost方法能够提高应用程序的性能。同样,析构函数也是一种清理资源的方法,在对象析构时,可以用Dispose对对象的资源以及连接信息进行清空,从而对对象进行释放。

(1)封装

在C#中,封装就是将类成员中的字段、方法以及属性事件、委托等放在一个公共的结构中,以保证软件部件具有优良的模块性。按照一个公共的方法把数据和操作这些数据的方法进行组装(封装),同时为对象指定操作和属性,从而创建新的数据类型供用户使用,保证了私密的内容不会被用户察觉。

面向对象的类就是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。这种抽象使得封装人员便于改变内部实现细节,在改变了内部细节之后,用户通常情况下不会感到有任何的差

异。

对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰,更为有力。

(2)继承

在类的设计中,经常需要管理和开发相似的功能,在设计这些类的时候就可以使用继承的原则。继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是其他语言所没有的。

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

在类层次中,子类只继承一个父类的数据结构和方法,称为单重继承,若子类继承了多个父类的数据结构和方法,则称为多重继承。

在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。

采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。在面向对象的应用程序开发中,允许创建一个抽象的类而不实现其具体方法,而需要通过继承、派生来实现方法。

继承的实现就是采用派生类,派生类的优点如下所示:

①提高重用性。派生提高了代码的重用性,不至于在创建一个新对象时再重新写一

个新的类:

②提高结构性。派生让程序有了结构,在程序开发过程,每一个派生类均继承上一 个类的方法,且每个派生类除了可以使用公共的字段以外,可以专门为派生类增加字段和

方法,而不去影响其他的派生类。

(3)多态

与传统的面向对象过程开发不同的是,面向对象所具有的很多特性让开发变得简单和

方便,代码便于阅读和维护,多态也是其中的重要的特性。

多态可以分为动态多态和静态多态两种。

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息,增强了软件的灵活性和重用性

239

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐