这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下. l1 T- F3 r0 v1 f
php预定义了6个接口介绍如下:
2 [, N4 F/ e4 E1 T) p% ] 1.traversable遍历接口+ r9 O1 ]# o1 r1 ?8 o1 o, O
呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。
* n6 z/ t0 ?( }8 z ?
5 T6 |4 `7 s3 c& F 1
! i' \. Q0 v1 t7 a9 V9 y 2& X8 m" n' U# j3 q- f
3+ g: D2 F3 z1 A; {7 H% M7 w
| if($class instanceof traversable) {$ x" N5 i( l) d {: x( c2 ~
//foreach
" ]+ k5 Y& M$ N9 C' E }
: B/ X: v V! w+ A( O 0 h9 D6 [2 _! |
| 2.iterator迭代器接口; e- Z2 h# v! |& h I8 x
接口摘要:# C. }4 `4 w. B( |: [5 ^. b9 G! y
?
; p/ m3 z H, m3 w+ m( r$ Z 1
6 V$ h, ]/ n4 y, \6 s 2
4 W' N" t( D% q i& E/ D 3, k) J1 ?3 g* y- V7 n* {& B6 o. U
4% h$ I3 @. Y# @$ f1 M/ b+ x
5
5 K- L5 x d) e6 k, C 6
& A9 |8 o, u R$ u. f 7
, W/ u' O7 s6 n& x- _ 8
; z9 Q# f0 x2 o" i 9
U7 A6 w, w( W! x# e8 w+ @" e0 f 10
/ `- B) u7 q+ g 11
- e. C {' ~% w2 `4 [( W 12
`+ h! U' }1 O/ u0 } t 13 }/ h' d/ }7 v! r3 O
| iterator extends traversable* y2 d* f/ g E9 {6 p
{4 I- W5 K& F7 X9 P
//返回当前索引游标指向的元素" Q/ h/ v4 w, H% }
abstract public mixed current(void). v, K# J2 X* q, W, x& B! w
//返回当前索引游标指向的元素的键名/ U/ W6 }2 [! L- e$ c
abstract public scalar key(void)& g) V* L8 v/ W; v+ x) A
//移动当前索引游标指向下一元素
: P+ M; ^. H: a# p abstract public void next(void)- _' T6 J' X% y& A$ Y& e& t5 { H: O
//重置索引游标的指向第一个元素
; {3 k0 ?# i. i, V+ c+ d) @2 k abstract public void rewind(void)
- F3 j% l. M( x( S" R! R9 b- S! S //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用
" Y/ I& \% v" U7 q/ M/ R abstract public boolean valid(void)5 x. v7 Z& m3 [0 I% o
}" T% c a. Z7 o: z! t9 v
% h* X. R" u" J | 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:5 L: A* B$ t3 G& d+ \
?: i" B4 n D) p$ E
1
0 i) [ B- B; B1 z7 v+ H8 \6 t 2
6 _! r8 r6 r5 B 3
0 A# x8 b6 a% X1 F! K. F2 x7 @ 4
( \* E, s6 o: A& m; `* I9 b 5$ _# A+ p- K6 j% \- a9 P* }
6/ z _/ Q- B/ `, ^, D
7
, J0 n+ ^" ^% Q3 N' F4 k& W 8( ?* P8 M: n3 }2 ^' G6 o* [- a
9
8 y# H5 Z% ^" k) k1 n/ V 10
# M! n$ y( o7 X# { 11+ K2 W8 K* p* m2 I4 w. y$ b0 ~
129 T& f7 e1 l) q" |1 z" q
13
+ d7 n* g8 f# } 14, y0 ]; Q/ L" i6 H5 m+ O
15/ ^3 T$ l3 D! G6 M4 o/ H5 _
16
' a* n( ^# h- |" c/ P+ U 172 G+ r" h' k' X) Z5 _' \
18! q/ B* W, m5 r' W' H
19
0 h! m/ Y* ^$ h+ o# t 204 g- e) y+ M/ j% @+ V9 j, ]
21
: D5 D$ k4 I$ b5 e( @ 22
/ r M4 C1 s+ i2 H1 _/ r0 T 23
8 H% m% a v$ F5 b& t3 m' u0 j% G 24% J# p; [& g3 u. M4 j
25% [, `& g' `- h. O1 c. g9 V+ Q
26( }; a9 N d: b9 c& }' e) h" k
27
' F* u( N) M) J 281 h7 m7 L2 k$ j: E
29
1 o$ u# q% y* @ 30
# l0 u" a# ^6 S+ s- ~% l6 F( n 31) x3 f9 ]& A- _! e+ A3 \
32: }1 \4 d( T4 k7 O( `$ ]
33
7 X- y$ Q& A' k- U: I K* S0 B* H 34, ~' f9 z. x5 | }8 ]# s D
35
8 i! F5 ^8 ?* v1 |7 J 36
/ x3 `' w& `. c! X4 l7 }) M9 h 37! z7 w3 I R& c
38
2 h4 i/ p* L4 d8 C' Z2 W0 m 39/ ^. @' m. v% {% `/ _
40
* ?0 y: o1 M6 c% n5 s 413 _/ e' u% n$ R* U E/ C- Y8 v
42
$ p: L+ `* Y3 M0 g( F; E 43& \4 Y) i$ h) l' Z) J7 s. Q; }
44: b1 f: a5 e0 w5 A7 f. n
| class myiterator implements iterator {
2 |" n7 Y6 H% C9 w, ~ private $position = 0 ;
S/ }( s* q! `7 N private $array = array(
( D" }, T6 |/ i7 _7 | "firstelement" ,
7 P" D& _. o( K "secondelement" ,9 ?( {$ M+ ?( K
"lastelement" ,
" u! L9 E6 {' ?7 a9 i9 { );0 F& A# \2 D* o* B2 g4 V
+ x$ x) i& j! O1 L5 s _7 p' H8 J5 h
public function __construct () {$ N: t, s- D# p# I
$this -> position = 0 ;
5 H7 p) e: r5 k( W }( A; V* Q2 X/ F4 j0 L _; n, ]
- N! a# v$ e8 B4 S5 e, e function rewind () {
& {! ]/ Q! L. a! t$ W& Q4 E% h var_dump ( __method__ );6 i! q/ Q- V, l& o+ Z
$this -> position = 0 ;
* T( \4 U( E/ j. [+ h2 t }
1 ]9 u0 t" V* L; @+ v
4 \: y9 d. x4 }6 S! w- d2 H function current () {
% |# h7 i% k# y3 M! P' S var_dump ( __method__ );. T9 u/ q. y$ r* b5 {) ~/ M
return $this -> array [ $this -> position ];
8 S0 x8 `5 ]' {* J0 b: `; i }
+ f0 \; U7 ^, ^. v7 D$ h5 u* m
* f2 d3 r/ O; V0 V8 g% b6 }. s8 d function key () {
5 Z& n; b# j. Q var_dump ( __method__ );
) N. x) Y% g1 J return $this -> position ;* n# X4 O( V% i
}
( ~4 r3 j+ F0 @: j
( A! J; H2 C' a4 L, d ]7 j* f; T function next () {
0 s( c% h1 g" p) C: H( s1 ?* S var_dump ( __method__ );
: c$ P4 r8 r" Y ++ $this -> position ;
' u$ f9 E6 ^' Y7 p! h$ f }
|% d/ Y- C. N8 w" j. K* T6 T7 T
! W% I Q1 V3 H7 m function valid () {1 L' ^- ^* H" A0 U
var_dump ( __method__ );
2 Q9 I9 _/ ?5 S2 w/ f2 N1 Z5 Z return isset( $this -> array [ $this -> position ]);
2 h! n: O8 p) ] } _* Y* r# R: s2 m8 S5 f6 ]
}8 I2 D# z5 @& m# t; G
8 A* W4 e& n, m$ A- ^
$it = new myiterator ;) G4 _4 f% g* |8 l
# Z4 s) I$ e0 H7 Y, y foreach( $it as $key => $value ) {6 t g) V4 J) f) q7 j$ @4 ^3 t" Z
var_dump ( $key , $value );
+ B/ ?# `3 `( w# w, Z' A; V echo "\n" ;
& g4 ]# q7 ]( n+ W! o5 j" z }9 C1 O4 p+ f9 w9 L
7 d. K/ y! X* k0 q
| 3.iteratoraggregate聚合式迭代器接口
9 ^+ P" {, Y* O' n2 F 接口摘要:+ B7 x' ~% N- E+ p, Z
?
- i6 [" X! v* O, g 1
& {4 @7 R1 N$ u2 \7 T) @% _; N 2
9 B/ t+ o* a G7 s. a: ] 3
+ {5 X9 Z" N2 Q, Y/ s9 Q0 M 44 p0 K: j, N: ?" P9 T
5
5 [/ r4 K5 ^9 e! ^4 M | iteratoraggregate extends traversable {# ^( e$ T/ s, Y8 T0 N0 E
7 _6 h. {+ F& r, C( i //获取外部迭代器& \2 ]1 D) ]7 e
abstract public traversable getiterator ( void )8 I! x: q7 S) [$ n0 W: N4 j
}
0 e1 U) U: ]! k& D
$ c$ A7 \. S0 F: | | getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。
& g- G5 v4 f3 v( O9 y& g @" B* V ?
]' j& g {' u7 W+ s 15 S9 U: Q0 j# S4 K
2& \+ J( }% W% C' L% ?) ]% p
36 `( Z. P7 y+ r+ a2 ^
42 M% f) {! q1 ]. A6 \# R; \
54 H7 v( g, @2 a* t7 E6 \# e) X
69 q+ b3 J' o$ g; W @; _
7! H6 B$ ~3 B& y& A5 V* y/ r& I( A
8
2 R- D8 F) |/ E+ g' P& y' h 9% O) M1 M% `- O$ l* B2 @9 }6 k
10
% o( Q6 \. d7 v 11
& x' d& w' r1 } 12- W E! F6 T; R( R' R, x
13
+ a9 Q( u; j; e( L 146 h, y5 o# q: o0 b; h
152 l& C) X6 t4 [' d
16
) H5 j# B7 j# k' r 17
8 K$ A! d* P, e$ a( \% n+ z 188 P0 f% h9 g, W: ~6 A, V
19
1 C& U) v' A- `, {+ U) J4 x 20* `0 \/ d6 A! T
210 N; r# p8 p9 Z
| class mydata implements iteratoraggregate {8 x c8 V5 F6 ]+ B+ P
public $property1 = "public property one" ;
" x% ~4 f0 x& ], c; L public $property2 = "public property two" ;7 T9 O* Z3 v% t/ E, ^' O
public $property3 = "public property three" ;
0 y# o& A8 v1 N7 h& B ( K" x8 b) E- `3 P
public function __construct () {
" y3 c; i% r4 X( h& ~6 K# S* _5 ? $this -> property4 = "last property" ;2 k5 z! s( |6 {0 u! u9 u# ]
}1 z7 s6 O. B6 \/ Z9 y
0 L& {* q' {+ H5 m
. e8 D% _9 b7 A& g6 T. l public function getiterator () {
) I( T) I3 [/ s, }; N' d a T+ w) A/ ? return new arrayiterator ( $this );
; l5 g5 M4 i _' A5 E5 S) Q8 H }
% i1 K: d' C6 G }
+ L; p# o9 T6 F$ O. w; V, L5 S3 O - |3 }6 x7 W4 ]+ i% F
$obj = new mydata ;
+ |8 K$ f/ V* G8 `$ a- A9 S }/ U( L ' w; J% @$ W% ~' h) C
foreach( $obj as $key => $value ) {
4 t$ p# y* \# }3 j) m var_dump ( $key , $value );
/ I3 B2 U1 t0 B8 _9 X echo "\n" ;+ ~, Z6 X" j% f* F' I8 `; ?4 i
}
+ H9 N {; F6 r
1 K% v& V( f9 u+ g A | 4.arrayaccess数组式访问接口
7 a* n0 [/ S* o3 G3 y0 d# z 接口摘要:$ T6 G5 X( f4 h
?
) d# F) A4 d3 f& t; g 1- T# I) F! _: F0 x. h; v/ f
22 T( U( ~8 E% ?& F8 [
3; v9 m+ M' O u. q+ n0 I
4
' ^. o5 S. v" { 5
8 r8 i7 c8 @1 G3 _' I* |( E 6, H) l$ g% I* A9 c. c. }
7) |( X& e& _& @; ]; x* j! ~# e
| arrayaccess {! d/ f& {8 H6 K9 I
/* 方法 */
3 r! _! b |2 i( l4 k2 a, M abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在
) l" m9 _" N! A& J' g1 G5 K abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值
$ _/ a( I+ G8 N, h abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值9 z( H% R$ `) x( \
abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值2 r ]& u6 B8 c1 W& e. v
}
, ^, h, m' v& ]) `0 }) P: t 1 u% b8 O% [ P8 `+ ^
| 如下可像访问数组一样访问对象:# Z2 U% c2 x: j& M3 ?3 ]
?' G8 i/ F9 P1 z: ?
1! k2 d. C4 K; r/ D9 v5 C
2
& b# [3 E8 w0 ^1 A% g3 G* t 38 s8 W) b; a. h
47 r; A/ ?4 Z- J8 p1 P
5
: X$ H; k3 N: J e 6
% C0 [( |! ], ?5 W O4 m; N 7
$ F6 g4 c# ^- q* H6 E 8
) H: _/ }# L2 G2 }; J- K: x 9
6 p$ q3 q" u6 [3 P 10! D8 J- b2 @& `% e! P+ ~6 H
11
2 O; C" Q2 y: H 12
- J& d# ?* ^3 d8 u* ?! u6 h$ @- j 13# w/ [) y6 L9 d" @ a1 `+ t
14
& @+ a0 \- d9 h! ^3 T7 t6 l& D 15
7 p# G) O9 F8 k" f- O 16* Y3 ?9 m* ^) I& k& ^! q2 T, E% ]5 o
178 f) J, R. E* v, a' x
18
6 I. [0 a3 P. k' ]4 v! D: q" F 19
7 O! m! P3 c6 c- M- h 20
9 ?6 Q2 @$ w/ u5 {4 S; w& O6 z0 \) M 21& f" `1 E5 N; x' t9 Q, a4 a
223 S8 F2 D) }2 t
23% J0 ]" v$ r! @" d2 F
24
% }+ z3 b8 r7 X ]: X 25- g$ q2 S6 M1 C
265 R( T: q) ~' h( d2 o& r
270 L% m$ O0 ^0 L0 c- B
28
" o# i* c& w5 s9 m2 ]% c) m 299 Y# j' \! _( Q) C( e K0 `. W" s2 ^
30% I; B) I" I( F
31- K7 y7 G9 S# R6 M( V
32
+ w* m8 p+ ^; J; S9 X 33
9 H5 J0 R8 u; A& n 341 _( n) v. X3 o8 I
35
$ @2 Z+ l( z$ o |) W 36
% W" b" p) ?/ ?" n9 X. Z5 d8 v 371 P5 \( C+ m' A2 l+ f
385 }) n4 s# b1 a* q% N- M
39
; m( J, I0 G) A1 p | class obj implements arrayaccess {
, M5 O5 {0 E" P: f+ T3 q. l. @6 Y private $container = array();8 J3 d% A! i& D9 Q4 p/ s
public function __construct () {2 }0 O6 ~* \# V* i% k/ d) |9 \- L' }
$this -> container = array(% v' W# X+ M7 i" _
"one" => 1 ,
& z, g, n' @3 @9 N1 e3 m2 f( [, ~ "two" => 2 ,
$ |7 `" j: \# U7 R! w7 @9 Y& [- W, e "three" => 3 ,
* Z+ k P, O$ [% q4 B) Y) A7 @ );
- [- i/ z8 M. s* e: | }. q. m- M% f- c
public function offsetset ( $offset , $value ) {
) \7 b! d& [+ Y0 p1 d4 x! G if ( is_null ( $offset )) {* k) V8 E- I8 P) I5 D
$this -> container [] = $value ;
! @1 t: {3 i2 k( l3 Q, l1 T# @: @ } else {/ u6 f7 r4 E+ D2 A' c% b+ K
$this -> container [ $offset ] = $value ;
" ^ G# @. Q1 A0 i7 n$ ]: P }
P* E0 t' l r* C6 l% v6 L0 B }& G P7 h [2 N/ y$ k+ d
public function offsetexists ( $offset ) {+ s+ C: I) X) h. F7 g0 Q, f
return isset( $this -> container [ $offset ]);; t7 Q4 f9 n; v9 W
}
O1 \- e; c) _2 } public function offsetunset ( $offset ) {
/ Z5 Y: t t1 y1 M0 R( O o: l unset( $this -> container [ $offset ]);5 M: i* Q3 E4 j' w7 b6 v
}
' y* Q' t% m0 F$ D% y public function offsetget ( $offset ) {
N" ~* I* P" Y7 K$ d w( ~, p: c return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;. g' t6 `: f1 x6 z1 _
}
, y* W4 E8 ~ }# q0 { }
, s0 z: G6 c5 V4 G7 _/ ]" c$ u
; O- j n4 T$ w G0 K $obj = new obj ;
6 M0 L# v: @4 J* \ ! ?) s) n9 k* W; \5 S8 T% H: A
var_dump (isset( $obj [ "two" ]));
0 }$ h4 C4 e8 e1 _9 n" S& O5 Q var_dump ( $obj [ "two" ]);
1 l7 P0 ~' }! f6 X+ m+ n' Z unset( $obj [ "two" ]);; s9 g! l) t; S T) l+ s8 ~* E
var_dump (isset( $obj [ "two" ]));0 {: V, a7 W5 Q9 R. H2 S
$obj [ "two" ] = "a value" ;
3 Z% K1 ?# V0 }3 v- c3 H% Y2 R var_dump ( $obj [ "two" ]);
; o& k( l1 I$ B1 b; H $obj [] = 'append 1' ;5 t1 ]2 ?( Z6 v1 Z
$obj [] = 'append 2' ;2 G, G. t3 K7 k0 @$ }) ~$ {, S( t0 x
$obj [] = 'append 3' ;
/ c7 c' j) Z7 |' C0 a: u print_r ( $obj );
& t+ V9 S/ g4 r/ P) |. ]* B
/ f$ f- O0 z5 e8 q& P | 5.serializable序列化接口4 e3 h; W7 ]- \$ u# a9 p
接口摘要:( c& u/ Q D) v5 @/ U/ d2 b
?
* t6 t# L' `# K& X+ _, n 10 L" c/ R7 S9 U/ ^! z, \
2
0 P$ f3 S/ g: v/ t 3, v9 {5 Q, z, s8 | J# u
4; s# a8 m( d' t( J& B
54 c) s) {9 Y" y- Y j. k) P
6
" x* w3 k+ k5 ] J | serializable {7 `0 Z5 x) I" l2 w6 D
( w* L1 r5 m# k* q2 j6 `& P
/* 方法 */) d; J m" l0 r$ D" [/ N1 e1 B
abstract public string serialize ( void ) //对象的字符串表示8 N0 e" T0 u/ D7 A; I4 E- f
abstract public mixed unserialize ( string $serialized ) // 构造对象# w' p) }% p0 [7 ]
}9 N2 F0 y; E* x; I7 [
* J+ O, |9 C5 Q% S5 _
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。/ Q4 V- c/ n( h! w0 f7 C) y
?8 }: E" l1 L/ {. p
1. _' O1 Y q9 e e, {
2
) M/ \/ w, m5 v2 ^; }4 s3 f: t 3: z# Z& q* u2 l; }
4' G3 Z$ [$ E) L3 o
5! Z% m* [$ g; W4 X9 K
65 X3 ?9 }- w. p; ~! w- P6 W0 q5 w
7
" {; i% H! x: r, c9 W* Q, T 8
4 `9 O ~8 {. o8 o" C+ z 9
H! `& c# [6 H5 m/ n- @ 10" r+ x* u$ J+ Z
11
9 p# \" j5 d3 h$ Y5 R' ~; e 12
& K! L9 F5 E, U% u 13
/ @! U; c! [( K) F& J 148 d* k2 }8 v/ g
15
( \; Q( e# F1 v9 n6 @: K$ u7 r 164 j' P# g" Q+ e- P8 P/ n, b
17
3 A" P, M' D. P9 E 18
" T2 @ g0 `& k$ x, ?& r9 O 19
% g/ h5 j0 A p1 x 20/ ^7 L' w! p/ ^
211 S$ i+ A; K5 h+ S* x4 j0 m' T
| class obj implements serializable {0 ~, j4 d! m: o/ j# ]# E4 ]) q6 `& k
private $data ;; a! x1 E/ e& }/ d6 i* W
public function __construct () {
9 b4 }" |3 N- ^; O: v2 S $this -> data = "my private data" ;' s2 K) f6 ?& U
}
. @! f3 P$ J# z: O public function serialize () {6 \! H6 d7 j1 {5 U; X6 b# o
return serialize ( $this -> data );# L {) ^/ f; l/ t6 a3 H
}! d* M# d+ @4 o: {* e- ]0 W8 s" c
public function unserialize ( $data ) {' ~7 b3 S/ t5 ^/ t% z
$this -> data = unserialize ( $data );) Z% j8 Y0 E ^
}
* _3 I+ ?# f$ l* L1 Q public function getdata () {% y- k- x7 t" m4 N( Z
return $this -> data ;
$ Q, X/ z6 f9 _& S5 N5 B$ z' d }. R$ o! }1 U5 e" _
}
+ l6 ]& I U7 h$ c
0 q7 v1 ~. @, h6 H7 V $obj = new obj ;
( \. h2 G1 Z' D! M; a ? $ser = serialize ( $obj );
+ J7 `" W' \) C3 q# I K, ~ print_r($ser);7 w4 K" \- M3 k& E+ A
$newobj = unserialize ( $ser );
* S% }. d2 x D print_r($newobj);, B8 R/ Z3 f/ q& v
# {, W; x; W" _# U. R3 ~
| 6.closure
+ h" C: Q: X6 @9 W' }+ p# |9 h& B+ G 接口摘要:2 [% U! v: Y! f( n
?
+ r) r/ V3 ]4 { 1& `* X7 ]( J! ~7 n$ x; |
2
% E' }' l8 P' V! `6 D 3
$ K+ A* p: c/ l+ x 47 ^% B" ^0 s: Z! x8 y% P) }: j
5
; N/ c m' _1 F! K 6
! E8 Y$ j3 j" j, k$ Z0 ] | closure {
% ?8 ^2 X3 X- T* A3 ~( g( ]- D /* 方法 */6 S K8 h% |# j, J/ S- r9 o
__construct ( void ) //用于禁止实例化的构造函数
/ |8 y# ?! o! {( Q public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。
" y$ S9 s: u2 `* b. ^8 @" B, O) ] public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。
, H$ G) `2 B3 K$ ?& X5 y& o }
; G4 g2 v' p$ h, k . H- _" ^9 w5 a6 M5 u& S
| ?; w: B1 I$ ?- J
1
: R3 R3 y$ ]' k$ R 23 G# Z% T$ u( y6 e& Z/ O
32 ]1 R3 g( M& B0 K& ^
4
% W9 v4 K& E M& {% i+ N- n 5
1 x- T9 _5 b: o2 r' g( B+ r5 H5 ` 6
4 V4 x) P( S1 h/ i( G3 S 7
1 ^8 O* f( C) X 8( `/ g! b+ b1 k' ]2 m, t2 a
94 O4 J" s n u( I
100 E+ O G" M4 T M3 _2 A3 m2 ?6 h
11
: g6 e' p" {) ]+ k) J) T0 L: N 12
, N U7 e3 o3 U* H& { 13
) b$ h4 r4 p8 I- D7 C 14
; c6 @. V- D$ k% J+ I 15/ d8 b; s2 h5 |% e! y. u
| class a {
/ I3 \7 h/ F, A: \$ S private static $sfoo = 1 ;: J. k" w! F1 s0 d0 K( Z+ p
private $ifoo = 2 ;
- w# G5 J& N1 k }
) r$ c# V) M/ Y. P j2 h# e* L$ P $cl1 = static function() {
3 R I! l$ Y: U return a :: $sfoo ;) P- i D7 m: ^; q j7 n& u* d% X! X
};; R3 a, m' T8 p$ M# q' U7 i7 r
$cl2 = function() {
" P3 t) D c3 S3 S return $this -> ifoo ;
. _7 U% [( w" l: X# y7 | };1 D4 ^5 x9 Z7 N
% b) o: P5 h' @7 q3 t2 I2 [5 n
$bcl1 = closure :: bind ( $cl1 , null , 'a' );
* F9 n* k/ k2 f+ u, t$ c; N $bcl2 = closure :: bind ( $cl2 , new a (), 'a' );
$ l# o7 l' {. B6 a$ W% J9 I echo $bcl1 (), "\n" ;' n2 t9 M& ^) t( e& ]
echo $bcl2 (), "\n" ;6 H+ V; [! n! B( d
, o" R u3 d2 \! v4 h! d
| 更多网络编程信息请查看: 网络编程 |