1、类的创建
class的创建主要依靠下列基本语法格式:
class 类名{
控制权限 修饰符 function 方法名() {}
}
在上面语法格式中,我们可以看到有一个叫 控制权限
的关键字,这是一个较深入面向对象的概念,我们暂时不需要学习,只需要知道public
就代表公共权限即可。
注意:修饰符并不是必填的,可以为空,相关的修饰符我们在后面的课件中可以学习到。
下面我们按照上图中的汽车设计图,来创建一个Car
对象:
<?php
class Car {
# 生产车头灯
public function Spotlight() { echo '车头灯-生产成功<br/>'; }
# 生产车尾灯
public function Taillight() { echo '车尾灯-生产成功<br/>'; }
# 生产车窗
public function Carwindow() { echo '车窗-生产成功<br/>'; }
# 生产车门
public function Cardoor() { echo '车门-生产成功<br/>'; }
# 生产轮胎
public function Cartyre() { echo '轮胎-生产成功<br/>'; }
}
# 使用demo如下:
# 先打印出设计图(实例化class)
$obj = new Car();
# 再通过设计图,生产出一辆完整的汽车
$obj->Spotlight();
$obj->Taillight();
$obj->Carwindow();
$obj->Cardoor();
$obj->Cartyre();
从上面的代码中,我们不难看出,PHP是依靠:
new 类名()
来打印出一张设计图(实例化一个class对象),再通过:
实例->方法()
这样的方式,来调用class内部定义的function()
2、类的成员函数
class的成员函数,就是指上面代码中的,function()
方法,一个面向,一般是由N个成员函数所组成。
但这些成员函数并不是必须的,也可以创建一个空的class
。
可能有些聪明、细心的同学已经发现,我们在设计图(class)内部,就创建一个方法,规范定义生产汽车的步骤呢,不然不同的代理商可能会出现,漏掉车门、轮胎等情况,导致生产出不合规的车辆。
答案是可以的,PHP提供了:
$this->方法()
这样的语法格式,用于class可以在内部方法中相互调用。
<?php
class Car {
# 生产车头灯
public function Spotlight() { echo '车头灯-生产成功<br/>'; }
# 生产车尾灯
public function Taillight() { echo '车尾灯-生产成功<br/>'; }
# 生产车窗
public function Carwindow() { echo '车窗-生产成功<br/>'; }
# 生产车门
public function Cardoor() { echo '车门-生产成功<br/>'; }
# 生产轮胎
public function Cartyre() { echo '轮胎-生产成功<br/>'; }
/**
* 为了防止代理商们偷工减料,创建一个方法,规范生产的步骤
* 调用这个方法,生产出一辆完整的汽车
*/
public function Produce() {
$this->Spotlight();
$this->Taillight();
$this->Carwindow();
$this->Cardoor();
$this->Cartyre();
}
}
# 使用demo如下:
$obj = new Car();
$obj->Produce();
3、类的成员属性
在Class中,除了function()
方法可以传参外,还提供了一个成员属性,可用于Class内部的调用。
成员属性和function()
方法传参的区别,是在于:
成员属性可以在各个方法间引用和修改,也可以在Class外进行访问修改。
而以上两点,通过function()
传参都是做不到的,同时成员属性还像Class的成员函数一样,可以设置控制权限(这点在后续的课件中,再进行深入讲解)。
下面我们先来看看成员属性的具体语法格式:
class 类名{
控制权限 修饰符 成员变量名 = 默认值;
}
在上述语法格式中,修饰符和默认值都是可以不用的,如下列格式(修饰符在后续的课件中会进行讲解):
class 类名{
控制权限 成员变量名;
}
成员属性一般是运用在,多个function()
间,会被重复多次使用的,公共的变量值。
例如,下面我们为设计图添加一个成员属性,指定汽车生产时的颜色。
注意:在class内部,也是使用$this->调用对应的成员属性
,不过需要注意的是,不带$
符号。
<?php
class Car {
# 车辆颜色
public $Color = '红色';
# 生产车头灯
public function Spotlight() { echo $this->Color . '车头灯-生产成功<br/>'; }
# 生产车尾灯
public function Taillight() { echo $this->Color . '车尾灯-生产成功<br/>'; }
# 生产车窗
public function Carwindow() { echo $this->Color . '车窗-生产成功<br/>'; }
# 生产车门
public function Cardoor() { echo $this->Color . '车门-生产成功<br/>'; }
# 生产轮胎
public function Cartyre() { echo $this->Color . '轮胎-生产成功<br/>'; }
/**
* 为了防止代理商们偷工减料,创建一个方法,规范生产的步骤
* 调用这个方法,生产出一辆完整的汽车
*/
public function Produce() {
$this->Spotlight();
$this->Taillight();
$this->Carwindow();
$this->Cardoor();
$this->Cartyre();
}
}
# 使用demo如下:
$obj = new Car();
# 生产一辆默认颜色的汽车
$obj->Produce();
# 再生产一辆自己想要的颜色的汽车
$obj->Color = '白色';
$obj->Produce();
4、类的实例化
Class的实例化主要依靠new关键字,其返回值是一个Object(对象)
格式的数据。
这个数据中包含了Class的成员属性信息。
想要尝试的同学,可以使用var_dump()
打印查看。
5、类的构造函数
构造函数 ,是一种特殊的方法。
主要用来在创建对象时初始化对象,又可以称之为前置操作方法。
构造函数的方法名主要有两种,
1、第一种是固定的,为:__construct();注意,这里是两个_符号;
2、第二种是与Class类名相同,即为构造函数。
例如class Car{}
,那么内部定义一个function Car(){}
那么这个方法也是构造函数。
一个Class类中,构造函数只能定义一个,也就是说,上面的两种创建方法只能使用其中一种,而不能两种同时存在。
构造函数主要用于初始化一些成员属性,又或者是初始化调用一些方法。
例如,我们将汽车的生产工作、上色工作同时教给构造函数:
<?php
class Car {
# 车辆颜色
public $Color;
/**
* 实例化这个类时,自动调用生产步骤,同时指定汽车颜色
*/
public function __construct($color) {
$this->Color = $color;
$this->Spotlight();
$this->Taillight();
$this->Carwindow();
$this->Cardoor();
$this->Cartyre();
}
# 生产车头灯
public function Spotlight() { echo $this->Color . '车头灯-生产成功<br/>'; }
# 生产车尾灯
public function Taillight() { echo $this->Color . '车尾灯-生产成功<br/>'; }
# 生产车窗
public function Carwindow() { echo $this->Color . '车窗-生产成功<br/>'; }
# 生产车门
public function Cardoor() { echo $this->Color . '车门-生产成功<br/>'; }
# 生产轮胎
public function Cartyre() { echo $this->Color . '轮胎-生产成功<br/>'; }
}
# 使用demo如下:
$obj = new Car('红色');
6、类的析构函数
Class的析构函数跟构造函数的作用刚好相反,主要用于在Class的使用结束后,自动释放一些资源。
又可以称之为后置操作方法。
其方法名固定为__destruct();
注意,这里是两个_
符号;
下面我们新建一个Test
类来测试下具体的作用:
<?php
class Test {
# 构造函数,前置操作
public function __construct() { echo '我用来处理一些初始化调用和赋值<br/>'; }
# 普通方法
public function ABC() { echo '我是ABC<br/>'; }
# 析构函数,后置操作
public function __destruct() { echo '我用来释放一些资源'; }
}
$obj = new Test();
$obj->ABC();
7、调用权限控制
之前我们说过,不管是成员属性 或是 成员函数,都可以单独控制对应的访问权限,
而public
关键字代表的是公共权限,而Class类的权限控制主要可分为3大类:
1、public(公有):公有的类成员、方法可以在任何地方被访问调用,访问域:类内部、外部都可以。
2、protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问(类本身),访问域:只有类内部可以。
3、private(私有):私有的类成员则只能被其定义所在的类访问,访问域:只有自身类内部可以。
关于子类、父类的知识点,在后续的课件中会进行一一讲解,下面我们先来从一段代码中,学习下3类权限的区别:
<?php
class Test {
# 公共权限的方法
public function Demo_1() { echo '我是公共方法,我在类的内部,类的外部都能调用<br/>'; }
# 受保护权限的方法
protected function Demo_2() { echo '我是受保护的方法,我只能在类的内部使用,不管是子类还是父类(类本身)都可以。'; }
# 私有权限的方法
private function Demo_3() { echo '我是私有的方法,我只能在类的内部使用,并且只能在父类(类本身),子类无法调用。'; }
}
$obj = new Test();
$obj->Demo_1(); // 调用成功
$obj->Demo_2(); // 调用失败
$obj->Demo_3(); // 调用失败
如果在生活中举例这3种权限,可以理解为:
1、public 公共的生活费,你自己、你老婆、你的孩子都可以随意使用。
2、protected 不动产,但有继承权,这部分钱不能拿出去花,或者交易给除了家族外的其他人,你自己、你老婆、你孩子可以随意分配,但就是不能花。
3、private 不动产,没有继承权,这部分钱不能拿出去花,或者交易给任何人,除了你自己,谁都不可以分配。
8、练习题
创建一个Class类,该类有两个成员属性,模仿魔兽争霸3游戏:
1、血量
2、攻击力
`
调用一个成员方法,根据攻击力减去血量,并输出当前血量还剩余多少。
答案:下载