这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下
2 X. B( L' G* ]9 p! A php预定义了6个接口介绍如下:) ?* J6 [0 q+ o' d3 G3 H
1.traversable遍历接口+ n2 D4 a4 r r8 O. {- B' v: T2 u
呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。# I b4 B5 h6 I8 k: f1 u
?
R2 a" u5 e0 ?6 c 1, B8 l& S& y: ^1 y, u8 Z: @6 E
2% V+ I1 @7 d& d
3, j/ b; h" K: _3 p( M* w% l0 o( Y
| if($class instanceof traversable) {: @& O! U1 a& S$ q, Z
//foreach# i1 c4 M2 J$ E2 C, `* \
}
( v$ C& ]# g3 M( Z6 `6 ?! Q) K 9 p- _- i* C% ^
| 2.iterator迭代器接口( V& U* l1 I: n$ U, v5 K. p
接口摘要:
: M' j- y; X" p, ]) F* N ?
4 {3 _* n+ B7 j& m: V$ c3 M 1
! d4 X' I/ Q' j" N6 [# B& p 2* g. g2 @0 c ]% X
31 Y2 v8 d6 x+ r( M3 V
4
* D$ m0 U5 ~# U) s 57 i" e6 f5 z; N( b `% U
65 f9 K5 o* z- T1 w* e1 `
7
4 P) F) a. W3 Q" G1 a1 W) H 8# N- {' x$ F# I5 d
98 d$ b7 L% o4 C/ G
108 o2 ^, x* Z; o' r4 d
11' ]/ A: w- P9 B3 E1 k$ Z
12
% O5 \2 Y6 U# u3 K+ r# |2 T/ q 13
9 @8 j# C1 }) X! | | iterator extends traversable5 d2 ?0 |- Q9 |, m" d8 \+ S
{
: d( D ?- v# g+ [5 k; ? //返回当前索引游标指向的元素1 x# k) ^: M& E- f4 C
abstract public mixed current(void)
! c q, m# l0 e4 k) u //返回当前索引游标指向的元素的键名- h: Y D& I8 L3 R% P$ `3 U
abstract public scalar key(void)
: Q4 [3 E( q- c. C( W //移动当前索引游标指向下一元素; S" @! ]2 r h' g. |- X+ D( F# ^
abstract public void next(void)
' w. \6 v* j2 s$ w- `- |$ M7 }# Y% b //重置索引游标的指向第一个元素8 N& ^/ L4 A9 u
abstract public void rewind(void)
4 Q/ M1 s: @% V8 J( a k //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用5 F5 h. H8 I0 e# T! y
abstract public boolean valid(void)
% d$ a/ N5 |' B1 Y }
9 g p0 _. P0 s* ]: n
* s5 K% o& X' E, m6 R; v$ e | 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:
7 O Y5 Q8 o8 n' e6 Q ?
; y3 g$ ?0 x$ t$ R, T 1: H3 N" l/ d! m" X8 P2 F
2
9 Z# a k) c* E3 ?3 W" b4 Y* Q 3
* c5 n) }2 c8 |) h" f6 y* w 4
5 n# {' [9 x, _" c7 b 5& o2 n$ `5 a' `2 G4 g
6: ?, H' O$ g3 W& m" i3 h
7& J& U, A/ b# o4 o8 V* x5 h
8
: w {& T, L% S- I% }" o 9/ m0 h: \$ `& T/ c& }1 ~
10
% L; ^+ E* H( w: ~" z 11
: ~* q. f a, n 12
7 ^! x, q* R$ [% z) W$ V5 v 132 y# D6 O X' q* W) a1 F7 y# I& b
14 j# K! y; L8 P! C: B0 O: j% X$ G$ v
15% v5 G0 ]3 X* L' B0 x5 [
16; m+ r( `: b2 l3 ]
173 h$ R" i _; c$ T6 i! N! v, @
18
* c0 Y* I8 i2 ~' f5 p 19
3 N, @% p8 j8 M( S1 `9 B' Q A% { 20; w/ F' ~0 }' f7 R& R
21/ T/ |, C/ Q A1 v2 E# L9 b
22* [' C0 \9 E( J5 n- N) x
23
V: O: D& D; R' _- T 246 D* |, b7 g2 u" w, ^ M) r
25
) ^$ Q" J% d' N0 H) o2 c4 _. v 26+ K/ r/ h* Y% N# R# s# X/ `; [
27
. f: |$ J9 D0 R' o 28
X/ H& r8 a1 N7 P 29) R% e, ?! Y! K2 V% o7 l2 O" B% \
302 M& W$ ?3 C' C/ Z$ F/ r+ @% p
319 o6 R! U/ h% a0 `
32
. W5 A! R: w# k Y$ r9 w, D* C 33
8 P& m! E& l* p 34& G, X) O8 g5 n2 T
35* `8 b) y& f+ E
36
$ |6 l$ }2 f i/ \9 s1 d 37
. [6 T- y' p2 |. U7 f! f 38( y4 [. }# q N8 q" |( U
395 m$ m: J4 Q( f2 s4 p
40
' b7 y6 W( {+ p8 u. S 41
! A0 e" D$ Z' Q" a 42
$ t$ G& Q5 M: v) V# b# i3 Q 43
! |' @( Z9 k4 y& U+ }: ]4 X4 B 446 _" a% s: z4 K$ p
| class myiterator implements iterator {
* b; i) H( P# z! v, g/ V' f0 T0 ?! u. M private $position = 0 ;
$ `1 S" P. c6 t- @9 ` private $array = array(7 y) ?: Q8 a, j+ o3 z! c
"firstelement" ,$ I8 y( T6 @9 x; _
"secondelement" , v6 r; u) L9 r) U+ ` `% V- a) g
"lastelement" ,* k# V, I. a1 ~3 G+ {- H
);
" ~0 z! L! p8 I
7 M! w) m# N" ^ public function __construct () {1 ~9 c }& X7 A
$this -> position = 0 ;
2 I# s( ~8 x9 C' A8 h1 h( c+ P0 X }
0 y0 y% E2 E& I; y7 y8 k
k' n: j2 S" M7 O7 [ x function rewind () { a" x% n6 |0 ^7 W& r
var_dump ( __method__ );
) b# u3 f/ E, j' @ $this -> position = 0 ;. g5 s8 G0 M) d/ c# O ^1 H
}
/ u! m t+ q8 w: [- f4 m! I 0 b8 n" r3 Y* C( z. l8 l1 h
function current () {5 b) ~5 H9 f/ R) Y
var_dump ( __method__ );$ ] {9 n* Z* O* P. \! e% X
return $this -> array [ $this -> position ];
! D5 o. z j6 O% V: x: B5 V$ q }4 i8 J, f2 K) R; O) o! i# u/ c* `
- z8 ^/ y" h8 v: } function key () {, T9 Y8 B j) ^' H# W
var_dump ( __method__ );/ u& m4 W, S6 d$ \6 M1 s
return $this -> position ;
% t; T( `% E, r: Z# H6 X }6 d! R$ m' ^) O, S( t: s+ Q
' r/ h$ _' Y* Y! u' p' w
function next () {6 H8 A# s8 _5 m1 h: i9 i
var_dump ( __method__ );
/ K0 g, b; i3 U' F+ u ++ $this -> position ;6 s& V3 K! B9 O. M% l
}
6 ^6 ]. g+ v+ h0 U( |
6 i# f$ s4 S% }% w( W0 |: e" n# | function valid () {
% [) V g q3 V9 M% ?9 Z var_dump ( __method__ );. s, f ?- `# u5 G4 A2 I1 j; A
return isset( $this -> array [ $this -> position ]);
1 {0 k4 L; v7 v& w+ O& K" r; Y }
$ @( t5 H7 P( {5 { }9 z- ?; E, t* k6 _" j+ _+ a: L
2 X! R' i, b7 M8 F
$it = new myiterator ;
' l2 D/ P9 G8 t1 J ! ^0 i* U# O+ A) T
foreach( $it as $key => $value ) {
5 M' q, [ i8 M var_dump ( $key , $value );( a/ ]% l6 B+ {
echo "\n" ;+ ^0 h% ^) w) ~6 s$ j
}
7 V z5 Y" e7 o" ~0 f4 v( A . u/ I% d5 M- T, n6 Y
| 3.iteratoraggregate聚合式迭代器接口
. C! l+ _) @- _, q! X" f7 B: L 接口摘要:
& F3 j0 D+ E- E ?
1 f1 w* F2 w8 l$ i- T 1
! h& s2 K1 H7 t; P6 M. y 2
! B0 s( a) A+ A( }# s+ E0 ^( [* ^ 3
- a. D% k5 R7 ?$ r' b3 q8 w" G 47 r( _9 B+ y& ]. l
5
5 f N5 A3 r+ \, Z1 h2 c$ L2 w, f5 O | iteratoraggregate extends traversable {+ m/ z' C+ n0 I
o' G) @& W u$ G //获取外部迭代器$ ? p! P0 |. h2 `. R. W0 ~
abstract public traversable getiterator ( void )
" ^/ A& G- E. R }- Y% f' z& A5 V% J8 |. ^* V% a' R1 t) Z
' X4 R% i1 s3 G4 S2 Z1 A' ?4 @$ R | getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。: e0 x+ V1 W8 n% K- Z' k5 ^
?
3 n [- {8 y( P% j( M* [! ] 1
; M& q+ N* A6 Z, B+ ], Q3 T 2( Y/ ?: y! H/ ~7 \
3
6 E. _ n: I9 v* s( k1 f0 R 4
% Q( X( B3 v7 M9 } Y, h 52 l) a7 v3 X' m$ U
6
# P8 u8 ^1 `2 X' O/ Q 7
8 B" ~. Z2 s" V' }$ n. G 8+ z' i' m. P8 S& T5 b
90 H! _# {2 p) ?* O7 K1 g3 Q) o) N
10. D0 ~9 d: v: D& k/ O: {2 E( {1 d
11
0 ~( x" D% [0 U2 [' J/ P1 ^ 12
1 K: j: f0 V; B$ l* L- C* V- T! @* ^ 13+ i6 C. X" B) M
14& {, q$ F0 z+ e: R
15
9 I' d$ c: P( j* h6 x" z5 p 16: \5 s6 C; ?: g' p
17
# E5 p( w$ z$ q 18
) u( Z$ j. X3 @ 19
. \' q. D- u& C 20' O: R9 f2 a; i1 H, B
21
7 y, l+ [7 }4 k/ e! x | class mydata implements iteratoraggregate {( _! R/ B, @. \
public $property1 = "public property one" ;
8 R3 H) o3 V u: ]7 C9 O public $property2 = "public property two" ;
: [8 b4 q( h+ `; t public $property3 = "public property three" ;" \' h8 e9 s+ R: j' v- o
4 _ W& M4 z: l2 ?2 [ public function __construct () {
5 y, n% u3 F( a& M: k $this -> property4 = "last property" ;
0 ~* L$ Q8 ~ r! ? }7 Q+ V/ X( M3 C- c
& r" l* C* `+ f+ Q* c/ c) N4 o - k! M" I+ q$ l9 k. z) Q
public function getiterator () {* e5 a$ t' C6 h* M. Z; ~
return new arrayiterator ( $this );
/ ]" c& u [* x0 z+ |3 ]/ Q }
g, z6 C/ D. |& _3 v1 H5 e: f }
- `$ F# \) c, Z j' `
; a; m' A/ C7 r1 e7 s4 J $obj = new mydata ;- Z# k0 B* Y/ u: E6 `" W
* |6 Q8 }- h( `+ ]( r% V( y4 \
foreach( $obj as $key => $value ) {
: V+ @+ x+ c% |9 }1 m3 Q1 s: Q; B var_dump ( $key , $value );+ `! f$ n3 Q' C' G: u( ~5 S; D3 g4 k
echo "\n" ;3 e5 V/ J6 v/ ^2 E( m
}
, v2 B8 j; [+ N6 l& s/ p' J; L . B( e4 q8 }( `, q2 n
| 4.arrayaccess数组式访问接口: q0 T ^; J6 q8 b# ^7 Y X
接口摘要:: B7 g$ h% H& s
?4 U6 x, H$ f' @6 G& i2 `
12 ^/ w" B" {( c, b3 h- }9 `
28 o ]# }; s x% g4 ^
3$ Z0 J5 Z+ w' Y3 S! r5 V
4$ I! Z: ?3 N/ @3 M
5
% J& y/ S, V: o# f0 g) C$ m: v$ ^ 6
9 @+ n2 W* q9 U1 [& L2 Z; s2 ~ 7: \0 G: h, ]; Q! ~/ I
| arrayaccess {% U" t2 E5 y3 `# k
/* 方法 */
9 J/ R* V- K, h/ f" c2 S. b* O! ~8 j abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在
) O3 W' s h" B _& m) Z' R1 |! \2 ? abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值# h: [% v% w e5 ^, w
abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值% s& J/ f3 k1 {/ R2 u
abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值: x) b: ~1 h9 v2 q3 d0 L9 e& w
}
$ Q; G9 X9 o0 {8 f# _ & F2 x" t1 K% ~! {7 N
| 如下可像访问数组一样访问对象:
6 }6 V0 R1 E; s4 S5 f$ o ?& F# \# |( c0 o: T; _+ Z- D
1
+ u$ r" J |( F; m3 d2 V: q 22 a- N- O3 B, v
3
( M& C+ a% z; R 44 |- }. _4 B0 [+ u
5$ _: D0 z6 ~1 r& d3 ?. U: f* d3 F& C
6
) ^% V$ }( n/ n& K4 c3 W5 B/ P) q 7
, d6 T7 p9 I: m* H8 g8 E 8+ z, M2 p' E5 j- w3 M) {, M' ^
9
, q! W& C5 S& s) z4 { 10
B% t/ M9 h6 w- W7 j5 k 11
3 T/ |1 v# q9 y; r% W" i 12. i, E9 I4 @. I+ W$ s% h
13! o' @5 X. u& ~4 C1 Q I. Z
14' p- Z, U" P) c
15
. t' W$ i) [$ q 16
9 m/ B8 v: }: k6 Q- I8 O* n 17! f1 }1 Q: V7 A0 v6 d1 }9 D) p
18
2 q! _$ j2 u2 l% m7 [% } 19
?5 M. `2 J" q, Q' g3 u% `( X; X 20
( i/ x+ f4 F8 P1 {+ G: U( x8 D6 k 21
" D: e+ s9 x; w0 y, e$ H 22
& A5 W4 _( f9 o4 W 23; r- _* Y% I0 }: V$ c4 _
24# U( q; A9 P& I i9 t5 h' R1 Y! [
25' c( y, b9 I9 N
26
7 J4 e4 t' q& L3 G$ r' n( L. R2 b 27
# |2 a$ r" D! m" r 28+ N" D X" s& P% \
299 C; w! L1 `2 F
30" C$ [% L$ R8 K5 Z. k
312 j- {2 b4 }! s% H* L) `
32& u4 A7 h( y/ M( _
33: ~; e7 C/ j) D2 ^' P! {- F
34
# _8 R6 r% h$ g 35$ x& M& L2 F/ f! K( o/ h8 W
366 U8 W" `# m' o1 C/ G. F% q
37
- L5 K7 | e2 p 38& r& C$ g% R- m" I% k& m/ U1 N" f
39. `# P+ \3 _1 y v: _4 ]
| class obj implements arrayaccess {* b' O: A$ j3 q' k6 [# j
private $container = array();
: h5 h9 b: f8 `2 _ public function __construct () {8 \( v$ n4 C% U7 c/ u7 K! j
$this -> container = array(7 J# Y: ^( [/ a' S- u* A7 P; f
"one" => 1 ,
+ ]. A) k* C0 f" b d& M "two" => 2 ,% b. p4 M4 Q$ G4 t' ]& i+ M9 i% l
"three" => 3 ,
- B. W- ^: B& Z- B) E* I( R );0 F' A+ Q/ F' M$ B- Y, A
}
) U1 ]; C5 `! Z+ Q4 ~ public function offsetset ( $offset , $value ) {
4 A6 c: M; [! \" [ if ( is_null ( $offset )) {% H! R' V3 ?9 O% n0 v' p' f$ j
$this -> container [] = $value ;
' \$ K- K; W' H/ v: Q8 p! A } else {4 y% @6 M- S* ?% |
$this -> container [ $offset ] = $value ;
2 D. R& _! o2 u5 e3 g0 X& _ }0 q8 t! P! g: J" k
}2 c8 ]3 B" l p) N8 M9 q/ w Q
public function offsetexists ( $offset ) {, v4 G s$ g0 I r& ]$ h( t
return isset( $this -> container [ $offset ]);
' a+ Q3 @" |/ T }
@& \/ X8 H! {$ w# u8 f- Z7 c public function offsetunset ( $offset ) {
" O {0 S D( Q4 f5 a unset( $this -> container [ $offset ]); g8 q6 I+ v4 Z2 S( Q6 [
}. E% w1 M5 Z) }* n- A) H$ e- h, {& f' j
public function offsetget ( $offset ) {+ Y. N# m$ Q. K! X* k
return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;
- R H% \6 d# T }% p) D+ r2 ]+ O8 m0 N. [2 W
}
* f, U- ?" f9 E3 }- ?3 e! w- M' R + f; w7 K% W6 a) R$ L! i
$obj = new obj ;) A- {5 {9 M8 x, N9 Y# i
5 p1 T% h6 j2 }/ a5 i1 N& B var_dump (isset( $obj [ "two" ]));
+ U: J" w2 C s( h( z5 |8 a var_dump ( $obj [ "two" ]);* V C5 y, ?( v" k0 ^/ G) d$ q
unset( $obj [ "two" ]);
) g1 Z3 b+ i! U/ q# s2 J' L$ s; V* I7 a var_dump (isset( $obj [ "two" ]));+ P: H9 C& N+ h' d5 c, L2 E
$obj [ "two" ] = "a value" ;! s1 e9 N% ^1 E( t2 W/ j3 I# c
var_dump ( $obj [ "two" ]);6 T4 F) K" l @ l, w
$obj [] = 'append 1' ;
/ g" ^2 A$ W4 g! f$ ~ $obj [] = 'append 2' ;
: ~2 Y3 ?- Z+ V3 O $obj [] = 'append 3' ;
7 Q- B! ]5 |$ o7 A/ Q print_r ( $obj );% G' [! O; F: U. D
6 b* Q0 D$ M% G% D. |$ c/ e3 V1 U; J7 k | 5.serializable序列化接口
; |) U3 }2 o0 R, g" l 接口摘要:1 e& C9 F6 u" u& R6 X! g
?! n$ r) Y# O( a) a, ]. `
1
3 g& m, X3 q; I 2
; a8 b* C+ u% F8 x, d 3
1 u& B5 M* c; B3 s3 t* c 4. e. r1 c4 [ B9 ~
5 y; ?% I0 Y" _8 v
6
% \8 K' v0 b5 Z: k3 T2 \ V! j | serializable {- e- R; ^$ b4 p" n4 C: ~9 g
4 l1 g% b& \- _ k1 z
/* 方法 */. F$ ]/ n* D- E7 d9 d
abstract public string serialize ( void ) //对象的字符串表示
$ ^) r* X+ Y3 r2 q$ j" i% L abstract public mixed unserialize ( string $serialized ) // 构造对象 x; b* M: L- I, m! C* `
}
( [: n# e# K4 P. ^4 w6 d0 ~ , c* O' B* b# s: [2 g! ?9 x3 u
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。
, n, e" U c) a% M0 J L! f ?% P( |5 i9 B9 L* |, D
1% f, f) A7 V k0 ]
2
4 B7 u( E$ T$ l/ M/ R9 \- n 3& K# G. z) c. Q! T: a$ w4 f! u. p
4$ H* | H4 J8 V
5
/ Z0 t# X5 S; w 6
" G7 b& N) ]& U 7
) u1 C! @9 z F/ i. Q 8
# M5 N4 I3 G$ H* n( R 9& D$ I8 X, [" Y+ V7 @# F8 y
103 h* B% X' G& M+ | w O* e: G- m
11' X* A* W% t( H
12
5 K' X, W. h+ _2 g+ a3 l; S 13
# a" j3 M5 n2 q9 Q/ N+ m# L 14; w- v, ^( B$ ]: w
15
3 ]# k$ c+ _3 ^. ? 166 l. M; L7 G+ b- A Y
17+ u9 `4 {2 `4 D' v8 |( `
18
: K8 }9 e N+ @* ]$ a 19
# _5 E% l; j/ b& u3 V: z7 r 20
+ v$ y! f% F9 g5 |0 g$ X 210 l) K1 L: L0 Q# B6 L
| class obj implements serializable {1 q" v6 V/ v8 w$ n
private $data ;
( }4 V- o8 U& |& U) P2 F$ S public function __construct () {
$ ~# I0 Q) C# L% J4 V) ]( t( O4 b $this -> data = "my private data" ;
% _8 Y' v7 ~( C0 i' F }
5 `7 x. R+ M% G$ D5 Y4 D( u public function serialize () {8 f* Y8 O d0 L
return serialize ( $this -> data );" b9 Z0 g( _$ J( I3 P6 w" f* e( s
}
) C, L1 B' y1 q3 z( W% @ public function unserialize ( $data ) {
# l5 X' q5 k2 V) N* ` $this -> data = unserialize ( $data );
% N& y! n3 S2 K+ }1 z# s }
$ {5 x: p% R/ w6 e1 h public function getdata () {
( }/ A$ }& v: |; P return $this -> data ;
* u; u! i+ k8 ^. B* B3 d6 z } L! h3 ], s8 l& X5 h! C, j
}
5 K/ t5 |% p" e/ V 3 Y* h0 p, R% p2 Y
$obj = new obj ;
2 L# c- l) a& t/ E2 I& f $ser = serialize ( $obj );
) x( R' ^" a/ A4 d! z print_r($ser);
% @7 ?* P9 d( a+ [ $newobj = unserialize ( $ser );
7 [# a; [/ m& Y. [ print_r($newobj);1 @$ D3 e, [9 }; q
, E" T' ]8 q& x% w3 D
| 6.closure7 O0 d; g w. S
接口摘要:
; e% n0 g s: w# Q7 i+ Q3 W ?' k" E% C. j h: n+ W! @
1
8 v' F5 O0 j! M, _/ v+ ]; L 2
5 [& H6 K, a3 T; E% b2 c 3) E, ~0 N* @& H: O9 {5 w! M0 i
4
/ I2 ?: A0 _- C2 x 5
3 ^5 z) L% c2 C% {+ D0 Z9 s- L% T 6
2 B/ T6 W% y6 m2 t& a+ I$ N | closure {3 H) q1 s& q9 k8 s1 F2 |
/* 方法 */
' n% `0 A$ U- Q1 K: Y$ S7 s6 c __construct ( void ) //用于禁止实例化的构造函数
) q. d& ~$ B2 f8 X/ ^/ o$ a$ ] public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。
$ q+ L9 P3 @" U9 K+ S: Q3 E public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。" H" t8 M$ c6 B: [ h8 j
}
! y! e/ A7 H5 v* y+ ` / ~3 c& v# \/ w+ Z- Y1 J
| ?
! Q2 _* d9 }+ T6 P- f 1% f+ ?$ _ n! q4 T5 j$ S
2
8 q: c9 Z, Y2 U5 n9 O' P# E 3
: Z6 i5 X6 ~& Q( J( ~+ J 4
2 | K) p" `+ A& r 55 a4 t! `6 f* `! ]7 r7 v' u3 W1 `
6 U$ g+ {! i* ?# m( `
7
9 e! ]$ Y4 O" |9 J. f; f 8# A9 e: |# P5 y
90 h w# R6 P( G j
10
) X+ q1 _& Y7 ^- l$ e 11
6 ]8 }) x+ @/ ?* `: `5 D 121 v: y2 z& \5 w& l+ o4 o
13
% o5 ?; a! `/ y3 j0 }; ] 14
3 T7 A7 v- |2 _6 e8 X8 Y4 \3 N 15# n/ b# _7 x' i3 N
| class a {
% y6 c' a4 T3 i9 ] u$ y private static $sfoo = 1 ;6 P6 q/ ?, g6 f
private $ifoo = 2 ;
V8 F5 ^( J# I) Y1 ` }. p* W2 N, K: u! W+ {: u5 r
$cl1 = static function() {' {" m4 V; A2 T3 C9 I) ?7 Z
return a :: $sfoo ;5 r% X) n7 m% x& ?
};/ l9 |8 p2 b4 g) _4 [) n5 I
$cl2 = function() {# t; v9 I7 p4 r$ C7 e* \
return $this -> ifoo ;
/ _" l: r9 e% L6 i) z };+ e& Q& K# R9 \1 ^( m6 G) D
3 x6 m" r- Z2 V1 v2 p, Z $bcl1 = closure :: bind ( $cl1 , null , 'a' );
7 ?+ `; l9 I3 L" \7 R4 _ $bcl2 = closure :: bind ( $cl2 , new a (), 'a' );
" f4 i1 K# S) {* t: d4 m) A echo $bcl1 (), "\n" ;
$ _- P5 n( l j1 `3 N- t echo $bcl2 (), "\n" ;
5 b- ?2 x, w9 O2 I! [: [( j
" }( }$ O" p, j9 [5 R G | 更多网络编程信息请查看: 网络编程 |