虽然很多人认为PHP的面向对象编程(一下简称OOP)和C/Java等语言相比有点太过于弱小,但是使用OOP可以大大的增加代码的重用性,还有使得代码修改起来方便与容易,增加代码的可读性。比如PHP对于数据库的接口函数的不一致成为了许多JSP/ASP口中PHP的缺点之一,但是如果我们使用OOP来封装数据库的操作,就可以很巧妙的解决这个问题(比如zphp.com就采用了这种方法)!

一、类的基本使用:
在PHP中使用类(class)来进行封装。
虽然PHP的类和其他OOP语言(比如上面提到的Java)相比,非常单纯,只有简单的方法 (method)、属性、以及单一继承 (extensions) 等等,但是很多初学PHP的人对于类确总是搞不懂;不过学好类,是学好PHP的其中一条!在著名的Vb论坛里面,就大量使用了类。
在PHP中声明一个类的方法如下:
Class computer {
var screen = '15'; // 显示器大小
var cpu = 'Pentuim 3 733MHZ'; // CPU速度
var mem = '256 MB SDRAM HY'; // 内存大小

/* 设置显示器大小 */
function setScreen($screen) {
$this->screen = $screen;
}
/* 设置CPU */
function setCpu($cpu) {
$this->cpu = $cpu;
}
/* 设置内存大小 */
function setMem($mem) {
$this->mem = $mem;
}
}
在上面,“computer”是这个类的名称,setScreen/setCpu/setMem是这个类的操作,他们的作用可以参见上面的注释;而screen/cpu/mem分别是computer这个类的属性。
使用“var varName;”可以设置一个类的属性,但是类的属性的设置必须放在类的开始,在任何操作的前面;如果你希望给一个类赋予初值,可以使用““var varName = varValue;”来实现。
而设置一个类的操作的方法和设置一个函数一样:function methonName()……,类的操作和函数基本上没有什么区别,也可以有返回值,比如:
Class test{
function method() {
return 'hi';
}
}
$test = new test;
echo $test->method(); // 会输出“hi”
要使用这个类,我们需要使用特定的语法“new”来创建这个类:
$computer = new computer;
然后如果要使用类的操作可以用类的操作符“->”来实现:
$computer->setCpu('AMD K6-2 500'); // 执行setCpu操作
如果要访问类里面的变量,同样使用类的操作符来实现:
$computer->cpu = 'AMD K6-2 500';
但是在类的外部直接使用/更改类的属性是一个非常不好的习惯,对于任何类的属性的值都应该创建一个操作来改变,而不是直接的去改变!
如上的代码用到了一个特殊的类变量名称“$this”,和其他OOP语言一样,“$this”在一个类中代表这个类的本身,在类的操作中可以使用“$this->varName”来设置/修改类属性varName的值,也可以使用“$this->methodName([arg...])”来之心类里面的操作。


二、构造函数:
在类中有一种特殊的操作,叫做“构造函数”:它的名称和类的名称一样,没有返回值,并且每次用“new”创建一个新类的时候都会同时执行构造函数,比如在上面的computer类中:
function computer() {
echo $this->cpu;
echo $this->mem;
echo $this->screen;
}
$computer = new computer(); // 会输出CPU和内存/显示器的信息
利用构造函数,可以将每次都必须设置/执行的代码省略合并,方便编程。但是需要注意的是构造函数是没有返回值的,因为调用构造函数时候的类变量需要记录类的信息,不可能再得到返回值。


