这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下% \- X8 V0 t1 S7 P/ }8 h
php预定义了6个接口介绍如下:
8 y2 c) w: b; ?: [0 X& O5 d 1.traversable遍历接口( x7 y7 n6 G! R/ M
呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。1 z# }5 J7 }2 u0 u- P
?/ M# {3 S5 f! b+ v/ c$ c
17 u; _9 F8 i% {) Q& D) B; H( ?
20 [- ?$ \+ r5 h7 P& B* g
3
9 R/ X" X- r l; o/ Y2 c& X" R | if($class instanceof traversable) {
0 t( }1 O6 B1 M& V5 Y2 I3 b. N //foreach
9 W: i8 o2 W$ U }
: u9 G3 O0 o+ f K
# V3 W/ k% r: d6 ` | 2.iterator迭代器接口3 g/ z% _- a3 C4 \
接口摘要:5 c8 Y) j. T# ^" ?4 W
?
7 x" Q" ~% _# @8 d& q/ c: s+ M/ e 1; B) K+ }& E% c2 z
2
: F* X, V3 c& I# e8 _" @ 32 Q Y! _' b( F$ L" P* G
43 @0 E4 D0 O4 L1 Y: d
5
0 P. ]" y X. J& w 6; z5 g& q; c. a+ e; W x" H- b
7% M0 n! \3 I V6 P/ A
83 q% F0 ?% |# p$ E' e w3 y6 p
91 X& h# k( T1 U
10
3 _- N" p; b i/ N% g$ w* y 11. w9 w- @8 o0 J0 H4 x& l
12+ m1 {+ N ~2 T0 W. ]/ m( s
13, r! B; s6 _) S. D5 M( h
| iterator extends traversable9 [% | L( q) j
{
" V, {- z% J4 c. z //返回当前索引游标指向的元素
! p ^; E- C7 M& R( O+ G* E abstract public mixed current(void)+ N5 ~( [/ H! Y" O' m' I( S$ q
//返回当前索引游标指向的元素的键名% P9 A% `3 w7 J
abstract public scalar key(void)
& i' k0 h( M. S9 v //移动当前索引游标指向下一元素. i8 j! U' k9 L8 y! z# ?" E- w9 V5 {7 `. X
abstract public void next(void)
0 X* y3 {" b4 @1 ]( }4 a //重置索引游标的指向第一个元素
4 \ d) d7 C; F6 O/ O1 m- c5 n abstract public void rewind(void)4 l9 O, J: a4 P+ U! A# D
//判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用* X0 x: f/ L8 Y, W( X, z
abstract public boolean valid(void) u- U' g; B& S8 K; G
}
3 }( ], ^1 g. o3 W+ g + k: Q# \7 V* `8 v8 q$ K, S. r
| 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:
: V0 Q1 Q2 q. n- d8 j' u8 X4 j ?( C( n& |4 f/ k, V0 G
1; ?/ i7 I+ | s! G
27 N4 b' b4 l! R7 C) \2 ~ n1 s
3
; I8 A7 z7 ~/ |0 p& Z# | 4
3 l7 V6 |1 V$ x" o 5+ \, V6 P; H$ @
60 y) G8 q! ~( j- E* [
7
7 i7 a: ^7 U* I( e. R 89 }; Q( x" _3 B3 j/ Y5 Z
9
9 Z+ ^. a1 a5 t" J6 r 10) F. c8 e2 V# e8 G- `
117 N2 I. M$ S3 b2 T3 o
123 c' F& @3 Q, ~1 A
13
! o: n9 e; h6 V L" ` 14
! O, u1 m. B2 l 15, E7 [! |1 `5 x7 i* s7 N/ W; d+ Y
163 e. r s! B! x3 g; W
17 h* [/ [) G: \* l8 A% {
18
( J6 R4 X2 u- e9 ?' { 19! P" ^4 j$ \2 E+ A b4 ?4 p
206 \4 k5 V: h- Z& D5 u) O/ i1 O
21
' \7 k/ w0 }3 A$ k3 G1 p) U1 ] 22
1 q) X6 x/ W S' f; v' V9 [2 K ] 23
) Y7 L# b# e" R# h3 ^; C( v! Q 24; y- Z3 q2 C2 `' Q& Y2 B8 \+ s2 P
25& X' n5 J! f3 W: t9 k5 M2 ?/ x
26# z) U) R+ @) x& w* T" w
27
* [8 ^( Y" V( n 287 K. ^: P5 b# T9 J5 w2 {
29' n. W8 [" e4 i0 O& K
30 y5 V* f/ m' j
31# A9 m/ ^; f1 J- k# R9 w) w2 y2 b
32
V# T0 a* k, d 33
' h" W$ B! k" y- e$ G9 P. s. e 34& j: Q; }8 q3 g) A5 K& L, D
35
0 e7 u; O# A+ A) b 369 f4 c# o4 j9 |
37/ t: @3 y/ i; Z H, L& @8 ~
384 D- z8 f! _' B6 v! J. }
39
D# k$ }- k4 Y& v% ?* T 404 P" o: F4 O5 Y+ z
411 H$ j( M- q; c6 O: u6 T2 A: ~: D
42
$ b" X- \1 H% }9 d2 _- a: b! P T 434 |% ~* ^$ F+ T6 D7 n
44
: m' z8 W1 e( l3 U/ _+ {6 V+ C | class myiterator implements iterator {
4 z* M C0 E7 n private $position = 0 ;
+ Z8 A3 n( e7 F private $array = array(
$ E9 x: u. O+ u9 X3 }& s "firstelement" ," P; c( C j) Z" P
"secondelement" ,
5 Y0 s {2 v$ y "lastelement" ,
( {6 W+ E+ N4 {. X) r. C );
" ~+ j* w% k5 E
3 f0 c8 `/ ?$ h* l/ z6 I1 a/ p( C public function __construct () {; S; H/ w1 [0 F0 b" b- P
$this -> position = 0 ;6 C0 k" M; P* X% p5 j
}
5 f. S: G3 R9 }
, f0 R0 g+ N- R) d function rewind () {/ `3 p/ n5 h" m6 _5 l9 V/ {1 c/ t
var_dump ( __method__ );
2 s/ u1 r' l) \. V2 [; ]* G $this -> position = 0 ;9 C) R+ U0 O! a7 L; Y
}
" f6 U/ n& H) y6 n0 P+ R6 ^
* k5 ?" |2 Q) I; L- ?- U3 P7 C function current () {
K( A( x0 I* K+ ?/ m var_dump ( __method__ );3 M7 t; a3 H$ W, h
return $this -> array [ $this -> position ];/ D) G* l, W& i
}
Y2 @( p' k; c2 n2 [ |' F4 \ + a1 _! L o- g9 G" v) C e
function key () {
# d% f: r- I4 r7 t* W var_dump ( __method__ );6 M' M& F# T- ?6 [, t
return $this -> position ;9 E. B/ O9 |& V. S1 }6 p5 a" c' ?
}% ?1 u3 q, W ~ L% u
* A' h A. n, b function next () {
6 R) R9 Y8 R3 @ var_dump ( __method__ );
. a# U& S' p7 M6 k0 E/ | ++ $this -> position ;
0 [& S; _% @- O- x3 W3 i/ V }# S/ \2 B6 U- h. k$ B
7 d3 ?8 P" y* t' c function valid () {
% I% f& Y9 n7 X0 h7 b2 R' ^1 y var_dump ( __method__ );; r: F& S3 f5 k u! M! M
return isset( $this -> array [ $this -> position ]);
" O6 H# S. I, U( T3 c6 A }
8 U7 o8 X2 v4 f' y6 h0 N }
4 W: s$ T- O) Q# K; t
Z* I5 U- ]$ o K0 g W $it = new myiterator ;
4 y( a8 p! K# M' q0 z
! ]3 w1 a% d2 _2 U' T. O6 c foreach( $it as $key => $value ) {1 n" }% B [7 `1 w
var_dump ( $key , $value );2 H6 r( W! R0 W
echo "\n" ;
5 K; M% W; S) G( O3 p5 O9 @; }! p }
+ P6 {: x5 S4 ?1 G5 } ! M0 [% q& h+ S
| 3.iteratoraggregate聚合式迭代器接口, |- w9 y8 z% t( {% P8 Q
接口摘要:
8 c3 l) G; O& J! ~& ` ?
( N8 q6 I+ i. X: Y* | 16 n7 J e" g% x! B) E
2- p/ y+ W( `5 K/ A0 d6 _ t
37 }' E" F# J% M9 M6 y7 X
4
8 j5 \$ `. M# f# u3 n8 K+ t 53 x' M4 G' {/ g2 f4 Q
| iteratoraggregate extends traversable {
# y0 x3 R8 f# R6 j1 P0 p 5 J1 m y) |* P% ^# h
//获取外部迭代器; C; T3 s( B8 N2 Y; k, w
abstract public traversable getiterator ( void )* ]& T: W9 u8 F _8 N
}
5 H7 N$ `2 s u4 n' x# M- j1 A 1 O) \+ ~+ }- o$ e3 y; w4 r/ v; b% {
| getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。+ @, u7 j+ `0 X8 p
?
8 A- t; P+ W( {# T 1
, W2 ?- b1 _/ s8 ]% \6 {" a6 V 2
0 A: i. k4 J6 t' n! q; P 3
) \1 x$ L. T; |. p0 W* ` 4
( x: g$ _3 {+ m! B% R+ L* f. b. s% a 5
2 G0 w" z; z" x# R; _* p, t" u 6! X3 B; P+ _# H1 v
7
; n1 q7 x9 G- c 8
, l# u- D7 ^8 r$ |0 {1 I 9, v# p( s" r2 p, M
10. Q2 R2 g6 @7 r: t1 k2 b& Q5 J
110 W% r8 O6 m- ~! d
121 ^) j0 S& W6 N8 Z, p
13+ ?, W: E7 [, e g* N0 [; i
147 q/ p" W5 K. I$ k8 p
15
. s5 P/ k* Y/ ~- q. ~' h6 N8 A 16" g; }* d/ V# d4 a6 b; O, Y
17. j& R/ F* j4 l' j0 [
18
% f) d& r7 G$ A6 C 19
0 s3 c6 f* n5 v" _0 b4 E 20" t0 e! t9 K4 y* {
21
9 p0 l! t9 W9 y) [1 [4 x+ W0 R | class mydata implements iteratoraggregate {/ i( Y/ P( A( S% r% O! @, C6 j
public $property1 = "public property one" ;
! c' s( j9 A* K$ j4 w+ m% ] public $property2 = "public property two" ;: s; b) q) T% B, |* O9 O
public $property3 = "public property three" ;
' a: H8 Z0 c0 l% j6 h }9 X/ S' p # _2 e. Q" i) f' }, i% f" q3 y. g
public function __construct () {$ s+ ~+ A+ q5 B
$this -> property4 = "last property" ;, p \3 v. z* q+ N3 |
}
, ~. z% e( ?# w3 H0 s ^/ u
, V" z0 N4 G/ a8 g' I6 e6 ~, S 1 ?) \+ \# C! Z% ?9 C
public function getiterator () {/ x# }) J. N2 B3 j
return new arrayiterator ( $this );7 W9 a) J! ~3 o) p
}4 y' z& D& Q# F# d: ~4 f+ l
}
8 D" j& U+ @' q) P9 @
' k4 `6 G) J6 _2 i1 S $obj = new mydata ;/ O; r' O6 p) A
5 f* P6 I) s) w5 V9 {
foreach( $obj as $key => $value ) {+ b" N3 X7 `' U5 O
var_dump ( $key , $value );* V7 [7 {% O7 t
echo "\n" ;
4 k6 N7 ~0 Y. p/ R2 H }
! N8 T3 d2 _- }& l% S$ I 4 J1 r$ K' I) Z, H$ B9 j
| 4.arrayaccess数组式访问接口
6 N2 V% ]6 z' i 接口摘要:* ]* s) R& Y: l/ N- N& r# i7 o+ _
?) {2 d$ i) |& `, r3 W0 e
14 U; Z: D: C4 x5 P/ r& _7 a* M3 ~ g
2
$ j) q4 ?- v+ k! {. v6 x* h7 x8 C 3
5 O1 ]/ W% C% T, H' o N/ H 4
- G0 J* D: ^( X, a6 R/ r7 _ 5
( r4 ~6 m* _( V6 g, k' t2 A 6
/ M0 V9 Q* k# [. l, J+ W K 7
! A1 f7 |! a8 b: I0 W/ I | arrayaccess {9 Q* @/ ?$ ?8 u" y" Z3 w$ S0 A
/* 方法 */9 l8 a7 O& j: G% ]% _# b8 i
abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在
, L9 v1 |+ W: @2 | abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值
: X) P, G2 o R' c abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值
8 P8 v+ K: C$ Q% c abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值
; \. {: F8 ^8 G* i9 B5 p, C& h }4 x6 a# M. Z' g/ H9 o+ ~( R; C
. T) E3 B( P2 t6 M# j* m
| 如下可像访问数组一样访问对象:1 O) Z4 f& _0 x7 F
?
% f4 q. e- x' A 1" v; E: x! L! y# ]0 l
2
# \# Z3 G* G% R8 Z 3& l/ U' u! W9 D8 g4 [3 E, i0 q6 v
4 K( x; @) |5 r; r" t
5$ `7 W# w& J& h$ B' o5 G! F. |: k
6
5 @5 W/ Z9 ?8 h. s& P; o( v% m 7
! _9 j/ h8 ~1 E" c7 y9 m0 y! ] 8. L# H8 u6 I3 }7 V O
9% V+ o0 ^! P6 W9 F; Z; x
102 {2 J( d9 a* T! i" Q
118 L4 P0 R' r4 Z. B [: ~
12
+ j% C6 Y/ k- `, m: [2 x 13
$ t# E7 Z1 {' I; _, i- \: m; v 14
! \6 n, ]1 ]- {) `; L 15
! A L- S7 p8 [" G% D1 C 16
+ t, _- x& Y y: [2 X/ H 17
, R* S7 Z% Z2 q" b& [* @ 18
6 n+ ?" h* Y0 q: g* _/ e1 P 19
) r& f! q- o' g9 G7 U* J' C# u 20% }# a( j% ~7 |' r; N$ \
21
2 Z/ c$ j* k- E5 ]8 u1 \ f 22
) h" W, O. V! y# K$ N% r" y 23
0 X5 @) ?3 O& Q$ }: F* f- Y3 G# F 247 c3 m: V5 _1 t6 ^* _. ?* O
250 s+ w5 ?; v" K1 @1 v
265 i4 J: x/ d2 |, o
272 U( k2 o7 S! A: O$ _
282 q4 n0 P) n2 Y6 Z
29
$ u, a; P5 `& _5 R1 E 306 v% G8 ^8 C; U0 q5 |; @, [3 }; m
31
. [3 a) l4 y: y+ O. h7 _ 32- P, r3 [/ s* ^+ A! E7 s$ V: C
333 q B$ |% c* s: ^* D! h
34
; t4 n. t/ y* i 350 N" E/ Q* \6 s5 k" L) i
362 i7 }1 f& p7 U
37; J. t. H x+ b. x6 e
38
_. h+ u1 u, n. E7 Y 39
1 |' J& K; v- e. L) X O | class obj implements arrayaccess {5 l; y8 K/ v/ x2 k
private $container = array();! `1 Y5 k1 s& B/ O
public function __construct () {
: y$ b$ r7 Z M1 T$ p+ ~# j) ~' l $this -> container = array(! T$ q9 J' ^+ E/ S8 ?& L
"one" => 1 ,- E0 i3 d# Z6 F! {. i& A
"two" => 2 ,
j6 e+ B* n0 @" H* Z6 d "three" => 3 ,+ j- A% ^; A8 B# D4 }8 l
);" ?7 g( T# w9 l- R% V
}
2 o/ y! W, G! e0 H! [( x public function offsetset ( $offset , $value ) {$ F* w2 K- g) y$ m3 T* m' F
if ( is_null ( $offset )) {
; j2 |% d! y1 P% _2 S. P $this -> container [] = $value ;
/ w6 m5 r" ~3 f2 W+ ] } else {
; I; {" g( V% Q5 t. t' a$ y $this -> container [ $offset ] = $value ;
- J0 Y& @, Y( W; S0 S5 y6 _" v1 P }2 h8 r+ V) g& a# k
}
% C1 f1 D' G" v% Z, x! D2 D+ L public function offsetexists ( $offset ) { K" Y5 k) B: F% U: Z
return isset( $this -> container [ $offset ]);. ^" Z+ W( g9 b! L/ `8 O7 g
}2 e3 ?+ r+ m% j2 B$ O
public function offsetunset ( $offset ) {
; c' o1 U. i* N7 v7 b$ [ unset( $this -> container [ $offset ]);1 ?6 ^% J- v# ^% |, Z. g5 @
}
: T7 p. _! h! x4 v public function offsetget ( $offset ) {
t' O V( L$ j0 q return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;
" b9 T( _9 F; X% g3 e+ P2 v }
+ I" N5 R/ E: ]: J/ t }1 @% o$ j2 m( ~
; G/ J' z- `+ l! X
$obj = new obj ;8 w- z2 E8 k+ s$ L+ u( ~
2 M$ p- n: ]# c& M" M' b9 O% Q var_dump (isset( $obj [ "two" ]));
/ I7 i$ J* {3 W6 n) R var_dump ( $obj [ "two" ]);
u3 G* w" v( W) B9 Y unset( $obj [ "two" ]);' I8 J" e: M E T( `
var_dump (isset( $obj [ "two" ]));
* p, q; x d! U1 Y5 X" K $obj [ "two" ] = "a value" ;
5 U6 j; q) D" J1 T var_dump ( $obj [ "two" ]);5 T U# O: U/ _5 W. i4 I
$obj [] = 'append 1' ;
+ z o3 O( @1 i8 z- R# D $obj [] = 'append 2' ;
1 h4 `$ d* ^, i5 W2 K $obj [] = 'append 3' ;
5 g: o5 }) j% ^7 M9 W$ H print_r ( $obj );; o- U# K6 u6 l! C
. k$ q0 s/ Z! f1 { | 5.serializable序列化接口
) H5 k. E- X0 l; P w 接口摘要:$ i w. z) A: z. x2 n8 O
?. _- Q+ F# G, Z. n% `7 C
1! D- H! v" {% f. ]- H2 @
2
- K/ r* O* b# E+ @$ \* p 3# b a3 N( ^% J5 D
4
( P3 L: H) F/ Z3 Z( H! H( Y; S$ [ 5' u+ Z/ ~- M9 z% B
6, }3 t" c( H! n5 x! z8 \
| serializable {
/ H& m: u0 H* L/ W' l# S% B3 l K- g+ O1 C5 o5 M( @% Z1 l
/* 方法 */
6 W" Y# x4 {' g. o0 k$ k abstract public string serialize ( void ) //对象的字符串表示
! d! v9 K/ ?6 m" T abstract public mixed unserialize ( string $serialized ) // 构造对象: m, r* F# x1 Q, ?- l9 L0 w
}
- J( d+ n, a# { H5 y9 D $ j& Z7 [& H# u% J* p
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。" c4 {2 B4 z9 Q9 @+ B" V4 y
?
2 o# J7 \8 M: ~$ y; n+ H w5 M 1
9 r, |' A$ I7 b1 ] 2
/ d3 {- T( O! ^3 s4 X& e 3
6 J& w4 F) J% z4 U3 O4 L7 _ 4
0 p' o/ Y6 O6 c7 s- X2 I+ b) U+ ? 5
3 B+ S5 W" m( x6 ?% ] ]8 G H 6- F2 x% K. h' @; V) L: ~
7
& q* K2 {: B1 L& z0 Q 8
d% w: c2 d3 c6 U 9
- o" z) u3 e% Z4 a) P( ^4 b 10
' t+ |" x8 y: b6 U" F 11: T4 p3 n4 x7 y T
12% e) b) H4 [& M! o$ ]9 `
13
4 }6 w0 O1 F5 l# ^7 a 14) x4 A( X# a1 ^) P: N' c
15
V6 g. S3 D7 ^* a! n 16
+ a" _- J7 i; K# d3 n0 n" L 17
9 j8 b: z& ]$ M; a8 U* M 18
% X% m5 d0 j. D 19; v7 U5 b7 d' Q3 W0 r
20' ~, o3 d1 f0 D, t" ^
21
& Y9 {2 P; x. O3 A" x | class obj implements serializable {
' B/ @, X. R1 H, ?9 l# ~. C3 o private $data ;3 Q" X$ F' A% t; p2 \% f1 j
public function __construct () {
! N! n6 `5 Z I+ B5 N $this -> data = "my private data" ;
: s) D9 C2 M$ F8 U' c }
; @: x/ D( H V. Q/ L public function serialize () {$ ?- s9 M9 `- `5 ^: }) V9 i! Q/ D. A
return serialize ( $this -> data );2 | I7 m6 K( H' L& }# U1 N# C' e
}8 p: z% i" x0 I; v2 v# U+ V
public function unserialize ( $data ) {
6 B8 h3 }1 ?/ J $this -> data = unserialize ( $data );3 D$ l$ a6 G$ ~9 `
}6 u' v: h0 F* o- Q7 j. V3 g* f
public function getdata () {
% |* `# C2 g! U; @1 @9 X return $this -> data ;
S0 o- w& a; w$ R }6 M+ n: M6 w% o' j
}4 E- Z9 w6 s B2 Y4 e
4 c/ \9 E. O5 d$ _5 X {0 ?% m $obj = new obj ;
% o+ H$ _9 H* V, n) i% d $ser = serialize ( $obj );
* ]4 N, X+ M' }$ w7 A* }- ]. [ print_r($ser);- B- t, Z1 X5 K. ?' i
$newobj = unserialize ( $ser );
! F7 }0 _7 T& i3 ] print_r($newobj);. k6 ~/ }' F, ]6 A8 f& w% N: z
6 n3 G* p. @3 Z( n$ T. _8 O7 \; I | 6.closure2 T1 M% J6 k* ]7 j1 }
接口摘要:
% ?1 O" q# Q- H) m/ ]% [ ?: M: {5 N8 [0 R3 Q+ a- p* r7 `
1
1 H* S; v" U; S( t& m/ W% i0 v } 27 h1 C6 ~8 U: O& ]5 v; R
3
! W% I5 j4 W; v) n- ` 4
* c+ w3 ^7 e+ ]3 k3 W- S7 @. L 5. y4 w& L7 A/ c# i: n& [
6
* b# h# r" `, Y/ c4 q | closure {
- [! f7 c3 {9 o9 ^' c /* 方法 */
i9 B# i/ x+ L __construct ( void ) //用于禁止实例化的构造函数
/ Y5 d9 z6 {$ Q4 O$ p2 Q+ P6 x. A! g* \ public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。# m7 s9 K. l$ e ?" J) Z, q1 e
public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。# s4 ]& r1 `& O" L" M1 V/ P! _8 @
}
' Y' V+ S% A7 g9 x' i, c/ M3 Z6 t % }0 X9 [2 `7 _: k8 [+ K
| ?+ t" i* i$ i% I7 M0 h& [
1* j. e- q; [% L% H% \# y- v
2' Q7 _: ?1 e* r* G6 V
31 |( k5 ]) A) ]( p+ F8 i: K/ i
4
4 \; i0 s) Y# i+ T 5! t9 A1 i: C5 l" X
6% o5 Q* Q K5 ^. R* u) ]5 t. D
7+ X2 d8 b) N8 p3 C% Q+ Y' X n* _
8
( B1 K9 X2 B1 S1 q0 {! W5 Q! ` 9$ ?, l, H) ~! g4 G$ {7 {& Y
10
# V( x' o9 Q4 E- x 11
8 I& X) m+ S4 ]' j( U 12
2 d. {1 E% J- E& D. J# k 13' Q$ ^7 @0 r% J5 p+ C ]1 Y
149 }$ H8 A7 u% v
151 ~+ [0 W- Z6 R, j
| class a {2 B9 T' q/ o1 j6 F. R. J
private static $sfoo = 1 ;
6 S0 W) ^& p8 c w private $ifoo = 2 ;
# H# I: ^5 _8 [ }7 k7 d' C9 ^1 t) Y( n# L# O
$cl1 = static function() {
9 G" I9 X" t5 t" Q+ M9 T/ `1 P return a :: $sfoo ;
- b! L6 O, [( l( n0 N d };
% v# h) `! r9 t( I& x1 l $cl2 = function() {
/ y+ z& o0 p- o' G3 H% S7 O return $this -> ifoo ;' K; X4 y& ]; ?
};& F; h: B8 r/ I2 g3 b" E* Q- ~
( ?1 E; e' ~. P3 i& Q; L $bcl1 = closure :: bind ( $cl1 , null , 'a' );
1 j0 B0 s/ {+ Q( x* `7 X $bcl2 = closure :: bind ( $cl2 , new a (), 'a' );
% V% j8 N2 \* ]# N& w s: I. f echo $bcl1 (), "\n" ;
( L9 Y" S( L% [4 v echo $bcl2 (), "\n" ;( q' @. w! [6 `" f" t
# P% r3 W; z9 d2 g | 更多网络编程信息请查看: 网络编程 |