1
+ <?php
2
+
3
+ /**
4
+ * Design pattern "Observer" (Behavioral)
5
+ * This is demo code
6
+ * See for details: http://maxsite.org/page/php-patterns
7
+ */
8
+
9
+ /**
10
+ * Observable use standart interface SplSubject
11
+ */
12
+ class Observable implements \SplSubject
13
+ {
14
+ /**
15
+ * list of observers
16
+ */
17
+ private $ observers ;
18
+
19
+ /**
20
+ * create standart class SplObjectStorage
21
+ */
22
+ function __construct ()
23
+ {
24
+ $ this ->observers = new SplObjectStorage ();
25
+ }
26
+
27
+ /**
28
+ * standart method of SplObjectStorage
29
+ */
30
+ function attach (SplObserver $ observer )
31
+ {
32
+ $ this ->observers ->attach ($ observer );
33
+ }
34
+
35
+ /**
36
+ * standart method of SplObjectStorage
37
+ */
38
+ function detach (SplObserver $ observer )
39
+ {
40
+ $ this ->observers ->detach ($ observer );
41
+ }
42
+
43
+ /**
44
+ * send notify
45
+ */
46
+ function notify ()
47
+ {
48
+ foreach ($ this ->observers as $ obj ) {
49
+ $ obj ->update ($ this );
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Observer use standart interface SplObserver
56
+ */
57
+ class Observer1 implements \SplObserver
58
+ {
59
+ /**
60
+ * get notify from Observable
61
+ */
62
+ function update (SplSubject $ subject )
63
+ {
64
+ echo 'update Observer1<br> ' ;
65
+ }
66
+ }
67
+
68
+ /**
69
+ * another class for Observer
70
+ */
71
+ class Observer2 implements \SplObserver
72
+ {
73
+ function update (SplSubject $ subject )
74
+ {
75
+ echo 'update Observer2<br> ' ;
76
+ }
77
+ }
78
+
79
+ /**
80
+ * demo
81
+ */
82
+
83
+ /**
84
+ * create Observable
85
+ */
86
+ $ observable = new Observable ();
87
+
88
+ /**
89
+ * create Observers
90
+ */
91
+ $ o1 = new Observer1 ();
92
+ $ o2 = new Observer2 ();
93
+
94
+ /**
95
+ * attach Observers to Observable
96
+ */
97
+ $ observable ->attach ($ o1 );
98
+ $ observable ->attach ($ o2 );
99
+
100
+ /**
101
+ * send notify
102
+ */
103
+ $ observable ->notify ();
104
+ /*
105
+ update Observer1
106
+ update Observer2
107
+ */
108
+
109
+ /**
110
+ * exclude Observer1
111
+ */
112
+ $ observable ->detach ($ o1 );
113
+
114
+ /**
115
+ * send notify
116
+ */
117
+ $ observable ->notify ();
118
+ /*
119
+ update Observer2
120
+ */
121
+
122
+
123
+ # end of file
0 commit comments