这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下5 f8 I: g s, g( M* T
php预定义了6个接口介绍如下:/ p7 G. X, R9 I4 ~5 B4 Z% d0 M
1.traversable遍历接口
* U- O C% o" q6 O 呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。
+ Z8 i! d5 o5 T2 s ?
1 G J! T- m6 r 1
6 i( i% D; ~5 _. \3 N. w 2
, ^7 G/ N/ R) O% S7 p4 S 3, Q9 A# ^1 x f% t
| if($class instanceof traversable) {
& U7 l8 E1 }5 d9 g. X, W //foreach: N3 q3 ^; ?. n5 l$ P$ s# x6 F
} r4 ^# i) w! X' j5 Z
' v8 h. H. f; Q+ ]* w# Z
| 2.iterator迭代器接口2 v% _8 P8 v* M+ o
接口摘要:8 p" c. i/ t2 {2 o5 i e
?( a- ^. o+ U* {& B% C0 `
1
1 G2 K; S1 r3 C5 u. R! ] 2. ]: a9 B5 U2 h1 A4 O) d1 B
34 W* b3 A; b" Y, M1 W
4. ?% w( R( P, G' ]8 q* @
5
2 w. j; m2 ~1 a3 Y5 v/ h 6& t7 f7 ?2 m( Z6 j! J: Z+ L
7
# R/ G! u( T$ H+ k 80 c; \+ ]$ ?) t u
96 ^# x% G) K' s$ X7 g
10 M; i- e4 a9 @, x% O! r; C1 `
11
" H% q1 r3 X% o( T1 q 12( I( n# C4 d& F5 q! W0 l- D+ V
13 c# n* D4 P' _9 Y, i, k
| iterator extends traversable* h3 \# \ L6 Q# J | K! e
{6 ~) G# M6 L8 |9 }; t2 B! |0 D4 r
//返回当前索引游标指向的元素' u: p2 t6 Z4 p1 c
abstract public mixed current(void). V7 Z* y0 s4 n0 J
//返回当前索引游标指向的元素的键名; ]4 P' Q- _0 H6 h8 `" ?! t
abstract public scalar key(void)3 f: J1 q1 N" O# v$ f8 F; @) `
//移动当前索引游标指向下一元素
* w, E1 n' c3 w0 |5 ?$ M* c2 b abstract public void next(void)
- } Q/ I! U- B; q# } //重置索引游标的指向第一个元素
, P7 |# _2 B/ \# r4 U3 H! U abstract public void rewind(void)' G, F1 Q5 |& X
//判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用
' T+ k/ D1 h9 L4 m# P abstract public boolean valid(void); {# P7 C/ i+ i& ~7 \8 x
}# B/ u! n v6 }& r3 E
; ^$ S2 {& ]% z# i
| 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:. J9 ^0 ^4 p$ c
?
. T. M+ b) s8 H- }9 a) W5 g1 h 1
# l- g8 V" N7 A8 N1 J) _ 2# Y4 I6 u1 L% i
3! w7 [9 w( p, b5 J
4
% w/ f+ x* {7 H1 k" j! n 5' Y/ x. _) T5 X3 A& U
6
( w. A7 N6 E7 K 7, n% }- b A- ^: e
8
. [( |# g$ g+ U: k. H7 P* N: W) X 95 o* v4 W9 L0 y/ r* w
10" g8 Y! o" ]% P. X: }
11
5 N( U! g! u, }; I) L 12
6 t+ ^: s4 e* B: g* _2 z4 A% G 13: {, F5 s/ z6 s5 T
14. w, h6 n& W0 v+ j0 q. n
15
1 f$ }, ]9 P. o+ m 16
( q! Q h! n" z8 ]/ @ 17' u) C) k- a& q- W
18
7 F( u: j9 l- v/ a' j) Y* u* n 19 m6 w% e' Z2 \0 `+ I
20, p% H- X4 `. }9 W7 u
21
: {/ h6 D+ f0 f- ^4 k 22
% X$ H" p) \) ?0 v( \; J, \( _2 ^ 23! ~1 q7 Y1 D% ?. D/ O# V; {
24
! {) ^' i& K" F+ }7 s& ^ 25; N& c1 @4 ?4 j* H
26
2 R8 Z) Z3 h4 G ?0 P 270 ~3 z# W, c1 f E2 g# E5 @
283 k8 H( l* Z" m, D+ r B& ]$ H% W- D
29! E7 ^: t( a3 P' N& p O2 _7 Q
30, u) g3 o* {) ?* G. i' U
31: [0 U5 H2 N5 x W. l \
32
2 {* l7 J0 Q% B9 A 339 V. a% I2 @0 n. u
349 Y4 y5 t+ V( N" g
35
: D4 p/ [. p' ~" @3 b 36
& G3 m$ m0 l4 u0 S7 _: | 37
* n* H, t6 e7 r4 m* J/ k# T! f/ t 38
2 ~$ e5 b! }+ b" U& m" h& h 39' ]2 g+ Y8 K; @4 O
40# Q* }7 {( U. L/ r Q$ f
41
( D- `1 L# s W& a. c, c 42
{; T: }# K& {) |$ R! t! M6 @ 43, M& F# C8 o: C3 ^8 t0 d
44- ?! N/ K, ?- m$ t
| class myiterator implements iterator {
: ~5 \5 J- i, S9 r private $position = 0 ;
1 F: R! V$ F4 s3 ] private $array = array(4 ~( `9 m) e, G1 B* o' C4 L
"firstelement" ,2 m5 R3 @% N ~; J+ \2 Y! o. c
"secondelement" ,6 T$ E. A& C+ @+ j7 U' r( c' R
"lastelement" ,
6 F; C: ]( ~& U& J/ N0 l, u, `( P' T ); ]* i3 `& Z0 X6 ?4 l1 [6 ~) C0 C
- O, J- S! H, P( N/ v# D
public function __construct () {
) w+ L( h0 a3 b $this -> position = 0 ;
( I {/ I7 `5 D: l" C# ^( Y9 Q2 V }
7 [6 i0 _# x" | " ` _3 N# _; c# v
function rewind () {
9 N+ W- S7 G. m var_dump ( __method__ );
5 g5 C* Q7 w8 U! E( {- b$ } $this -> position = 0 ;: O3 Z: C7 m! i& R
}( s2 Z! U2 @$ Q1 g. _+ f4 h/ g
+ x: t: L+ N' U/ W. h# y" a3 c function current () {, B( ?0 P! {/ q, U
var_dump ( __method__ );0 e& X3 h* D% C
return $this -> array [ $this -> position ];$ N9 ?+ g( \6 F0 \
}
T' s9 d0 j# g" I6 t& d G
; T0 [! X9 H* m+ ^ [, e function key () {, N+ W8 V+ A1 w
var_dump ( __method__ );4 @8 y+ h$ j Y+ U
return $this -> position ;# [( R, b/ k6 \, u' l) |
}
1 T5 e3 V* y' Z! s A$ z : e: m- t2 Z: N( x1 V
function next () {; Q$ T, H; t9 t/ [$ x6 X
var_dump ( __method__ );
" L& c) v" s' Y. k' A) w; p ++ $this -> position ;
) Y/ B7 ^% x- }8 p2 w! y+ }) A }# T' P1 b6 A6 `, g9 ?! g! Q
; _" k9 L" f) Z6 V3 _* L2 W6 B
function valid () {
0 j: ^ [2 b3 b. f- }! ~) ?$ V/ | var_dump ( __method__ );
I- \/ P) V' W' j5 e7 `4 B return isset( $this -> array [ $this -> position ]);) a) M) q: f+ o2 {) w! B h
}
3 b+ I6 [9 n0 f" L" U2 M }4 W) t3 I3 I' h. m( z, u
& T$ U7 }6 Y/ c4 F5 r9 [
$it = new myiterator ; b$ W- J5 Y3 n: k, W
8 V: a+ ^6 \ r- {
foreach( $it as $key => $value ) {, k7 [ I( a; y( g( M% l
var_dump ( $key , $value );
: @3 e) H4 Q8 Q echo "\n" ;: A8 t) G0 {( a! ~/ G! L
}
( r) \. k2 F6 T' a7 u! j9 |7 s
8 z g1 T5 a7 u% E/ {; n0 n. k- F | 3.iteratoraggregate聚合式迭代器接口
. H. f* P, R$ e# V1 z" {/ ?2 I 接口摘要:
+ D! g8 X; ^: h ?
% L$ z _4 W- \: _* b- I/ H 1; o% z( a1 T- d2 W$ C
2
; F6 J+ t4 n# ~5 D) O 3
V3 W: ]+ V5 v- f9 i* `7 J 4
1 L4 g0 b; [7 x0 X' k, t 52 x2 K: K6 u5 _
| iteratoraggregate extends traversable {( |, |& @; u! v I; x' \6 T
; u, s8 V& @5 `) _5 L1 z
//获取外部迭代器6 G1 v% |+ K+ l' k/ F2 G
abstract public traversable getiterator ( void )1 i) d/ q1 U7 v( N0 r0 D
}5 F K9 Y- g- i z9 L8 x
9 t. N) {; _* @ | getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。
2 B! z' X0 u) I7 t ?
; z/ z5 v7 P9 L' S. w) Z 1( _. L+ T: C) K
2" h& \; f, q: K5 D% Q- a7 W
3- o8 v8 U+ v/ I, W8 z6 p- y0 _
4
7 `) O% [) g+ ~ 5( Q+ U0 o& J* \" W
6
) z& t; Q( C% N s 75 Y6 ]5 m7 n' D! L4 q1 O7 Z' v
8/ G; T0 \8 T5 E; C1 c$ R# w
9- {+ o8 q# g9 I2 F& q4 k
103 r$ Q5 u7 x6 n7 M' a0 [
115 Z' Y& P/ c C7 r
12
9 K$ n# D4 ^3 T 13
S& J; t( \$ h- I) | 14
7 e8 j1 L. s2 S) A+ y5 C 15) E! C! G% {6 _7 H% Z# `' h
16
/ j/ x% ^ X+ ^% u 172 L7 f# J' l8 a+ R5 v p# {* C! B6 Q
18
3 n2 O5 J M9 L/ ?0 A. z2 d. U& R 19
" w {4 }! D% X ]1 j 20
4 z- O2 z! ]# Q J4 R+ c 218 U! T8 {5 [1 f+ ~+ }+ d7 [+ d( c
| class mydata implements iteratoraggregate {
9 d1 O/ Q: w& _ R public $property1 = "public property one" ;7 g% [: j/ q& \: |! e1 [* X; J, J$ n
public $property2 = "public property two" ;) H0 u6 z" P' @
public $property3 = "public property three" ;" o# \1 p, z4 p5 g
0 E0 }7 V! I0 L" s public function __construct () {7 }6 n' H0 s6 O* ~3 x1 h
$this -> property4 = "last property" ;; G4 ]/ S' T: y& h% I
}+ X! R+ s/ f i5 l4 \' ]
w5 x b/ u1 s. j' P3 x# n" W3 \
* j) V7 {7 |9 s. R+ a$ s' p' T public function getiterator () {" s+ K: I) \/ w, S q
return new arrayiterator ( $this );
4 T" b# ]5 z# h8 J }
! n7 ], a- {: F: Q8 T8 D2 ]3 Z }
' q4 d9 h' V6 X1 a& Z
# n+ J) D; U& u $obj = new mydata ;
$ \8 x4 a; q9 M/ _
) J5 c: Z8 G+ ]; i3 \ foreach( $obj as $key => $value ) {0 a9 A0 L( d& R; {% z$ u
var_dump ( $key , $value );
7 N6 j3 s1 H: v) u1 D+ H echo "\n" ;
# W# B I* N2 w& i7 b* f( e, F3 k }( g2 u1 F' h, W: S9 @ [
6 Z$ W0 w y2 a$ \
| 4.arrayaccess数组式访问接口
3 W4 I0 m; j3 i/ p! ~4 C: e3 o 接口摘要:. |$ T( k2 E7 e
?/ x6 ~7 ~) J: {; t8 ?( M' C' @
1
/ R' ^' q& f' D, P0 m 2
1 z: ~1 i* {! {! X" @! C* i 3
) n& L( n! p9 M" P5 D1 T9 z 4
) ^' |1 d& {) }6 K8 s5 b 51 f6 y$ x3 H9 w0 ?
64 n# |! c( ^8 W, d, o
7
* j+ q+ h8 P x' {( J | arrayaccess {" Y0 R2 t0 `, _2 @& Z1 x4 d
/* 方法 */
" N' |, F" e( } o& P) h7 Z abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在
" j* O! t- Q5 X, m3 { abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值
+ W8 o- M- s* k8 H* g3 h abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值
+ X2 T! P" u, r' G. C abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值9 g+ C+ I0 D/ q) q& s" L; @
}& r2 Y, }" T0 ~4 a+ T
& R! ?$ a0 L- ]/ d! h' S7 r u
| 如下可像访问数组一样访问对象:/ u2 v/ A+ T( L. C' D- e1 ]& }
?
: d2 F- z3 m* _6 v q 1
2 j. j$ J* W! Q6 e- |$ E) j9 f4 ]- A 2
' l$ Q% W, f3 M$ \% {- q 3
/ T- I% r ~) V N# s2 a 4
( c d& M$ y2 k8 Z; C- |& Q6 R6 x 5 _* U$ `+ u, o! ]3 ^# D4 P
6! r S$ N$ ?& P/ H$ r0 w
76 d% w) X; a. |6 ~: p- L/ ^
8 ?$ \0 [% ^, ^( p5 s
9
% C/ g5 B3 h3 A* M$ T1 m) q 10" T- d- S# G8 h: g
11
- h% v [' X3 ^5 M+ R/ D 129 h" c2 t7 o8 ~+ @3 v8 i1 O
13
. {, p5 P4 f0 N- L4 c5 _& w4 M! E# ^ 14. v; \" a/ z1 J9 {/ L$ s2 J
15
9 s5 H6 _. X( ]6 O/ P0 } 16& H, _" o5 ^: w" l m% d! i5 Y% a
170 ^* B% [& M& k: d& B; y% z3 J) Z
18
7 \& r+ J" m, D+ Q 19
* k0 S6 x9 L9 X( l/ F+ h. a. ` 20
' u( C) I$ j! N% c7 u" W 217 N4 ]- x4 @0 r5 Q* q1 H% i- Z8 j5 N
22
7 R8 a6 B. A4 C4 _, q) Y$ s. h2 |5 u 23 k% c. u/ @. R& ^6 c% h
24
% S+ s1 ]7 u7 ` 25& [) R) D e3 u0 D" p: X
26% s8 O+ C1 l. _ _- H! o M
27
; k* M! ^( a( J- h 28* t6 x/ y' D3 x6 F' e& ~+ p6 x
29
! Q+ A9 H$ k# c% _; h% I" q 30
) ~6 m5 g- g k( \ 31 E* g' C1 Y2 |% r# \
32
& C$ |' l2 R/ W3 _; J 339 R, W# u7 X: p) N2 j
348 [4 n2 Q; k: x* z' [* g
35
' F0 u8 }+ d" k4 V/ F: n9 ` M 36/ g1 d# W: W, h% x+ @7 Y
37$ t* N0 V+ L' H& v0 O" Z, a
38
( } b4 H( q" G$ y/ q7 v" E 393 r" S" z0 F# z5 f, F( z
| class obj implements arrayaccess {
; M; [1 m6 }4 w, y% D private $container = array();
) u' T8 G6 G- P. t8 i" L& B& ] public function __construct () {+ G' S, @& Z3 O1 U$ a1 e6 _: K
$this -> container = array(
) A/ r, w+ c, c2 Y& t: j* k "one" => 1 ,5 I( V% }4 x6 E1 E3 B1 E, L
"two" => 2 ,0 r: G+ Z1 m5 l6 D; @$ a
"three" => 3 ,5 B/ F) D" s" Y4 h0 Q: l
);% ?; x: G) H" _! ?' M
} g+ z( n" y& M: D
public function offsetset ( $offset , $value ) {
) _2 r* v- I" W3 S if ( is_null ( $offset )) {7 Z: a, {- z: V+ R$ H
$this -> container [] = $value ;% j& v- c" l. S, @2 Z
} else {
# Y; _) H- ~# b2 ]8 K $this -> container [ $offset ] = $value ;+ t# `6 U0 ^. f3 O0 @
}( e. L% p2 y* m R& ~
}
* B* q$ c* D- [, [( f4 A+ R0 e public function offsetexists ( $offset ) {
, E/ i5 Y" Y! ?: t3 S/ z3 R return isset( $this -> container [ $offset ]);
7 |( q5 {3 b+ a6 Q. v' X }+ v6 p6 P/ G, T, ?) o2 x, Q
public function offsetunset ( $offset ) {
+ w# \# V* H7 R# ~ unset( $this -> container [ $offset ]);& w( i* X* E" F0 y( f# N
}
3 V6 O v0 E0 [ public function offsetget ( $offset ) {
& Q: Q+ \% P7 A7 k; p return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;" e( F( z# t: o# ^ X1 Z# Q
}
% {; d) `5 @) V$ S4 k! s- F }- A* [" i: h1 y: Q4 X: a. B
' C: H3 A4 j l+ _ $obj = new obj ;: p5 R' K; Q5 k+ ?
5 e5 S3 h* S& A var_dump (isset( $obj [ "two" ]));
6 I1 V/ N3 Y/ ^+ v var_dump ( $obj [ "two" ]);4 R- k# n* p# E; A! p! G
unset( $obj [ "two" ]);
9 F5 n9 I: h0 }1 q' v. q3 F) b var_dump (isset( $obj [ "two" ]));
& v+ a6 R5 @1 e; r$ t $obj [ "two" ] = "a value" ;4 }- I% J |: |) Q U( j3 ^
var_dump ( $obj [ "two" ]);
4 l: v+ ~4 Y/ W3 M, l3 x8 ~ $obj [] = 'append 1' ;
+ N K7 R- v! R+ Y- `# A! N- w $obj [] = 'append 2' ;
! z6 A" K: V4 [' L L# _3 @ $obj [] = 'append 3' ;+ L* b8 a& \. V4 L
print_r ( $obj );4 I* O( q# ]# P! r9 C5 ^
- x" h0 E5 M$ D( { | 5.serializable序列化接口9 G7 e) x! I$ d4 f$ x# C8 j
接口摘要:$ E1 f3 [0 d; n% M+ f! x& t3 D
? L% {, e% K5 r- H# G# K
1
6 N& h) z3 a0 U9 t" H/ X 26 z& f- o5 V$ w- E
3, m5 ~1 l/ Y% u) q6 Y1 r9 G( ]
4
0 \' x& F8 B% b: J7 q; J# k 52 t% ] R; V7 ^7 e- ]
68 s( y; x Z& s6 v
| serializable {
% m! q4 K8 d* E* L r
5 m. E3 p9 D$ q V6 w /* 方法 */( L( t! N% m4 m3 O- g
abstract public string serialize ( void ) //对象的字符串表示- R6 x# o& F _ A2 U0 C
abstract public mixed unserialize ( string $serialized ) // 构造对象2 {, N8 a+ @8 W3 D
}9 K5 w- v9 t; F `
! N9 ^# T1 |4 c* H$ U3 x
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。
7 }2 p6 ~ O M ?
5 z4 I% H9 b; e# W. H3 |3 q4 v 1
0 r" w$ ~4 @9 t$ A! j8 Y 2
# C* S' u7 m. |# r- } S 3- h% g# H/ _- F( [
4( l7 B1 W9 A: t* t
5# T9 F9 D. U" c
6( |; R4 D0 R9 h3 l! g* G
72 j: J2 Y' c1 A' b5 g, I0 s+ w. i
88 n6 x! ]3 j, Q6 q! w, }
9
# ^6 P' u4 Z' o: p. y8 i* u; y 103 f2 ?. f% c$ u Z7 S/ c2 [
11
6 [/ q( {- |9 {: g' H 12
+ D- Q* a. U+ l, ^, V( Y& v( T 13
0 O3 s. {" G3 X: c8 d4 H: i 14
% u# E% x' _7 J% M 15
( [5 D2 u/ i( L 160 o8 y3 [% f' Q, D1 O( C
17
8 \* j( U8 I* @% `8 [; [/ i 18) B* Z! A7 D: J& _" H: }' l: ~
19+ J& s0 b2 Q1 I! p7 ~
20: O" @' r$ O4 x
21
+ [; a0 H1 H5 g- e- P | class obj implements serializable {+ ^5 d/ y8 J8 c. v, j* d* B/ Q
private $data ;
' w [- L! z& f, f( X5 j5 Y public function __construct () {$ J4 @- t6 L% w: t! i. k
$this -> data = "my private data" ;6 g# u1 i B h/ a
}
% q# d; G- u' n public function serialize () {
% O6 V% Q3 H5 x% I" d' v- z- `: b return serialize ( $this -> data );
! A: a! n) x* E. q" J! t4 p }# f: J# T: a' O$ u
public function unserialize ( $data ) {9 x' T8 X+ M q2 x) S3 S9 Y
$this -> data = unserialize ( $data );* E* M! t' r4 `8 R# E: q
}! V( r% T5 D) | M! P$ _& a7 _+ P
public function getdata () {7 F* M, e. ?+ H
return $this -> data ;* t/ u' P: j+ v* Z
}$ D) m0 B) v. s7 \7 ?5 X; R" K
}
+ |: ]& d4 e. `5 x1 S & f& H' j3 _1 ~+ i$ S. Y
$obj = new obj ;
! j5 `4 b3 j4 ^( N8 \3 g: B/ J $ser = serialize ( $obj );( k: a; G t I/ i! G
print_r($ser);
- ?' u4 S9 }1 L( l0 N! b; J $newobj = unserialize ( $ser );+ I4 y% U U: n* Z
print_r($newobj);
; c# w% V [! R* A 8 N' q9 @0 I1 t8 Q6 Z. p
| 6.closure: N9 y* k, ^- [& s
接口摘要:
' [. i% V: ?/ C0 G( W ?
. Z1 k% J t) [3 c' [. T 1
4 V+ A: ]3 u- q 23 a( h1 E5 ^4 Z l f6 t
3; I4 E+ F' ^# \5 Y1 D8 _/ T
4% }( Y5 F. E$ t( m/ E! \" ^. p( e
5% u+ J- E6 C+ q ^
6. p* x. X# s5 U5 u6 n( C
| closure {' T8 X) ^3 e. L% f
/* 方法 */
5 |* n- K- j8 O __construct ( void ) //用于禁止实例化的构造函数
/ @+ g5 }( H( g3 d2 b public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。
4 W1 n" W- f) {- [, y public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。) P6 x$ G! u$ I
}
( K& N I w" A6 X! p$ ] % i9 U: ?! Q( t# ?& b, t9 _5 D- a
| ?% V( Z0 } `. j- c% o
13 r. Q( j8 B9 k$ {/ l3 ^; o3 d
2
* ?9 I! ^1 ?" n/ w7 }# v 3" e3 t' N2 S/ w9 X% ?% z; M8 b
4" W! |& R! g9 F' k
5
3 ~6 F L0 g2 ?$ N* o 6/ s" ^% w- p% p. w$ T
7
# b/ f3 z5 t9 w- j 8
1 s1 ~1 P0 e) a 9, @: O+ q, c8 v$ j2 d2 g9 I
10
# [; P9 ` f, R/ u9 n8 `! z 11
4 _; M1 i3 A* [! j 12
' D0 Q9 K' V; e9 g* H" q 131 M1 V% r5 l; G4 A3 G) j
14
) x9 f2 ^( [$ f- D* @7 u, S 15% p3 }: e7 B+ M( u( z
| class a {8 o" B( f! G7 M+ ]; J. ]% X
private static $sfoo = 1 ;7 J; |' M+ v3 i9 A
private $ifoo = 2 ;
1 N: K' Z8 b5 X/ B% L/ ]; D, L }: p, ~% K( ~2 A4 Q3 j: Y
$cl1 = static function() {
0 z& r- q8 a- N" p return a :: $sfoo ;3 J1 o" W( s, B1 c) h& a# g
};4 o+ U& X6 U0 y8 Z, C
$cl2 = function() {
' v. ~# K; ?/ `9 ~ return $this -> ifoo ;$ K6 l9 D) Y# e. q8 D( w' A
};
' E! t5 i2 q3 j9 Y
4 j6 Z0 ~7 t' { $bcl1 = closure :: bind ( $cl1 , null , 'a' );
! U3 O1 [% `9 w. {: Y3 |1 b B- O $bcl2 = closure :: bind ( $cl2 , new a (), 'a' );/ C" r1 z/ U9 Z1 F3 E5 _% L
echo $bcl1 (), "\n" ;2 M/ \4 g- P- @8 |, o8 e
echo $bcl2 (), "\n" ;' T) a+ f# Z K( [0 g5 M
6 P6 r' s: n( ?) ~" @, B
| 更多网络编程信息请查看: 网络编程 |