PHP高级特性记录(一)

前面的话

在日常开发中,发现一些常用的PHP高级特性经常忘记,所以在这里总结记录下来,以备后用。主要包括以下内容:

  • 关键字
  • 错误处理
  • 回调和闭包

关键字

static静态 const关键字

普通的方法和变量是以对象为作用域,而静态方法和常量作用域是以类本身为作用域的。

1
2
3
4
5
class Human{
const GENDER = 'man';
static public $name = 'lbool';
public $age = 18;
}

静态方法和常量在内存中的分配属于类内存。

访问静态方法和常量的区别:
静态变量:Human::$name

常量属性:Human::GENDER

抽象类abstract 接口interface

抽象类

定义:使用abstract关键字定义的类被称为抽象类,理论上至少包含一个抽象方法(实际不包括也可以)

特点:抽象类不能被实例化,只能被继承,继承接口的类要具体实现抽象方法或继续声明为抽象类。抽象类中的抽象方法只声明,不具体实现,形如abstract function test();

接口

定义:用关键字interface声明,包含方法声明和[属性]的结构体成为接口。
特点:接口不包含class关键字,但可以理解它为纯的抽象类,即它的所有方法均为抽象方法,没有具体实现。但是方法仍为public注明,形如public function test();

两种区别和联系

  1. 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。
  2. 如果许多类实现了某个接口,那么每个都要用代码实现那些方法
  3. 如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。

下面以一个实例来简单的解释下:一台电脑有存储设备,这个存储设备可以是硬盘,U盘,软盘等,他们都有一个共同点,就是能读写,即实现了读,写的基本接口功能。假如我的电脑要更换硬盘,那么我只需要更换一个支持该电脑存储接口的一个硬盘即可,不管它是希捷的还是三星的,也不考虑它是500G的还是1T的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php

//电脑定义一个存储设备接口
interface Disk{
//写数据功能
public function write();
//读数据功能
public function read();
}

//硬盘存储设备
abstract class HardDisk implements Disk{
public function write()
{
echo "写入速度最低2M每秒";
}

public function read()
{
echo "读取速度最低5M每秒";
}
}
//软盘存储设备
abstract class SoftDisk implements Disk{
public function write()
{
echo "写入速度最高512KB每秒";
}

public function read()
{
echo "读取速度最低1024KB每秒";
}
}

//希捷硬盘
abstract class SeaGate extends SoftDisk{
//硬盘容量
protected $size = 1000;
public function getSize()
{
echo $this->size;
}
}
//希捷硬盘 型号3000
class SeaGate3000 extends SeaGate{
public $color = 'red';
public $usb3 = 1;

public function openMd5Data()
{
echo "开启md5加密数据";
}
}

//给电脑换上希捷型号3000的硬盘
$myFirstSeaGateDisk = new SeaGate3000();
$myFirstSeaGateDisk->write();
$myFirstSeaGateDisk->getSize();
$myFirstSeaGateDisk->openMd5Data();

应用场景:

  1. 优先定义接口
  2. 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

个人感觉抽象类和接口的使用场景应该根据上下文环境而定,两者的关系可以理解成,接口是功能的定义,抽象类是模板的定义。如果需要按照功能区分,那么就使用接口;如果需要按照模板区分,那么就使用抽象类;接口是一类规则的定义,接口用于维持某种程度或界限下不同分类的关系,抽象类用于定义分类特征比较明显的一群个人间的共同属性集合。抽象类可以理解成是实例和接口之间的中间产物,按照不同的维度,实现相同接口的实例可能是不同分类,按实现相同抽象类的实例可以说是相同分类了。有些实例之间的联系不能完全按照接口去维持或联系,必须借助一些有实际意义的变量或常量,这时候抽象类的作用就显现出来了。

在此打赏