类和对象:基本概念

在前面的章节中我们学习了 PHP 的基础知识:语法、常量与变量、数据类型、运算符、流程控制和函数,这里做一次简要的复习:

  • 服务器通过<?php ?>识别 PHP 文件
  • 数据类型有九种:
    • booleanstringintfloatarrayobjectcallableresourcenull
  • 常量与变量都有数据类型,变量使用美元符$声明
  • 运算符将常量/变量进行连接,构成表达式
  • 条件语句、循环和中止语句控制脚本的运行顺序,即流程控制,包括:
    • ifif...elseif...elseif...elseswitch
    • whiledo-whileforforeach
    • breakcontinuereturn
  • 函数是某一特定功能的实现,使用关键字function声明

复习完毕。

我们可以写一些简单功能的代码了。例如一个简单的用户注册功能,你需要接收用户注册的信息,然后连接数据库、建表、保存数据,很简单。但是,你可能还要写用户登录功能,接收的信息几乎一样,同样是连接数据库,然后进行数据库操作。多么相似!再复杂一点,你的用户可以发表评论,等等。

你可能需要写许多代码,有时候还需要添加一些功能,用户与用户之间也有不同......听起来就很手忙脚乱对吗?并且代码难以组织与维护。那么这时候你需要使用类和对象


如果说对象是现实世界客观事物的一种抽象表达,那么类就是对象的抽象。虽然不太严谨,但是可以把类理解为“某个群体中具有相同属性和功能的成员的集合”,而对象就是这个集合中的成员。

打个比方,在图书馆里,每一本书都是一个对象,每个读者也是对象,图书管理员也是一个对象,但他们都是不同的。不同的书虽然也是不同的对象,但是它们都有许多相似的属性(比如说书籍都有作者、出版社、定价等),那么在图书馆这个“小世界”,“书”就是一个类。同样的,每个读者都是不同的对象,但他们也拥有着部分相同的属性(姓名、年龄、读者号等),于是“读者”也可以是一个类。

再打个比方,在植物世界里,花草树木都属于植物,那么植物就可以是一个类,而花草树木都是它的对象。再细致一点,花也可以是一个类,例如每朵花都有颜色、气味、作用等。从某种意义上说,类也可以理解为“分类”、“类别”,对象则是“类别”下的成员。

现实世界里每个事物都有其描述与功能,比如在下面这段描述中:

一部手机 A 有着黑色的外壳,壁纸是一个帅气的男明星,操作系统是 Android 的,可以用来打电话、发微信、刷微博。

我们可以剖析它的结构:

  • 是什么
    • 手机
  • 有什么属性
    • 外壳:黑色
    • 壁纸:明星
    • 操作系统:Android
  • 有什么功能
    • 打电话
    • 发微信
    • 刷微博

然后我们可以抽离这些属性和功能,“定制”一个关于“手机”的类,手机A就是“手机”类的一个对象。换一部手机B可能有不一样的外壳、壁纸和操作系统,但它同样可以打电话、发微信和刷微博,那么手机B也可以是“手机”类的一个对象。

三个例子你大概可以知道类和对象是什么了(如果不清楚,继续学习并实战会慢慢明白的),下面我们开始进入类和对象的语法讲解。

定义类

每个类的定义都以关键字class开头,后跟类名和花括号。花括号内可能含有类属性和类方法,具体定义如下所示:

<?php

class className
{
    public $property1;// 类属性
    public $property2 = '带默认值的类属性';

    const CONSTANT = '类常量使用关键字 const 定义';

    public function classMethod()
    {
        // 函数,在类中称为 方法
    }
}

上面的代码我们将在下一节进行详细讲解,定义一个类只需要以class开头,后跟类名和花括号,花括号内是类代码即可。

创建类实例:对象

对象是类的一个实例,也可以说是类的一种具体表现。创建一个对象使用关键字new,后跟类名和圆括号,例如:

$instance = new className();

在前面“函数”章节部分我们知道了函数具有可变性,类实例化也有类似的功能:如果new关键字后跟的是一个与类名相同的字符串变量,后跟一对圆括号,如下所示,下面的代码功能与上面的代码一致:

$class = 'className';
$instance = new $class();

本节只讲解了类和对象的基础概念,设计类时应该根据不同的情况制定不同区分规则(分类),剖析事物的共同点,抽离出“类”的定义,并根据不同对象之间的关系进行类的设计。下一节我们开始学习类的结构