PHP设计模式-空对象

适用性

  • 当程序运行过程中出现操作空对象时,程序依然能够通过操作提供的空对象继续执行
  • 下面实现老师课堂叫学生回答问题

    代码示例

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* 抽象类人
*/
abstract class Person
{
/**
* 名字
* @var string
*/
private $_name = '';

/**
* 构造函数
*/
function __construct($name)
{
$this->_name = $name;
}

/**
* 魔术方法
* 读取私有属性
*
* @param string $name 属性名称
* @return mixed
*/
function __get($name='')
{
$name = '_' . $name;
return $this->$name;
}

/**
* 抽象方法
*
* @return mixed
*/
abstract function doSomthing($person);
}

/**
* 老师
*/
class Teacher extends Person
{
/**
* 老师提问
*
* @return mixed
*/
function doSomthing($person)
{
if (!$person instanceof Student) {
$person = new NullPerson('');
}
$person->doSomthing($this);
}
}

/**
* 学生
*/
class Student extends Person
{
/**
* 答题方法
*
* @return mixed
*/
function doSomthing($person)
{
echo "老师‘{$person->name}’让学生‘{$this->name}’回答了一道题~ \n";
}
}

/**
* 鬼
*/
class NullPerson extends Person
{
/**
* 空方法
*
* @return mixed
*/
function doSomthing($person)
{
echo "难道这是个鬼吗............ \n";
}
}


try {
//创建一个老师:路飞
$teacher = new Teacher('路飞');

// 创建学生
$mc = new Student('麦迪');
$kobe = new Student('科比');
$paul = new Student('保罗');

// 老师提问
$teacher->doSomthing($mc);
$teacher->doSomthing($kobe);
$teacher->doSomthing($paul);
$teacher->doSomthing('小李');// 提问了一个班级里不存在人名


} catch (\Exception $e) {
echo 'error:' . $e->getMessage();
}