1
1
<?xml version =" 1.0" encoding =" utf-8" ?>
2
2
<!-- $Revision$ -->
3
- <!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: takagi Status: ready -->
4
-
3
+ <!-- EN-Revision: 009f215fc983eeded6161676bcffdd8cf3b6b080 Maintainer: takagi Status: ready -->
5
4
<sect1 xml : id =" language.oop5.late-static-bindings" xmlns =" http://docbook.org/ns/docbook" >
6
5
<title >遅延静的束縛 (Late Static Bindings)</title >
7
6
<para >
47
46
<programlisting role =" php" >
48
47
<![CDATA[
49
48
<?php
50
- class A {
51
- public static function who() {
49
+
50
+ class A
51
+ {
52
+ public static function who()
53
+ {
52
54
echo __CLASS__;
53
55
}
54
- public static function test() {
56
+
57
+ public static function test()
58
+ {
55
59
self::who();
56
60
}
57
61
}
58
62
59
- class B extends A {
60
- public static function who() {
63
+ class B extends A
64
+ {
65
+ public static function who()
66
+ {
61
67
echo __CLASS__;
62
68
}
63
69
}
64
70
65
71
B::test();
72
+
66
73
?>
67
74
]]>
68
75
</programlisting >
94
101
<programlisting role =" php" >
95
102
<![CDATA[
96
103
<?php
97
- class A {
98
- public static function who() {
104
+
105
+ class A
106
+ {
107
+ public static function who()
108
+ {
99
109
echo __CLASS__;
100
110
}
101
- public static function test() {
111
+
112
+ public static function test()
113
+ {
102
114
static::who(); // これで、遅延静的束縛が行われます
103
115
}
104
116
}
105
117
106
- class B extends A {
107
- public static function who() {
118
+ class B extends A
119
+ {
120
+ public static function who()
121
+ {
108
122
echo __CLASS__;
109
123
}
110
124
}
111
125
112
126
B::test();
127
+
113
128
?>
114
129
]]>
115
130
</programlisting >
133
148
<programlisting role =" php" >
134
149
<![CDATA[
135
150
<?php
136
- class A {
137
- private function foo() {
138
- echo "success!\n";
151
+
152
+ class A
153
+ {
154
+ private function foo()
155
+ {
156
+ echo "Success!\n";
139
157
}
140
- public function test() {
158
+
159
+ public function test()
160
+ {
141
161
$this->foo();
142
162
static::foo();
143
163
}
144
164
}
145
165
146
- class B extends A {
147
- /* foo() が B にコピーされるので、メソッドのスコープは A のままとなり、
148
- * コールは成功します */
166
+ class B extends A
167
+ {
168
+ /* foo() が B にコピーされるので、メソッドのスコープは A のままとなり、
169
+ * コールは成功します */
149
170
}
150
171
151
- class C extends A {
152
- private function foo() {
172
+ class C extends A
173
+ {
174
+ private function foo()
175
+ {
153
176
/* もとのメソッドが置き換えられるので、新しいメソッドのスコープは C となります */
154
177
}
155
178
}
156
179
157
180
$b = new B();
158
181
$b->test();
182
+
159
183
$c = new C();
160
- $c->test(); //fails
184
+ try {
185
+ $c->test();
186
+ } catch (Error $e) {
187
+ echo $e->getMessage();
188
+ }
189
+
161
190
?>
162
191
]]>
163
192
</programlisting >
164
193
&example.outputs;
165
194
<screen >
166
195
<![CDATA[
167
- success!
168
- success!
169
- success!
170
-
171
-
172
- Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
196
+ Success!
197
+ Success!
198
+ Success!
199
+ Call to private method C::foo() from scope A
173
200
]]>
174
201
</screen >
175
202
</example >
@@ -184,34 +211,45 @@ Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php
184
211
<programlisting role =" php" >
185
212
<![CDATA[
186
213
<?php
187
- class A {
188
- public static function foo() {
214
+
215
+ class A
216
+ {
217
+ public static function foo()
218
+ {
189
219
static::who();
190
220
}
191
221
192
- public static function who() {
193
- echo __CLASS__."\n";
222
+ public static function who()
223
+ {
224
+ echo __CLASS__ . "\n";
194
225
}
195
226
}
196
227
197
- class B extends A {
198
- public static function test() {
228
+ class B extends A
229
+ {
230
+ public static function test()
231
+ {
199
232
A::foo();
200
233
parent::foo();
201
234
self::foo();
202
235
}
203
236
204
- public static function who() {
205
- echo __CLASS__."\n";
237
+ public static function who()
238
+ {
239
+ echo __CLASS__ . "\n";
206
240
}
207
241
}
208
- class C extends B {
209
- public static function who() {
210
- echo __CLASS__."\n";
242
+
243
+ class C extends B
244
+ {
245
+ public static function who()
246
+ {
247
+ echo __CLASS__ . "\n";
211
248
}
212
249
}
213
250
214
251
C::test();
252
+
215
253
?>
216
254
]]>
217
255
</programlisting >
0 commit comments