7.2 定义和使用类
类是面向对象程序设计思想的基础,可以定义指定类的对象。类中可以定义对象的属性(特性)和方法(行为)。
7.2.1 声明类
在PHP中,可以使用class关键字来声明一个类,其基本语法如下:
class 类名
{
定义成员变量
定义成员函数
}
【例7-1】 定义一个字符串类MyString,代码如下:
<?PHP
class MyString {
var $str;
function output() {
echo($str);
}
}
?>
在类MyString中,定义了一个成员变量$str,用于保存字符串;定义了一个成员函数output(),用于输出变量的内容。
1.定义成员变量
在类定义中,使用关键字var定义一个成员变量。在定义成员变量时,可以同时对其赋初始值。
【例7-2】 定义一个字符串类MyString,定义成员变量$str,并同时对其赋初始值。
<?PHP
class MyString {
var $str = "MyString";
function output() {
echo($str);
}
}
?>
类的成员变量可以分为两种情况,一种是公有变量,使用关键字public标识;另一种是私有变量,使用关键字private标识。公有变量可以在类的外部访问,它是类与用户之间交流的接口。用户可以通过公有变量向类中传递数据,也可以通过公有变量获取类中的数据。在类的外部无法访问私有变量,从而保证类的设计思想和内部结构并不完全对外公开。
【例7-3】 下面是定义公有变量和私有变量的实例。
<?PHP
class UserInfo {
public $userName;
private $userPwd;
function output() {
echo($userName);
}
}
?>
在类UserInfo中,公有变量$userName用来保存用户名,私有变量$userPwd用来保存密码。
在每个PHP类中,都包含一个特殊的变量$this。它表示当前类自身,可以使用它来引用类中的成员变量和成员函数。
【例7-4】 修改类UserInfo,使用变量$this来引用类中的成员变量。
<?PHP
class UserInfo {
public $userName;
private $userPwd;
function output() {
echo($this->userName);
}
}
?>
在类中必须使用$this->userName 访问成员变量$userName ,不能写成$this->$userName,也不能简单地使用$userName。
2.构造函数
构造函数是类的一个特殊函数,它拥有一个固定的名称,即__construct(注意,函数名是以两个下画线开头的),当创建类的对象实例时系统会自动调用构造函数,通过构造函数对类进行初始化操作。
【例7-5】 在UserInfo类中使用构造函数的实例。
<?PHP
class MyString {
public $userName;
private $userPwd;
function __construct() {
$this->userName = "Admin";
$this->userPwd = "AdminPwd";
}
function output() {
echo($this->userName);
}
}
?>
在构造函数中,程序对公有变量$userName和私有变量$userPwd设置了初始值。可以在构造函数中使用参数,通常使用参数来设置成员变量(特别是私有变量)的值。
【例7-6】 在UserInfo类中使用带参数的构造函数。
<?PHP
class MyString {
public $userName;
private $userPwd;
function __construct($name, $pwd) {
$this->userName = $name;
$this->userPwd = $pwd;
}
function output() {
echo($this->userName);
}
}
?>
3.析构函数
析构函数与构造函数正好相反,它是在类对象被释放时执行。析构函数同样有一个固定的名称,即__destruct()。通常在析构函数中释放类所占用的资源。
【例7-7】 析构函数的一个实例。
<?PHP
class MyString {
public $userName;
private $userPwd;
//构造函数
function __construct() {
$this->userName = "Admin";
$this->userPwd = "AdminPwd";
}
//析构函数
function __destruct() {
echo("Exit!");
}
function output() {
echo($this->userName);
}
}
?>
在例7-7中,析构函数只是简单地打印字符串Exit。
7.2.2 定义类的对象
对象是类的实例。如果人是一个类的话,那么某个具体的人就是一个对象。只有定义了具体的对象,才能使用类。
可以使用new关键字来创建对象。例如,下面的代码定义了一个类MyString的对象$mystr:
$mystr = new MyString();
对象$mystr实际相当于一个变量,可以使用它来访问类的公共变量和公共函数。如果类的构造函数中包含参数,则在创建对象时,也需要提供相应的参数值。
【例7-8】 在定义对象时使用带参数的构造函数。
$mystr = new MyString('admin', 'pwd');
可以使用下面的方式来访问类的公共变量。
$mystr->userName;
可以使用下面的方式来访问类的公共函数。
$mystr->output();
但不能使用$mystr访问私有变量,否则会在编译PHP文件时输出如下的错误信息:
PHP Fatal error: Cannot access private property MyString::$userPwd in class1.php on line 22
【例7-9】 下面是一个完整的定义和使用类的实例。
<?PHP
class MyString {
public $userName;
private $userPwd;
//构造函数
function __construct($name, $pwd) {
$this->userName = $name;
$this->userPwd = $pwd;
}
//析构函数
function __destruct() {
echo($this->userName);
echo("Exit!");
}
//成员函数
function output() {
echo($this->userName);
}
}
//声明对象
$mystr = new MyString('admin', 'pwd');
//访问公有变量
echo($mystr->userName);
//访问成员函数
$mystr->output();
?>
7.2.3 静态类成员
静态变量和静态函数是类的静态成员,它们与普通的成员变量和成员函数不同,静态类成员与具体的对象没有关系,而是只属于定义它们的类。
可以使用 static 关键字来声明静态变量和静态函数。例如,定义一个记录数量的静态变量$count,代码如下:
private static $count = 0;
因为静态变量不属于任何一个对象,因此在类中通常不使用$this->count 的方式访问静态变量,而是使用$self::$count对其进行访问。
【例7-10】 定义一个类Users,使用静态变量$online_count记录当前在线的用户数量,代码如下:
<?PHP
class Users {
public $userName;
static private $online_count;
function __construct($name="") {
$this->userName = $name;
$self::$online_count++;
}
function __destruct() {
$self::$online_count--;
}
}
?>
在构造函数中,使用$self::$online_count++语句将计数器加 1;在析构函数中,使用$self::$online_count--语句将计数器函数减1。因为静态变量$online_count并不属于任何对象,所以当对象被释放后,$online_count中的值仍然存在。
因为静态变量不属于任何一个对象,所以通常使用静态函数来访问静态变量。定义一个返回变量$online_count值的静态函数getCount(),代码如下:
static function getCount() {
Return self::$online_count;
}
【例7-11】 演示静态变量和静态函数的实例。
<?PHP
class Users {
public $userName; // 用户名
static private $online_count; //静态变量, 记录当前在线的用户数量
function __construct($name="") {
$this->userName = $name;
self::$online_count++;
}
function __destruct() {
self::$online_count--;
}
static function getCount() {
Return self::$online_count;
}
}
$myUser_1 = new Users('admin');
$myUser_2 = new Users('lee');
$myUser_3 = new Users('zhang');
echo(Users::getCount());
?>
程序定义了一个类Users,其中包含了一个静态变量$online_count,用于记录当前在线的用户数量。静态函数 getCount()的功能是返回静态变量的值。类定义完成后,程序声明了 3 个 Users对象,每声明一个 Users 对象,静态变量$online_count 的值都增加 1。最后调用静态函数Users::getCount(),输出当前在线用户的数量。运行结果为3。
7.2.4 instanceof关键字
instanceof关键字用来检测一个给定的对象是否属于(继承于)某个类,如果是则返回True;否则返回False。其使用方法如下:
$对象名 instanceof 类名
【例7-12】 演示instanceof关键字的实例。
<?PHP
class Users {
public $userName; // 用户名
static private $online_count; //静态变量, 记录当前在线的用户数量
function __construct($name="") {
$this->userName = $name;
self::$online_count++;
}
function __destruct() {
self::$online_count--;
}
static function getCount() {
Return self::$online_count;
}
}
$myUser_1 = new Users('admin');
if($myUser_1 instanceof Users)
echo("Yes");
?>