1.4 PHP/MySQL的基础知识
前节所介绍的内容,应该能构筑起本书的例子所需的最低限运行环境。
PHP的确是做得很好的服务器端技术,入门者凭直觉就能很容易理解,但是首先重要的是必须先掌握基本的语法知识。本节从一个真正的例子开始逐步说明一下编程以及周边的基础知识。总之好好掌握这些PHP的基础知识,MySQL数据库的操作方法非常重要。
1.4.1 PHP基础知识
首先从使用PHP进行编程的基本规则开始,这里只是介绍基础中的基础知识,如果想进一步学习更详细的知识,可以参照其他详细介绍这方面知识的书籍。
文件名的命名方式
和Html文件以“.html”,“.htm”为后缀一样,PHP的脚本必须以“.php”为后缀。在像Apache等Web服务器上,PHP执行引擎就通过判断“.php”后缀才能运行程序,本书中大部分程序用这个后缀。
由PHP脚本内部间接调用,而不是由终端用户直接调用的“包含文件”(include file),有时为区别于一般的PHP脚本文件,有专门的后缀“.inc”,但是本书不推荐使用。
应用程序目录结构
向终端用户公开的用户,放在专用的文件夹下,Windows环境的情况下放在“C:/Programe Files/Apache/”,Linux环境放在“/usr/local/apache/htdocs/”之下,通常应用程序都在一个文件夹下,里面包括脚本文件、图片文件、表单文件等。本书的例子拥有如下的结构。
像设定文件(如ini文件)、数据文件(.txt、.xml、.dat)、模块文件(.tpl)等,只是在应用程序内部使用的文件,不应该放在终端用户能直接访问到的目录下。本书是为了方便,才将这些文件放在同一个目录下的。如果在商用系统中这样做的话,则会容易产生安全漏洞。
Zend Framework(Zend_Controller)有自己独特的构造,在后面的章节中有专门的介绍。
PHP脚本的基本语法
以下是用PHP脚本写成“Hello,World”的基本应用程序。通过这个例子大家可以理解一下PHP的语法规则。
Hello.php的执行结果:“你好,PHP!”,如图1-44所示。
图1-44 结果显示
1.脚本定界符
PHP是嵌入在HTML程序中的语言,HTML文件的任意一个地方嵌入像<?php?>这样的程序块后,就能插入PHP脚本程序了,PHP引擎只解释<?php?>程序块中内容,并将结果返回到客户端。<?php?>被称脚本定界符,就是分隔HTML和PHP脚本的意思。除此之外还有如下的脚本定界符:
都是根据设定的内容,而决定是否有效。其中<??>与XML的处理命令相冲突,所以原则上推荐使用<?php?>。
另外,脚本程序块末尾的标记“?>”,在PHP代码的后面如果再也没有HTML代码的情况下,应该省略掉(注意并不是推荐,而是应该)。不省略的话也没有错,“?>”的后面如果有改行符或省空格的话,这些都会在浏览器上输出出来,网页外观会出现不应有的偏差,这些在单一文件生成的网页里是不会有问题的,当多个文件输出一个网页时,就会出现问题。
本书中所有以“?>”结尾的地方都省略掉了。
2.表达式
PHP脚本就是由一个或一个以上的表达式组成的,像Hello.php中的“Print(‘你好,PHP!’);”就含有单一的表达式。PHP的表达式有如下的规则:
● 表达式的末尾必须“;”分号结尾。
● 命令中的无大小字母的区别。
表达式的中间出现了改行符时,还是看做一个表达式。像如下的表达式,就是正确的表达式(PRINT是故意写成大写的)
当然,这种情况下故意写成这样,是没有任意意义的,当一个表达式太长的时候,通过适当的中间换行使代码的易读性更好。
3.注释
脚本中可以自由加入注释,在行头加入“//”后,从行头到末尾都可以看作注释。如果想一次性加入多行注释时,可以用“/**/”,从“/*”开始到“*/”结束都将被看做注释。
4.变量
变量是用来存放数据的,根据数据的种类不同,大多数需要事先声明变量名与变量类型。PHP中变量的使用非常自由,不用提前声明变量,变量被赋值时系统开始给为保存的数据分配内存空间。数据的类型在赋值是自动判断。
● 第一个字符为[$]。
● 第二个字符为字母或下划线。
● 第三以后的字符为数字,字母或下划线。
● 不区别大小写。
即“$data”,“$_test”,“$x1”为正确的变量名,而“$123”,“data”,“$小明”是不正确的。另外,建议尽量为所使用的变量起一个容易理解的名字。
5.变量类型
前面介绍过,PHP中完全不用理会变量类型、数值、字符串、布尔型(TRUE/FALSE)、对象等,都能自由地赋值给变量。
整个文字串必须用单引号“‘”,或双引号““”括起来,这单引号与双引号有些细微的区别,大家可以看看下面的例子。
如上所示,使用双引号时,字符串中包含的变量将被作为变量来解释,相反单引号时变量名只作为文字解释。
为避免不必要的歧义,本书中原则上都使用单引号,唯一例外的是当字符串中含有转义系列(escape sequence)时应用双引号。
6.数组/联想数组
使用数组后,一个变量中可容纳多个数据,数组被分为拥有index号码的普通数组,与拥有字符主键的联想数组。可以参照以下的语法:
如上所示,使用array命令来定义数组,一般数组来说从数组开始的项目开始依次赋予0,1,2,3,…的号码或者说主键,联想数组必须以“键->数值”这种形式指定明确的主键,用“$变量名”、“主键名”的形式来引用一般数组和联想数组。
另外,PHP中从客户端提交的信息(数据)也被保存在一系列被称超级全局变量的联想数组中,如$_GET,$_POST,$_SERVER等。在写PHP脚本之前,必须了解这些所谓的超级全局变量,从第2章开始结合具体的例子会再做详细说明。
7.函数
函数就是给其传入一些参数(0或1个以上),在内部进行相关处理,然后返回结果的程序块,其他开发者不用知道这个函数内部的详细处理过程,只要了解了需要传递什么样的参数和会返回什么值后,就可以利用这些函数。这样开发者需要将精力集中在主要逻辑部分。
用PHP写成的脚本程序容易理解,也正是因为很多复杂、烦琐的功能都已被写成了函数,因此程序看起来就简洁多了,开发者不用再在这些方面花费精力。函数的调用形式如下,没有参数时可以省略。
例:
应用Function命令,开发者也可以定义自己的函数,在应用程序开发时,如果发现相同程序块重复出现,就可以考虑将这些重复的部分定义为函数。
参数接受来自调用方的数值(对象),只能在函数内部使用。最终结果由return命令返回。return命令执行后函数的处理权交给调用方,需要注意的是,return以后的处理命令就不执行。另外,没有返回结果时,return命令可以省略。
1.4.2 面向对象语法
PHP原来是以函数为中心进行编程的,从PHP5开始强化了面向对象编程的概念,现在PHP也向面向对象编程的方向不断前行。PEAR,Zend Framework,Smarty等主要的类库、构架都是用面向对象技术写成的,因此理解面向对象语法渐渐成了最基本的要求。
在面向对象的世界里,首先得理解类/对象的概念,简单地说,类,表面上就是函数的集合体。在理解类/对象这个概念之前,大家好好看看前面介绍的关于函数的内容,我们可以在比较函数概念的基础上来试着理解类/对象。
函数接受参数传过来的值,内部进行处理,处理完成后,将结果返回(OUTPUT)给调用方。大家可以看出,函数只是让数据从其中通过(INPUT⇒OUTPUT)。而下面将要介绍的类/对象是可以拥有这些数据的,类/对象管理这些数据及其相关处理,当进行大规模处理时,类/对象的这些特征拥有巨大的优势:函数只能提供单一功能,而类/对象提供多种功能。
类/对象中的那些数据(变量)就是所谓属性(property),类/对象中的函数称之为方法。利用类/对象之前,首先必须要进行实例化(拷贝)的动作。一般用New命令进行实例化。根据类的不同,有的类提供专用的方法进行实例化的动作。
例:
这样对象就生成的(类的复制),在程序中直接使用就是这个对象。到现在为止的介绍里都将类与对象当做等价的来说明。严格来说类与对象是两个不同的概念,你可以将类看做如何定义数据以及数据处理的“设计图纸”,而对象是用这些图纸制造出来的机器,同一个类只会存在一个,而由类生成的对象可以存在多个。
用“->”这个运算符调用对象中的属性与方法。例:
但是,也有不用生产对象,而直接从类中调用的属性与方法被称为“静态属性”,“静态方法”(而经由对象调用的属性和方法被称为“实例属性”和“实例方法”),调用静态属性和方法应该用“::”这个运算符。
例:
是否是静态方法需要参照类的文档。
1.类的定义
我们可以自己定义类,后面第5章中有介绍的关于Zend_Controller的程序,在其中,自己定义类是必不可少的。下面介绍一下类定义的基本语法。
class命令:
类里的成员变量,成员函数的定义和类外普通变量,函数的定义是一样的。只是需要在类内部的变量,函数前加上如“private”,“protected”,“public”这样的关键字。这些关键字称为连接修饰符,也就是表示类的属性,方法能否从外部调用。
private表示方法/属性只能在类的内部进行调用。
protected表示方法/属性只能在类以及其派生的子类中被调用。
public的方法/属性在类的内外都能被调用,连接修饰省略或成员变量前加了var的情况下,都被看成是public的方法/属性,在此建议用明确的连接修饰符来定义方法/属性。
● $this关键字
$this代表类的实例,例“$this->$_user”就代表调用类里的成员变量$_user。
● 构造方法(constructor)
构造方法(或称为构造函数)是在类进行实例化时自动被调用的特殊成员函数,主要完成类初始化的一些动作。在PHP5中构造方法的名称是固定的“_construct”。
另外,实例执行结束时也有自动被调用的成员函数,主要完成对象资源释放的工作,它也有固定的名称“_destruct”。
构造方法可以拥有任意的参数,但是破弃方法不能设定任何参数。_construct,_destruct是从PHP5开始才有的关键词。PHP4时必须定义与类同名的构造函数(例如类FirstClass中必须定义FirstClass函数),而PHP4时还没有破弃方法这个概念。
2.继承
继承就是通过在继承母类功能的基础上,追加新的成员,或改写原有的成员函数而定义一个新的类。利用继承定义新类时,不用从零开始写代码,而这样代码也变得更简洁了。
本书后面将要介绍的构架编程(Framework Programming)中,通过继承构架提供的类来定义自己的类,用户只用追加应用程序的业务逻辑,而完全不用操心如网页控制、数据库连接、session管理等固定的功能。当然并不是在构架编程中继承才重要,在其他很多地方都会用到继承,请务必理解好继承这个概念。
继承母类时,只用在子类(FirstClassExtends)的定义后面加上“extends母类名”就可以了,在上面的例子可以看出生成子类的实例后,不仅可以调用子类中定义的成员函数,也可以调用母类(FirstClass)的成员函数。
1.4.3 PEAR的基础知识
关于PEAR前面稍微介绍过一下,PEAR库能够应用pear命令很容易安装。命令的形式如下:
*windows环境的情况可以应用本书的介绍步骤。Linux环境的pear命令在/usr/local/bin下。-a选项就是有依赖关系的所有的包都自动被安装,而-f选项意味着α/β版的包也被强制安装。
PEAR库中很多包之间都有依赖关系,这些包一个一个安装会非常麻烦,通常总是带上-a选项应该是不错的选择。另外,-a选项意味着所有有依赖关系的包都被安装。-o选项只在安装有依赖关系中才是必需的。不想安装依赖关系的包的话,可以选择-o选项,先将必须的包安装上,再手动安装其他的需要的包。-f选项是在安装对象包不是稳定版本时才使用,PEAR命令默认安装稳定版,而使用-f选项像α/β等测试版也能被安装,安装稳定版时,-f选项可省略。
例如安装PEAR:Pager时的命令如下:
如图1-45所示,从下载、安装开始,最后出现“install ok”的信息就意味着安装成功,第4章中要用到PEAR库,请务必在此好好理解一下PEAR的命令。
图1-45 执行PEAR的命令
PEAR命令中除了install选项外,还有其他主选项见表1-7。
表1-7 PEAR命令选项
在那些不能使用PEAR命令的环境中(如有些租借服务器),可以暂时将那些下载到本地的环境,手动解压缩后再上传到服务器环境中。
各种包中的文件千差万别,解压缩后基本是由.php文件以及下面的子目录组成的。解压缩后(Pager-X.X.X)将这文件以及子目录复制到php.ini中指定的include_path目录下(但是像“/tests”,“/docs”等目录可以不用复制)。
1.4.4 MySQL的基本知识
下面简单介绍一下MySQL的基本知识。如果只是运行本书中的实例,直接接触数据库的机会并不多。但是,你想改变一下数据库的表的结构,或是想追加新的表,又或是当你遇到这些实例不能正确运行,而又想看看数据库的内容时,那就必须了解些MySQL操作的基本知识了。
这里就利用Windows命令行窗口来运行MySQL客户端命令操作MySQL数据库的知识进行介绍。当然你也可以应用其他管理工具,如mysqladmin,MySQLFront等。
启动MySQL客户端
MySQL客户端是命令行工具,只能在Windows命令行窗口中运行。打开如下的命令就可以进入MySQL客户端了。
-u是指用户名,-p是指定密码的选项。-u,-p指定后网页提示让你输入密码,输入与用户名对应的密码后就可以进入MySQL客户端了
登录成功后的界面如图1-46所示。
图1-46 进入MySQL客户端
注意:当窗口出现[]的错误信息时,那是因为你还没有将mysql命令所在路径包括进PATH环境变量中。当然,你也可以在命令行窗口中输入绝对路径(“C:/Program Files/MySQL/MySQL Server5.0/bin/mysql”–u用户名-p)来执行上述命令。在PATH环境变量中设置的也是双引号中的绝对路径。需要注意的是,当你在命令行中输入这些带空格的路径时,必须用双引号将其包括起来。
在Windows环境中设置变量时,请单击“控制面板”→“系统”→“详细设定”→“环境变量”,找到PATH环境,然后,在其设定值最后加入上述路径,并以“;”分隔(Linux环境下是“:”)。
创建新数据库
命令行窗口中出现了“mysql>”后就意味着登录成功了,这样你就可以执行数据库操作命令了。
下面我们就尝试做一个新的数据库,生成数据库的命令如下:
在SQL命令最后,必须加上分号“;”,当SQL命令太长时可以分成多行来输入,最后一行加上“;”。
这样mydb数据库就建成了,建成的数据库可用SHOW DATABASE来确认:
1.选择要操作数据库
使用如下的命令在不同的数据库间转换:
2.创建新表
我们可用CREATE TABLE命令在上述mydb中创建一个名为master的表,SQL命令如下:
执行完成后,就可以用SHOW TABLES确认。
SHOW TABLES命令能够查看数据库中(mydb数据库)建成的表一览,如果一览中有master表,就说明创建master表成功了。另外也可以用SHOW FIELDS命令显示表的详细情况。
3.退出mysql客户端
像其他数据的检索更新命令是基本的SQL命令,本书就不一一介绍了。这里最后介绍一下如何退出mysql客户端:
mysql>在窗口中消失,回到通常的命令行窗口后,就表明退出成功了。
知识专栏:下一代版本PHP6的特点
PHP5是在2004年7月发布的,本书出版之时距离PHP5发布已经过去快6年了。这期间发布了PHP5.1,5.2等升级版本,作为PHP5的升级版本,不断地在业界得到普及。这期间,尽管还没有确定发布时间,下一个版本PHP6的大致模样已经隐隐约约地可以看得到一些了。
因为是大的版本升级,所以有许多重大的更新。进行新的项目开发时,事先了解有哪些变动,肯定是有必要的。下面是PHP6中将要进行的主要修改(这些都是本书出版时的信息,有可能发生变动)。
● 支持Unicode的本地对应
● 名称空间的支持
● 导入goto语法
● 废弃register_globals参数
● 废弃安全模式
● 废弃zend.ze1_compatibility_mode(Zend Engine 1的互换模式)
● 支持APC(Alternative PHP Cache)
共有条评论 网友评论