三、继承:
如果有一个类“computer2”需要具备类“computer”的全部属性和操作,就可以使用继承(毕竟从新写一遍代码太麻烦了),比如:
Class computer2 extends computer{
function computer2() {
echo 'Extends';
}
}
$computer = new computer2();
$computer->setCpu('Cyrix 3 300MHZ');
上面的最后一句将会执行类“computer”的setCpu操作,因为在生命类“computer2”的时候加上了“extends”说明类“computer2”具备了类“computer”的全部属性和操作。在类“computer2”继承了类“computer”以后,类“computer2”成为“子类”,而类“computer”成为“父类”(有些地方称为“基类”)。
关于继承,有几个值得注意的地方:
1、关于子类调用父类的操作:虽然类“computer2”继承了类“computer”,但是在类“computer2”的操作里面是不能直接使用“$this->method()”来执行类“computer”的操作的。在C/Java里面可以使用super这个特定的名称来执行,但是到了PHP里面就失效了,PHP里面子类要调用父类的操作需要使用操作符“::”,比如在类“computer2”里面定义一个操作“setCpuAndMem”:
.......................
function setCpuAndMem($cpu, $mem) {
computer::setCpu($cpu);
computer::setMem($mem);
}
.......................
$computer = new computer2();
$computer->setCpuAndMem('Cyrix 3 300MHZ', '256MB DDR'); // 上面的代码将会分别设置CPU和内存
2、关于多重继承:PHP现在还不支持多重继承,也就是说一个子类不能拥有多个父类。
3、关于重载:PHP也不支持重载(所以你没有必要知道这个是什么),如果父类里面拥有的属性或者操作,子类也拥有一个同名的操作或者属性,那么父类的属性或者操作将会被子类所覆盖。比如在类“computer2”里面声明一个操作“setCpu”:
.......................
function setCpu() {
return computer::cpu;
}
.......................
$computer = new computer2();
echo $computer->setCpu();
上面的程序有一些问题,就是操作“setCpu”和它的内容不符,我们执行“$computer->setCpu();”会返回CPU的信息,而不是上面父类的设置CPU。


四、命名规则:
一个类或者函数的命名应该让人看起来易懂,一般来说我们将类的名称做如下的规范:第一个单词小写,以后每个单词第一个字母大写以便分隔不同的单词,当然也可以使用下划线“_”来分隔,比如:
setCpuAndMem set_cpu_and_mem


五、数据库操作类:
一开始我们就提到可以使用类来封装数据库的操作,使得数据库的操作看起来非常简洁,其实最主要的好处是如果需要更换数据库,程序员不需要从头到尾的将程序修改一遍,而只是需要修改数据库操作的类。在这里我们将一步一步的建立一个数据库操作的类(以MySQL为例子,只是列举最主要的部分,其他部分就等待大家自己扩充了,否则有骗稿费的嫌疑:),大家可以自己扩充需要的数据库)。
首先我们应该知道一个数据库操作的类需要一些什么操作:
1、连接数据库
2、查询query
3、取得查询的数据

下面是我们制作的数据库操作类的代码:
Class dbSql{
var $Host = 'localhost'; //主机名称
var $Database = 'test'; //数据库名称
var $User = 'root'; //用户名
var $Password = ''; //用户密码
var $Record = array(); // 数据记录
var $Row; // 记录行数
var $Link_ID = 0; //连接的id
var $Query_ID = 0; //查询的id
function dbSql() {
$this->connect();
}
function connect() {
// 连接代码
}
function query() {
// 查询代码,将查询ID保存给$Query_id
}
/* 下面这个函数将会将返回的结果向下移一行 */
function next_record() {
if (!$this->Query_ID) {
return false;
}
$this->Record = mysql_fetch_array($this->Query_ID);
$this->Row++;
$stat = is_array($this->Record);
return $stat;
}
}
/* 返回Name字段的值 */
function f($Name) {
return $this->Record[$Name];
}
}
下面是这个类的实例,取得username这个table的id这个字段的值:
$db = new dbSql;
$db->query("select id from username");
while($db->next_record()) {
echo $db->f('id');
echo '<br>';
}

其实这个类还有很多很多的不足,比如错误处理等等,功能也非常简陋,就等待大家自己扩充了。如果不愿意自己扩充,也可以去http://www.zphp.com下载PHPLib或者ADDOB,他们里面就带有了非常强大的数据库操作类!希望以后大家写出来的程序都方便修改……