11<?xml version =" 1.0" encoding =" utf-8" ?>
22<!-- $Revision$ -->
3- <!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: takagi Status: ready -->
4-
3+ <!-- EN-Revision: 009f215fc983eeded6161676bcffdd8cf3b6b080 Maintainer: takagi Status: ready -->
54 <sect1 xml : id =" language.oop5.late-static-bindings" xmlns =" http://docbook.org/ns/docbook" >
65 <title >遅延静的束縛 (Late Static Bindings)</title >
76 <para >
4746 <programlisting role =" php" >
4847<![CDATA[
4948<?php
50- class A {
51- public static function who() {
49+
50+ class A
51+ {
52+ public static function who()
53+ {
5254 echo __CLASS__;
5355 }
54- public static function test() {
56+
57+ public static function test()
58+ {
5559 self::who();
5660 }
5761}
5862
59- class B extends A {
60- public static function who() {
63+ class B extends A
64+ {
65+ public static function who()
66+ {
6167 echo __CLASS__;
6268 }
6369}
6470
6571B::test();
72+
6673?>
6774]]>
6875 </programlisting >
94101 <programlisting role =" php" >
95102<![CDATA[
96103<?php
97- class A {
98- public static function who() {
104+
105+ class A
106+ {
107+ public static function who()
108+ {
99109 echo __CLASS__;
100110 }
101- public static function test() {
111+
112+ public static function test()
113+ {
102114 static::who(); // これで、遅延静的束縛が行われます
103115 }
104116}
105117
106- class B extends A {
107- public static function who() {
118+ class B extends A
119+ {
120+ public static function who()
121+ {
108122 echo __CLASS__;
109123 }
110124}
111125
112126B::test();
127+
113128?>
114129]]>
115130 </programlisting >
133148 <programlisting role =" php" >
134149<![CDATA[
135150<?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";
139157 }
140- public function test() {
158+
159+ public function test()
160+ {
141161 $this->foo();
142162 static::foo();
143163 }
144164}
145165
146- class B extends A {
147- /* foo() が B にコピーされるので、メソッドのスコープは A のままとなり、
148- * コールは成功します */
166+ class B extends A
167+ {
168+ /* foo() が B にコピーされるので、メソッドのスコープは A のままとなり、
169+ * コールは成功します */
149170}
150171
151- class C extends A {
152- private function foo() {
172+ class C extends A
173+ {
174+ private function foo()
175+ {
153176 /* もとのメソッドが置き換えられるので、新しいメソッドのスコープは C となります */
154177 }
155178}
156179
157180$b = new B();
158181$b->test();
182+
159183$c = new C();
160- $c->test(); //fails
184+ try {
185+ $c->test();
186+ } catch (Error $e) {
187+ echo $e->getMessage();
188+ }
189+
161190?>
162191]]>
163192 </programlisting >
164193 &example.outputs;
165194 <screen >
166195<![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
173200]]>
174201 </screen >
175202 </example >
@@ -184,34 +211,45 @@ Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php
184211 <programlisting role =" php" >
185212<![CDATA[
186213<?php
187- class A {
188- public static function foo() {
214+
215+ class A
216+ {
217+ public static function foo()
218+ {
189219 static::who();
190220 }
191221
192- public static function who() {
193- echo __CLASS__."\n";
222+ public static function who()
223+ {
224+ echo __CLASS__ . "\n";
194225 }
195226}
196227
197- class B extends A {
198- public static function test() {
228+ class B extends A
229+ {
230+ public static function test()
231+ {
199232 A::foo();
200233 parent::foo();
201234 self::foo();
202235 }
203236
204- public static function who() {
205- echo __CLASS__."\n";
237+ public static function who()
238+ {
239+ echo __CLASS__ . "\n";
206240 }
207241}
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";
211248 }
212249}
213250
214251C::test();
252+
215253?>
216254]]>
217255 </programlisting >
0 commit comments