14.2 PHP中的类和对象
PHP支持面向对象的编程,支持类和对象的概念。从数据类型的角度看,对象是一种比较特殊的数据类型。它由一个事先定义好的类生成,而类由用户自己定义,它由一系列数据和对这些数据操作的数个函数组成。
可以这么认为,类是一种用户自定义的数据类型,通过这个类型可以定义一个该类型的变量,这个变量就是该类型的对象。通过下面的代码,可以使读者对类和对象有一个感性上的认识。
$a_man=new person;
上面的代码,类是person,而$a_man就是person类型的变量,即$a_man是类person的对象。
类也是一种数据类型,可以把它看做是实际变量(对象)的模板或蓝图。要创建类类型的变量,就必须使用new运算符,就像上面代码那样:“$a_man=new person”,这个语句指定$man为person类型的变量。回忆一下对其他普通类型变量的定义,往往只是直接对变量赋值,并没有指定它的类型,如“$a=10”,即指定了变量$a是个整型变量。这是类类型和普通数据类型在使用上的一个不同之处。
PHP5把对象看成与其他数据类型不同,对象通过引用来传递。但PHP不强求通过引用(reference)显性传递和返回对象。在PHP5中,复制一个对象或者将一个对象当作参数传递给一个函数时,计算机不需要复制数据,而是仅仅保持相同的对象指针。这就是说,在程序中目标对象的任何改变都会影响到源对象。这使得对象看起来就像总是通过引用(reference)来传递,因此在PHP5中,对象默认为通过“引用”传递,不再需要像在PHP4中那样使用&来声明。
注意 PHP可以完成内存管理,自动清除不再需要的对象。当PHP程序中不再需要使用某个对象时,PHP会自动释放其所占的内存空间。
14.2.1 类的创建
在PHP中使用下面的语法定义类:
class classname
{
statement
}
class是PHP的保留关键字,表示开始类的定义。classname是类名,由开发人员指定。由花括号“{”和“}”括住的语句statement是类的实体,它一般由数据和对这些数据进行操作的函数组成。类中的数据,一般被称作成员变量(也叫属性),类中的函数一般被称作成员函数(或称作方法)。下面的代码定义了一个类。
class person
{
private$name;
}
这段代码定义了一个名叫person的类,它只有一个属性$name。这个属性由关键词private限定,它的含义是,该成员变量是私有的,表示该属性不能从类的外部访问。请看下面的代码。
$a_man=new person;
$a_man->name='Jack';
这段代码执行时会产生一个错误,因为语句$a_man->name='Jack'在类的外部访问类的私有成员变量$name。由private声明的成员变量$name不能从类的外部访问,只能在类的内部操作private性质的成员变量。
通常,定义类就是为了将数据加以封装,这样防止数据在封装之外被修改,而对数据的操作以接口形式提供给外部程序使用。也就是说,类通过定义类的成员函数,向外部提供操作类成员变量(即属性)的接口,外部程序通过这些函数完成对类私有成员的操作。请看下面的代码。
01 class person
02 {
03 private$name;//私有成员变量$name
04 public function set_name($name)//成员函数set_name()
05 {
06 $this->name=$name;
07 }
08 public function get_name()//成员函数get_name()
09 {
10 echo"user name is:".$this->name;
11 }
12 }
【代码解析】现在person类有一个私有成员变量$name,两个成员函数:set_name()和get_name(),这两个函数用关键字public声明,表示它们是公有成员,公有成员可以从类的外部访问。函数set_name()通过语句$this->name=$name为类的私有成员变量赋值,因为这是在类的内部操作变量$name,所以是允许的。而函数get_name()用来输出变量$name的值。对象通过运算符“->”操作成员变量和成员函数。该运算符左操作数是对象,右操作数是对象的属性或方法。这里有一个特殊的变量:$this,它表示该类实例化成对象时,该对象本身。在使用$this时,它的右操作数如果是成员变量,该成员变量前不再加符号$,只在this前加符号$。这一规则同样适用于对象变量。
说明 类的属性声明为private,操作这些属性的成员函数声明为public。但这并不是绝对的,有时也希望某个成员函数不会在类的外部被调用,此时,就可以将该成员函数声明为private。
注意 在PHP中,类的名称不区分大小写。因此,不能既定义person类又定义PERSON类。