1、类的创建

class的创建主要依靠下列基本语法格式:

  1. class 类名{
  2. 控制权限 修饰符 function 方法名() {}
  3. }

在上面语法格式中,我们可以看到有一个叫 控制权限 的关键字,这是一个较深入面向对象的概念,我们暂时不需要学习,只需要知道public 就代表公共权限即可。

注意:修饰符并不是必填的,可以为空,相关的修饰符我们在后面的课件中可以学习到。

下面我们按照上图中的汽车设计图,来创建一个Car对象:

  1. <?php
  2. class Car {
  3. # 生产车头灯
  4. public function Spotlight() { echo '车头灯-生产成功<br/>'; }
  5. # 生产车尾灯
  6. public function Taillight() { echo '车尾灯-生产成功<br/>'; }
  7. # 生产车窗
  8. public function Carwindow() { echo '车窗-生产成功<br/>'; }
  9. # 生产车门
  10. public function Cardoor() { echo '车门-生产成功<br/>'; }
  11. # 生产轮胎
  12. public function Cartyre() { echo '轮胎-生产成功<br/>'; }
  13. }
  14. # 使用demo如下:
  15. # 先打印出设计图(实例化class)
  16. $obj = new Car();
  17. # 再通过设计图,生产出一辆完整的汽车
  18. $obj->Spotlight();
  19. $obj->Taillight();
  20. $obj->Carwindow();
  21. $obj->Cardoor();
  22. $obj->Cartyre();

从上面的代码中,我们不难看出,PHP是依靠:

  1. new 类名()

来打印出一张设计图(实例化一个class对象),再通过:

  1. 实例->方法()

这样的方式,来调用class内部定义的function()

2、类的成员函数

class的成员函数,就是指上面代码中的,function()方法,一个面向,一般是由N个成员函数所组成。
但这些成员函数并不是必须的,也可以创建一个空的class

可能有些聪明、细心的同学已经发现,我们在设计图(class)内部,就创建一个方法,规范定义生产汽车的步骤呢,不然不同的代理商可能会出现,漏掉车门、轮胎等情况,导致生产出不合规的车辆。

答案是可以的,PHP提供了:

  1. $this->方法()

这样的语法格式,用于class可以在内部方法中相互调用。

  1. <?php
  2. class Car {
  3. # 生产车头灯
  4. public function Spotlight() { echo '车头灯-生产成功<br/>'; }
  5. # 生产车尾灯
  6. public function Taillight() { echo '车尾灯-生产成功<br/>'; }
  7. # 生产车窗
  8. public function Carwindow() { echo '车窗-生产成功<br/>'; }
  9. # 生产车门
  10. public function Cardoor() { echo '车门-生产成功<br/>'; }
  11. # 生产轮胎
  12. public function Cartyre() { echo '轮胎-生产成功<br/>'; }
  13. /**
  14. * 为了防止代理商们偷工减料,创建一个方法,规范生产的步骤
  15. * 调用这个方法,生产出一辆完整的汽车
  16. */
  17. public function Produce() {
  18. $this->Spotlight();
  19. $this->Taillight();
  20. $this->Carwindow();
  21. $this->Cardoor();
  22. $this->Cartyre();
  23. }
  24. }
  25. # 使用demo如下:
  26. $obj = new Car();
  27. $obj->Produce();

3、类的成员属性

在Class中,除了function()方法可以传参外,还提供了一个成员属性,可用于Class内部的调用。

成员属性和function()方法传参的区别,是在于:

成员属性可以在各个方法间引用和修改,也可以在Class外进行访问修改。

而以上两点,通过function()传参都是做不到的,同时成员属性还像Class的成员函数一样,可以设置控制权限(这点在后续的课件中,再进行深入讲解)。

下面我们先来看看成员属性的具体语法格式:

  1. class 类名{
  2. 控制权限 修饰符 成员变量名 = 默认值;
  3. }

在上述语法格式中,修饰符和默认值都是可以不用的,如下列格式(修饰符在后续的课件中会进行讲解):

  1. class 类名{
  2. 控制权限 成员变量名;
  3. }

成员属性一般是运用在,多个function()间,会被重复多次使用的,公共的变量值。

例如,下面我们为设计图添加一个成员属性,指定汽车生产时的颜色。

注意:在class内部,也是使用$this->调用对应的成员属性,不过需要注意的是,不带$符号。

  1. <?php
  2. class Car {
  3. # 车辆颜色
  4. public $Color = '红色';
  5. # 生产车头灯
  6. public function Spotlight() { echo $this->Color . '车头灯-生产成功<br/>'; }
  7. # 生产车尾灯
  8. public function Taillight() { echo $this->Color . '车尾灯-生产成功<br/>'; }
  9. # 生产车窗
  10. public function Carwindow() { echo $this->Color . '车窗-生产成功<br/>'; }
  11. # 生产车门
  12. public function Cardoor() { echo $this->Color . '车门-生产成功<br/>'; }
  13. # 生产轮胎
  14. public function Cartyre() { echo $this->Color . '轮胎-生产成功<br/>'; }
  15. /**
  16. * 为了防止代理商们偷工减料,创建一个方法,规范生产的步骤
  17. * 调用这个方法,生产出一辆完整的汽车
  18. */
  19. public function Produce() {
  20. $this->Spotlight();
  21. $this->Taillight();
  22. $this->Carwindow();
  23. $this->Cardoor();
  24. $this->Cartyre();
  25. }
  26. }
  27. # 使用demo如下:
  28. $obj = new Car();
  29. # 生产一辆默认颜色的汽车
  30. $obj->Produce();
  31. # 再生产一辆自己想要的颜色的汽车
  32. $obj->Color = '白色';
  33. $obj->Produce();

