这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下8 @- a* {; y/ @% f( c
php预定义了6个接口介绍如下:
1 [ ]% }; Y" v/ O4 G 1.traversable遍历接口9 K- Q* n& S# c
呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。3 K2 f; T U" i: H' T
?' c7 s- l! u5 z( ~; n
1
/ e, b; z0 ]+ }; R# L2 r% B 2, r2 Q. V* l* _
3
) D% [0 F G3 Z. r5 k | if($class instanceof traversable) {8 E! p5 y( n& O( L4 g9 [/ y
//foreach
1 W% q, E# Q( n6 E, I) v5 i }, ?! M% B: ^1 W+ {4 U8 n; w/ r
/ V! v2 w& n" U V! i' h
| 2.iterator迭代器接口' q X" H% d3 y/ g3 V. j8 W1 ^6 n |
接口摘要:
8 Q7 r- e6 l, h2 L" T ?
% X$ }" P* F4 B" H+ {# k 16 `5 q( u: e( i3 N2 q* x
2
4 `7 j% C% D- Y: N$ f 34 F7 ^' J% j5 `! x& r) b) l$ b
4
) F/ m( v0 [9 B# v6 s 5: S# u2 A8 w* `& t
67 O1 E5 H1 s. x# p, I9 L0 ?" v
7$ s7 G# g. W4 q+ j* ~0 j# J+ m* [; {
80 A3 M# x$ d* j; k$ u% r
9
; A6 I9 x6 x. \$ D/ p! \ 10
; m+ z' `5 L% l# P6 s% q 11
l ?) `# U U/ z, a* ` 12* m' G) m0 E2 c" P% `
134 G- w8 A( t' _1 k+ z# x; d
| iterator extends traversable6 l0 E3 x3 _/ L6 `% T! v
{& X1 O2 ^1 V! \6 b3 _3 p4 v, R
//返回当前索引游标指向的元素& q( h3 M0 S) K- _* r5 N% s* S
abstract public mixed current(void)5 B3 S8 k8 ~' t, d& U
//返回当前索引游标指向的元素的键名
! Q0 |0 E$ n6 F: [$ I0 P abstract public scalar key(void)) Q1 h8 T0 K- a0 h& e( |
//移动当前索引游标指向下一元素& H. S3 r! q+ W5 n9 F4 @
abstract public void next(void)
8 {6 o& n# }+ L& c //重置索引游标的指向第一个元素
2 s) o2 r+ k8 |) E1 {$ E abstract public void rewind(void)
5 T8 @/ k; w1 z" n: S/ j8 G //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用" e& I1 l& R! ~" z' Y+ P1 a0 M# r
abstract public boolean valid(void)
8 C' A( u2 @2 K7 Y" T/ w }
" |. `$ M8 M5 v# u t 2 O1 X4 |4 l9 u- R
| 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:. C: P+ D7 c: @8 H. @
?; Z6 j/ r% Z2 Y4 z/ T2 t Q4 j
16 o% y/ _# p4 ~
2, b8 K) B7 q! t. X; |
3
) ?/ }; R5 ?5 _3 b6 g) d5 F; q* v 4
: r. Y. B" I- m2 u/ t 5
, j6 E4 y3 Q' G# Z 6
: w: W) h, y: u: F. }5 X 7
. t7 p% T: i' a* l$ i: O! K 8/ H% L) |" @5 t) J& p7 R2 X
9) D, h" g! l9 _- C1 B$ H1 `4 f
10
" e/ e. U {7 ?1 M, o! A1 R' t 111 g/ O; {, N, c. X! q3 ~ V7 E
12! Z: V m- h1 Q* [" l
13
0 \* l: x. i! w$ ~5 C( p 144 c6 H. L6 _: {( f" b
15
4 k1 p3 ]% I6 t 161 r; n+ G# K% G& p% {4 h: R5 R( ?
17
3 W* U; c4 j! `9 F. i+ N- Q 18
$ Y- w! Q2 q) J$ C. ]+ A 194 f5 W( a, b: V* C/ D( G8 O
20
! ]5 o6 X9 E5 q, F( u 215 }7 z+ H4 j7 B% S! q# M8 \ F) u
22
/ P. v O k+ A 23
! B( H8 H% w" v, I, X 24# { j5 V A/ h* n; z: s
25
* |' _# F D3 \$ D6 d( H3 q 26# t, U/ l6 j0 A% P
27
7 }) O5 ?3 n$ D3 p 289 S: c! }' T0 C- i" v+ ?+ _- q: I
29
5 Q1 i; \ j2 u$ `: u0 J- Q1 p1 f 30
; A# |6 j5 I& u3 e9 Y, S 31
; [0 G _6 ~- t. W M# g; k }* [; q8 ] 32' R7 S0 \+ O) C( x
33
/ C6 z. N9 W d) Z" U 34% m0 r/ H6 \$ C3 c+ X' {* g$ S! {
35
" j* t$ d! D8 R& B" s1 ~7 \. j 36
. @/ X6 ]. t, r" I) c 37. K u' I' m7 A: y' Z. r& K
38- a; _2 B& p$ p2 P
39: |8 K3 q9 q; q6 t" Q5 [
40, o& ^! N" U2 Y8 \5 F8 D' s4 }: f
41
! R( n& b+ J6 H. \ 42
- O# l# H3 l9 E4 J 435 H0 {( a b5 W4 L" {0 Z
44
+ g3 `7 i J% Y! t0 D8 L | class myiterator implements iterator {
; {+ Z7 ]4 N- W private $position = 0 ;
8 _. O8 s) U. I3 t# w7 I' I private $array = array(
2 ~+ T" E1 X' K" s' R% A "firstelement" ,
m/ c4 E% k! p "secondelement" ,
% V6 b' C; e# J5 g7 y& ~ "lastelement" ,1 R* U+ |/ e8 p
);
- t/ D, q- C' V " ]/ f4 t# a. k$ M) i
public function __construct () {
2 l% r$ u H' R6 m2 i/ b* _* Q, P0 n $this -> position = 0 ;
y1 d' J( m S& o% i, x; H }! E2 ] @4 E2 O8 ?+ O0 l J
- t4 X+ e3 ~% ?- n+ ^7 W
function rewind () {
" p' L, n+ Y, N, u( s3 n var_dump ( __method__ );
% [9 i3 F. a' S& T $this -> position = 0 ;& q8 J* V' y* ] N' E$ C: Y7 I8 e+ V
}. v" ~* d' E, A+ n& N
7 t$ `7 ]2 V" ?9 i7 o function current () {
# h6 i6 i2 M4 n; K' p8 @ var_dump ( __method__ );
8 m* m: x& ^& c k return $this -> array [ $this -> position ];3 F) Q' N, d# e+ d X
}
7 r! ?8 P2 t9 `0 B- I) K # k, u B5 e1 X0 ^- [% C/ v' J' C
function key () {- K/ E1 ]& J/ V) c
var_dump ( __method__ );
/ |+ h6 T. n. R( ~3 T/ J/ g return $this -> position ;
8 @& ?4 D" _* y0 o2 u7 G }
6 m% s( z+ r5 n4 f
3 J7 B: R p5 x! ?1 J function next () {
( L9 D+ {$ h! Q var_dump ( __method__ );
; \; `7 x0 D6 n ++ $this -> position ;
* r3 R/ \4 p) Y. d9 S( R }3 C; H" t0 E# |0 C- p8 s |6 `
2 p( D& ^8 s4 v8 }. s' g( B- ]1 D1 U function valid () {
0 ]5 c! d% a$ s! v4 `( S, S var_dump ( __method__ );
$ t$ A( [0 b6 W. | return isset( $this -> array [ $this -> position ]);
3 y0 C; I L+ I }
/ e9 T p0 w" g1 Q }
: G; o8 v: v* j8 [9 L: v) X
: U2 K) s+ L' D& z1 Q7 I8 _ $it = new myiterator ;# S' F% Z; c1 q/ ?
- _0 ~, t' C9 [
foreach( $it as $key => $value ) {
& X2 Z- X" Z( U4 q! p5 t var_dump ( $key , $value );# G8 K. J0 Z7 M9 Z# a" L4 t
echo "\n" ;
/ X$ e5 O0 `2 u) P+ w* ~7 G }
$ b$ Q3 W) l+ O- l 5 ?) o* Q0 e n, a
| 3.iteratoraggregate聚合式迭代器接口
. X. F- N0 u6 c8 x: J; Y 接口摘要:
! _% ]6 H* }# Q! p- }6 e ?
4 p& _$ Q, } B8 @- P9 M. W 1# v% `2 }" C, t. U
28 S0 c( u9 N' A5 v$ u1 d: o
3" D; ?$ a9 H* U$ E
4: _. V7 Z! o; k; S# F
5
8 V2 V, R5 P' n9 Q4 z | iteratoraggregate extends traversable {
: o; r( N' q, u. w# N! n1 L
# C! }# D- ^ O9 @. d2 y" k //获取外部迭代器2 t2 | [5 w. F$ \. }3 u
abstract public traversable getiterator ( void )
. k; I! m( b; m% d }
/ |& @) p) D- `; r8 Y/ Y7 Z & s" T1 K, c( H: i
| getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。
& `4 u0 w& L* f" a! K' Q# a ?
" K, u! h9 |( H* ]5 d 1
& E9 L4 H+ d3 p7 c+ U. h 2
% q. H# g3 `9 n! u2 b; a6 Z! H 3
4 @) b6 `# _" O+ n: ~8 k. G ? 4
( n8 f# T. W( b: } 5
8 D) w) K) Z7 I1 S `$ R 6
% M( x3 j8 ]$ s/ {; W 7
8 I$ |1 J( ~! N- O( f" B 8& _9 V) E8 { I! y$ T
9
; h- D* u+ J V- w7 f5 ?/ T1 w# [ 10
% w3 B3 A+ y, U" ]* q# F7 O8 a: Q 11
4 c( O1 j9 V1 p5 P4 D 12, b+ d& }. F# h* P' Z2 \
13
$ k$ T1 Z! m7 ` 14
) E, _& v9 M& p 15
% N/ H# Z8 T' {6 E 16( g) q$ J" C) b5 M( Z* }) d' L5 m
17
* {& o4 L* B( j4 N) v 18
/ k3 P7 |4 F* R 19/ d1 y. R1 m( N& h. p, Z# S* N) w
20; o. s; k k2 i/ k( U
21
, x! T0 ]9 a. _- N | class mydata implements iteratoraggregate {
; y4 w5 U2 I# Q) d9 E* A; z public $property1 = "public property one" ;
0 q$ Q0 W" F3 x public $property2 = "public property two" ;# d. V# z% ~* G
public $property3 = "public property three" ;6 Q8 d# u$ Z, v9 r, v, ] ?
% s, ~! K5 L1 v/ H4 P& F' q; O" N
public function __construct () {2 _. K4 q/ \2 v( C- k% o
$this -> property4 = "last property" ;6 b* d7 g! F! C5 _6 S( Q
}
, ]( t" v4 F& X 1 t/ p: \ q1 n: t6 ^
& A* n8 y+ K1 ^4 a
public function getiterator () {6 V6 V1 p+ a7 y) P
return new arrayiterator ( $this );
1 ~+ }. `7 `9 r# s5 b }$ x2 g# @: P- p0 n1 o, |
}
7 l/ n0 X( f( R! X; S , u1 W! s. @; T" b+ Y8 F- A* j
$obj = new mydata ;
3 _" ?% ^) E& b9 I, u; _
: m2 j% U7 S6 D( u foreach( $obj as $key => $value ) {% n& Y8 [% C, i9 ~" y" g: v% H& F
var_dump ( $key , $value );
' L& ?9 [3 Z; u& t# N6 _ echo "\n" ;" s. r% U* S R4 q5 S
}
. Y; e8 I0 a! `0 T! T& t' i' N9 E
2 e+ S7 {/ j- F* E | 4.arrayaccess数组式访问接口( c" r# t. n. v1 g! M
接口摘要:/ C1 F; w9 C9 n( \; u/ C5 a+ D
?
; f) y: s8 G& B# L6 Z 1; ]6 d' u7 Y2 c$ A7 A
2
/ f" B5 C- l; c' I* ? 3
) _" b" M% ?. } 4" t' P+ d- f! v% r: J
5" ?/ {- s( Y/ S' t+ @4 ^) w" f8 V
6- Y5 R/ x$ A* [5 w) w- k
7
- s0 G& @3 ]+ s! U: q5 T$ A | arrayaccess {
5 |* {- f7 C) }6 P /* 方法 */
7 b' a' r: i, U abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在/ x+ i7 q- l) V( D" L
abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值
W5 Z A4 Y2 E) t4 } abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值 G9 F8 _9 [- p" \ g
abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值
; |" n5 B% c, V }5 C; K8 R6 |2 j/ E$ B
3 _$ T" n: K$ d7 W* { x+ J8 ]
| 如下可像访问数组一样访问对象:
9 _5 c# t! ^2 C/ N9 a0 W ?3 V, g* b1 Q( j
1
: F8 w* u$ @) i% c/ K 28 [) M5 W% V: y& s! P
3
; J; g. p' y5 ]) I! a7 a 4' n9 M( ]1 a: |- k. P
5% _3 v4 D1 B8 y% B" L$ k
6, J3 ~7 b, |" F$ U s
7
/ d) N5 k; } s- T M) q 8, p& d* k3 V. |# O+ c
9
& ?. D9 r/ }3 z- A% ^ 10$ b6 P P; Z% m5 A& ]# S0 {+ _* e7 l
11
2 I2 |- S% K7 m6 f$ D6 p/ q 12
# H N0 |( k X* Y6 c 134 H2 a4 d* n; C+ N1 C4 g$ q+ ]
14
( ?6 T/ i0 @5 [" U% M# \ 15) k- m1 X Z1 n3 d2 A
16% Z6 \, d' O0 y3 g; U8 Z
177 g. f1 ]0 _. l/ B
18
$ i+ }4 o8 k; P$ w0 g# I' v* R 19
6 W8 i5 k0 }) Z2 {" v- t, A$ B 20. K+ D6 \- Z5 X4 K
21
1 {! ~( v- z- @ 22
3 \8 \" x9 @( u 23
2 E! d1 |" ]7 l# J& x& d' W6 V 246 z9 F1 X7 i; O7 U3 s
25
- d" j! A: y6 l4 D 26
! r `+ I5 G% b J/ i7 y 27
' w3 z& F+ I) y5 @8 h4 o4 j 281 L6 y* x) K8 i" n
29
9 V# p+ L* ^ g! j! U: ?, f/ x 30
( |9 E# I, k& g8 j 31
" r* ]/ n4 @4 S% ]: f& m 32
. j$ L# q: R3 J: V8 n8 J4 R 33
9 x3 c/ s8 q- z+ a0 Z 34
8 {# ?8 f) j L; B6 ^ 35! b2 O& Q9 I4 L0 h& z! ?
365 y$ s, F3 X5 h* A4 m+ a$ F* i
37
+ l! O( P) e! n* d; P n4 ^* }! r 38: U3 y/ R7 V7 \3 k: S
39
" Q1 m: B' _3 h. Y" a) p | class obj implements arrayaccess {
$ G* c( t# v0 W) ]- d2 X private $container = array();
( c* y+ C/ U) A public function __construct () {
3 l; Y" ]0 r8 V7 C. w6 B6 J# Q/ L $this -> container = array(, m8 S4 w u$ {" V8 o
"one" => 1 ,
* u* k5 p$ e4 p* J9 A% I "two" => 2 ,8 T5 ^8 T& h/ _, X) [+ B
"three" => 3 ,
5 F% C- ]6 f8 u );- e& o4 j* c. x
}3 _4 s. x. ?& D
public function offsetset ( $offset , $value ) {
5 @3 K7 g# q4 Y3 S/ E# m if ( is_null ( $offset )) {
0 Z0 C& l4 b! m, ]4 |5 @ $this -> container [] = $value ;
" f8 z \2 u# j: j/ v. N2 U% P$ r } else {
# P. I" l$ t! t& \" _5 A/ [# W $this -> container [ $offset ] = $value ;
! m$ o+ R: B6 k }
% q: ?$ b$ Q, i+ D, d% J* s7 N, K }
3 | {8 e3 b$ b- @ public function offsetexists ( $offset ) {- `; b" R4 L( A( b$ }1 u
return isset( $this -> container [ $offset ]);+ Z0 X5 d" [$ q. h- @4 F" j) U
}
! `9 A D( ?) [7 [0 h public function offsetunset ( $offset ) {* x% O) X6 o1 h/ D
unset( $this -> container [ $offset ]);
$ z' [; o' \% J! [# N }5 F. @' S! A; Z. b
public function offsetget ( $offset ) {- F7 b9 g7 U7 b
return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;
1 d& ~. a9 k m$ G- h6 B) T2 m. g }
k5 U: Q. o, S( ?, f1 D }
/ B& Y4 n, W- M9 e7 I! ?
% t: t2 Z6 ?6 r+ |9 Z $obj = new obj ;
* D) z N t) ]6 i
& I5 N8 |, `3 G4 [ var_dump (isset( $obj [ "two" ]));
4 W+ T1 j4 o8 i! U# L* P var_dump ( $obj [ "two" ]);2 {; `( O1 {9 n9 x
unset( $obj [ "two" ]);% e- @! @# B: E; ^# s8 ?. }3 Z% R
var_dump (isset( $obj [ "two" ]));
' z# p9 \9 A& ^5 L# S $obj [ "two" ] = "a value" ;7 C- P0 d5 y9 ^& N/ Y
var_dump ( $obj [ "two" ]);
8 y: _9 J, U/ ~- s7 N) h# b. V7 C $obj [] = 'append 1' ;
. Z" Y$ b; L% o8 q" H: I/ s: p $obj [] = 'append 2' ;( ]6 e! t; a9 F C" i9 D y% F+ V
$obj [] = 'append 3' ;: m5 A/ D$ g- m) H: T+ M' o
print_r ( $obj ); `* C0 n: ~# c* Z
; q4 `3 G% {7 y2 N. r- D" y | 5.serializable序列化接口7 }' e& H; {" W) R) m$ o! Y/ v
接口摘要:
$ I5 A G$ d& k& Z' F* c/ ` ?
4 N% P: n* e/ n( y! q$ r 1, G& t: ?# V( l: [
2
9 X2 B' y. A. `3 B% f 3
6 D, t$ h6 {( b! d! ~) A' X( K 4# d( l, _: H* y" F
58 B& G, R/ b# B8 U( E
6& S" v% a5 ?) m, c0 ], c3 i
| serializable {! V9 }2 P& P- F2 ~2 Y6 L; q
& c+ W6 Y, d/ A /* 方法 */
0 w/ }7 k1 @$ K' `) {6 f abstract public string serialize ( void ) //对象的字符串表示
P. j4 S f7 J B abstract public mixed unserialize ( string $serialized ) // 构造对象
, L2 b: j) A4 a% U% g5 ^2 L }
1 g s: O9 r. j( f% v4 H, a 5 a4 G; w7 O( H/ K3 o1 s
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。/ f3 k v$ m% [1 e3 s
?
4 g6 ~9 s% x0 Q& r3 H! i+ { 1- F8 r9 s& I; f: [
2
! K2 y4 K, u w, d 30 n0 c1 s6 \$ p
4
1 D {+ Q% L$ l5 R1 F u 5
6 g4 z# L! o7 C( S 6
2 X/ u' }$ m3 v' E1 m$ t 7
/ }% ]" a# M: ?1 l1 T' I 8
5 L$ m: d1 }1 y; d) s/ l 9
# ~! [2 c" ?; W, V& [3 S4 W9 h 10
! H& S6 d; D# N# z% {, R; I 111 ]+ b! J7 @# C1 J/ j+ Q
12
' j* ^8 v3 M) s 13
3 X: i0 J' H. m 143 q+ c# {4 h( J; a
15
/ G2 q; V5 P; e ~1 z 16
6 T* J4 n3 X$ B: z) z( |( l' | 17/ V& S. M2 Q8 p: ]
185 b% z( T4 v8 M9 s! s+ Y
19$ @! W6 C4 S7 K; j$ h# N
20
4 x8 f8 f$ h: ]5 A/ `$ L1 H( i 21# Q; {0 _5 }6 `4 w5 H, @
| class obj implements serializable {
9 e) |! q! |& g7 i5 D: c5 x private $data ;5 H5 x1 _9 y6 N
public function __construct () {1 F% J. h. K6 z0 F3 a
$this -> data = "my private data" ;
7 s" U7 R P+ @6 H* e b/ S% B" Q }
/ ^+ u3 m' L3 j7 a public function serialize () {
7 N$ ^( ^; h. C3 l0 T return serialize ( $this -> data );
( `1 a0 ^% \4 ]. j# Q3 [6 K# X4 v }
" S: U. B4 Q# j# ^0 ? public function unserialize ( $data ) {
0 E, J/ l _& D/ e $this -> data = unserialize ( $data );* B' u9 n z4 `6 a$ n, M
}
: p; P! A- R7 M$ c- C. f* J/ n public function getdata () {
/ W' B0 a R' L; O. [ return $this -> data ;6 m$ k0 M: B6 a6 l
}
. J: H, n. s7 Z; B- Q2 i5 P }
0 `1 _. c9 {. w7 d9 _ 3 H T* h8 E0 Z6 m' }& h4 T
$obj = new obj ;* X, L. X% _1 l e
$ser = serialize ( $obj );7 m: v# s+ K! l1 _, a
print_r($ser);& y& B' t6 `$ V# x+ B
$newobj = unserialize ( $ser );
" T- l6 A: L# x: b: y6 S3 v print_r($newobj);% |( \9 P: i$ w8 G
+ ]/ d3 B. C) i3 \4 D8 [ | 6.closure
?. _4 [, W! Q: b5 K( g1 a 接口摘要:; C( ] E5 T N% \
?
% `. Q5 N: Y y; o$ |2 h' | 1& P P) u& A, K
2
# L) {/ }" R0 F8 Q 3
% ~9 g3 n- b& I |: s 4
, l5 o# @5 U* x 5 N2 l' l% I$ _: a
6
0 e7 z8 O9 C8 }) Q p3 d0 @' E | closure {
. G; w( d" N% } /* 方法 */2 B6 d) l/ Q7 A7 a; ^: ]
__construct ( void ) //用于禁止实例化的构造函数
% D/ h6 v4 \, u$ k. s4 Q public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。
6 i Z- r% |- t( [: Q* g public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。
8 g! e3 B# Z$ s7 p* g% D1 U }
$ ^# [0 s. j: |3 B! T4 P
8 _6 ?9 m. |5 u. D/ }3 I | ?2 q+ y2 _4 f" b
1. _+ t! p9 _( c4 f9 I5 b
2
% ], y7 d7 r" \/ Q' A 38 z4 x1 ?' v" @
4
: N( s# U, C: [, l" g" b 5
- o9 C8 @ }: e4 L0 i9 D( n% p9 q 6
# O( r% l9 n! v# ~" U4 L( J 76 y+ h D' l: w& X% q
8
+ |, |8 C. l- z- C+ \ 9# N4 B5 n8 m0 c7 c* _$ _; i5 I4 K7 W
107 ]7 H" M3 t5 }& h% E& D2 F
11( T( d$ k, V6 n% A7 o7 \9 `& s: l
12. X. `4 m% n4 \+ D4 ~' {* L
134 [* u+ e! T* L) n6 ~ f
144 D9 C6 H* q* B% p2 X; w
15& p1 ^/ I8 t- j4 _4 f: u! X y
| class a {% A: [( W. A3 S" a( ^: \% Z# U
private static $sfoo = 1 ;
/ X* I v8 N) C, a6 q4 U: y0 L private $ifoo = 2 ;
! T% a& r6 Q9 l$ {& e: d9 y }
; p( d) M3 r5 T j $cl1 = static function() {+ h) U6 N) W" K( D% z( d. O
return a :: $sfoo ;. j7 ?9 {$ v z* r3 N3 `: V, L! N
};% Z" Z5 S4 F4 M& Q2 t0 B6 p: m
$cl2 = function() {/ z$ @0 @$ F' g- B8 V, O
return $this -> ifoo ;
( q1 @& W5 ^) ]( l3 p* F };* r: n5 C+ l1 V( l, a/ x
: y- E& \ {: f4 f! \, y5 y
$bcl1 = closure :: bind ( $cl1 , null , 'a' );3 Y3 I9 x, a0 J: A$ f
$bcl2 = closure :: bind ( $cl2 , new a (), 'a' );
' L# n; o4 k5 I2 J6 s! [/ M echo $bcl1 (), "\n" ;$ r0 y3 U% Y: q+ x; p* v' j
echo $bcl2 (), "\n" ;
, ~, G# m9 y8 ~* k. ~
; Y( j0 i7 S) ?7 x& ~2 ] | 更多网络编程信息请查看: 网络编程 |