



类(class)与对象(object)是面向对象编程中最基本的两个概念。类可以看作是一种复杂的数据类型,其中定义了数据(属性)和数据的操作(方法)。对象是某个类类型的变量,称为类的实例。
本书代码中,自定义的类都以小写字母t开头,表示这是一个类型(type),在t字母之后,使用单词首字母大写的形式,如tAuto、tAutoFactory等。
下面,首先了解如何在PHP中定义类和对象。
PHP中定义类时,需要使用class关键字,类的成员主要包括属性和方法,它们的访问级别包括:
● public(公共的),提供给外部代码调用的成员。
● private(私有的),只在本类中使用的成员。
● protected(受保护的),只能在本类或子类中访问的成员。6.6节将介绍相关应用。
类的成员中,属性用来存放数据,可以使用变量定义;方法定义了数据的操作,通过函数实现。下面的代码创建了一个名为tAuto的类(/demo/tAuto.php)。
代码中定义了两个属性,分别是$model和$doors,表示车辆型号和车门数量;drive()方法会显示车辆行驶信息。请注意,定义方法时需要使用function关键字。此外,在drive()方法中通过$this引用了model属性,这里的$this表示类的当前实例,即当前对象。
本例中定义的三个成员都使用了public关键字,表示它们都是公共成员,可以在外部通过对象调用。
下面的代码在/index.php文件中测试tAuto类的使用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";
$auto = new tAuto();
$auto->model = "X2019";
$auto->drive();
?>
代码中,首先使用require_once语句引用tAuto.php文件,然后使用“new tAuto()”语句创建一个tAuto类的实例,并赋值给$auto对象。其次将$auto对象的model属性设置为“X2019”,最后调用$auto对象的drive()方法。代码执行结果见图6-1。
图 6-1
示例中,创建对象使用了new关键字,类名后的一对圆括号表示调用默认的无参数构造函数,稍后讨论。
创建对象后,通过->运算符调用实例中的属性和方法。请注意,在调用属性时,对象使用$符号,属性名不需要使用$符号。
判断一个对象是否为某个类的实例,可以使用instanceof运算符,其运算结果为bool类型,如下面的代码。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";
$auto = new tAuto();
$x = 10;
var_dump($auto instanceof tAuto);
var_dump($x instanceof tAuto);
?>
代码执行结果见图6-2。其中,$auto对象是tAuto类的实例,但$x变量不是。
图 6-2
此外,还可以使用get_class()函数获取对象所属类的名称,如下面的代码。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";
$auto = new tAuto();
echo get_class($auto);
?>
执行代码会显示tAuto。
在PHP 8中,还可以使用$obj::class属性获取对象所属类的名称,如下面的代码。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";
$auto = new tAuto();
echo $auto::class;
?>
在PHP 8环境下执行代码会显示tAuto。
为什么要使用方法操作属性数据呢?一个重要的原因是,可以对数据进行检查,确保设置了正确的数据,如车门的数量不能为负数,也不能太多。下面的代码(/demo/tAuto.php)将doors属性设置为私有的(private),然后使用方法来访问它的值。
代码中,setDoors()方法用于设置车门数量,当参数的值为0到5时,保存到$doors属性中,否则设置为4;getDoors()方法用于返回车门数量,这里直接返回$doors属性值。下面的代码在/index.php文件中测试getDoors()和setDoors()方法的使用。
<?php
require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";
$auto = new tAuto();
$auto->setDoors(10);
echo $auto->getDoors(),"<br>";
$auto->setDoors(2);
echo $auto->getDoors();
?>
代码执行后会显示4和2。