4、类的实例化

Class的实例化主要依靠new关键字,其返回值是一个Object(对象)格式的数据。

这个数据中包含了Class的成员属性信息。

想要尝试的同学,可以使用var_dump()打印查看。

5、类的构造函数

构造函数 ,是一种特殊的方法。

主要用来在创建对象时初始化对象,又可以称之为前置操作方法。

构造函数的方法名主要有两种,

  1. 1、第一种是固定的,为:__construct();注意,这里是两个_符号;
  2. 2、第二种是与Class类名相同,即为构造函数。

例如class Car{} ,那么内部定义一个function Car(){}那么这个方法也是构造函数。

一个Class类中,构造函数只能定义一个,也就是说,上面的两种创建方法只能使用其中一种,而不能两种同时存在。

构造函数主要用于初始化一些成员属性,又或者是初始化调用一些方法。

例如,我们将汽车的生产工作、上色工作同时教给构造函数:

  1. <?php
  2. class Car {
  3. # 车辆颜色
  4. public $Color;
  5. /**
  6. * 实例化这个类时,自动调用生产步骤,同时指定汽车颜色
  7. */
  8. public function __construct($color) {
  9. $this->Color = $color;
  10. $this->Spotlight();
  11. $this->Taillight();
  12. $this->Carwindow();
  13. $this->Cardoor();
  14. $this->Cartyre();
  15. }
  16. # 生产车头灯
  17. public function Spotlight() { echo $this->Color . '车头灯-生产成功<br/>'; }
  18. # 生产车尾灯
  19. public function Taillight() { echo $this->Color . '车尾灯-生产成功<br/>'; }
  20. # 生产车窗
  21. public function Carwindow() { echo $this->Color . '车窗-生产成功<br/>'; }
  22. # 生产车门
  23. public function Cardoor() { echo $this->Color . '车门-生产成功<br/>'; }
  24. # 生产轮胎
  25. public function Cartyre() { echo $this->Color . '轮胎-生产成功<br/>'; }
  26. }
  27. # 使用demo如下:
  28. $obj = new Car('红色');

6、类的析构函数

Class的析构函数跟构造函数的作用刚好相反,主要用于在Class的使用结束后,自动释放一些资源。

又可以称之为后置操作方法。

其方法名固定为__destruct();注意,这里是两个_符号;

下面我们新建一个Test类来测试下具体的作用:

  1. <?php
  2. class Test {
  3. # 构造函数,前置操作
  4. public function __construct() { echo '我用来处理一些初始化调用和赋值<br/>'; }
  5. # 普通方法
  6. public function ABC() { echo '我是ABC<br/>'; }
  7. # 析构函数,后置操作
  8. public function __destruct() { echo '我用来释放一些资源'; }
  9. }
  10. $obj = new Test();
  11. $obj->ABC();

7、调用权限控制

之前我们说过,不管是成员属性 或是 成员函数,都可以单独控制对应的访问权限,
public 关键字代表的是公共权限,而Class类的权限控制主要可分为3大类:

  1. 1public(公有):公有的类成员、方法可以在任何地方被访问调用,访问域:类内部、外部都可以。
  2. 2protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问(类本身),访问域:只有类内部可以。
  3. 3private(私有):私有的类成员则只能被其定义所在的类访问,访问域:只有自身类内部可以。

关于子类、父类的知识点,在后续的课件中会进行一一讲解,下面我们先来从一段代码中,学习下3类权限的区别:

  1. <?php
  2. class Test {
  3. # 公共权限的方法
  4. public function Demo_1() { echo '我是公共方法,我在类的内部,类的外部都能调用<br/>'; }
  5. # 受保护权限的方法
  6. protected function Demo_2() { echo '我是受保护的方法,我只能在类的内部使用,不管是子类还是父类(类本身)都可以。'; }
  7. # 私有权限的方法
  8. private function Demo_3() { echo '我是私有的方法,我只能在类的内部使用,并且只能在父类(类本身),子类无法调用。'; }
  9. }
  10. $obj = new Test();
  11. $obj->Demo_1(); // 调用成功
  12. $obj->Demo_2(); // 调用失败
  13. $obj->Demo_3(); // 调用失败

如果在生活中举例这3种权限,可以理解为:

  1. 1public 公共的生活费,你自己、你老婆、你的孩子都可以随意使用。
  2. 2protected 不动产,但有继承权,这部分钱不能拿出去花,或者交易给除了家族外的其他人,你自己、你老婆、你孩子可以随意分配,但就是不能花。
  3. 3private 不动产,没有继承权,这部分钱不能拿出去花,或者交易给任何人,除了你自己,谁都不可以分配。

8、练习题

创建一个Class类,该类有两个成员属性,模仿魔兽争霸3游戏:

  1. 1、血量
  2. 2、攻击力
  3. `

调用一个成员方法,根据攻击力减去血量,并输出当前血量还剩余多少。

答案:下载