这篇文章主要介绍了php中预定义的6种接口介绍,本文讲解了traversable、iterator、iteratoraggregate、arrayaccess、serializable、closure,需要的朋友可以参考下
* N: Z8 {6 @; D- e php预定义了6个接口介绍如下:* S7 u' ~) M# B: Q- T6 x8 B
1.traversable遍历接口1 t+ Z" }) X2 l# V2 N) x
呵呵!其实它不是一个在php中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。# i( o6 i# b; Y
?
3 E, E p% Y& X6 i 14 j+ ^# N: s- ]8 ^( q# @4 K
29 n J- c0 N8 s9 c! t! {. z4 |" j7 m& C" I
35 _& [# t( o# b* N, h, N$ j
| if($class instanceof traversable) {
* ~" q% S" P3 e4 r" o //foreach
$ X4 R/ @6 D3 g& B4 ] }! b4 v5 Z- `' y& \3 h
# M) w# u, e3 u* c/ a | 2.iterator迭代器接口
& Y0 z' L+ N y, K0 o 接口摘要:6 m! m$ h- p' I
?7 S8 L5 i% R( f9 p' l8 o
1
2 U Q/ R+ y& r! }& _ 2
8 p8 M" i3 F1 {) K. D; e; B0 p! m 3
& F4 {& B5 w3 T+ y7 f* U 4
0 m A0 l% d O+ `8 @2 O9 @ 5
- q/ u2 u$ Q2 Q8 W/ d 6
j& r8 A2 b: m! Y 7
9 U0 \2 R( ]: ]9 H 86 Z1 t. }) Y# i0 g2 F1 M
9. ~6 @4 O# V8 [# |
109 b0 T7 u$ z& x6 I+ W6 p
11
7 J- W, I& l9 s( H 12* [3 W6 L1 ]6 E. `2 _" O
13
& x% b& B0 b$ j" w( k' | | iterator extends traversable
/ H' i' f( ?0 q* S0 N {' {; A9 _/ R0 M; ?, ?% v
//返回当前索引游标指向的元素
2 l- q/ W/ i( P" _ B& b" a" z, F abstract public mixed current(void)
4 ^6 E: j1 o5 q% Q& R //返回当前索引游标指向的元素的键名
' t1 R$ z" H. A: M abstract public scalar key(void)& Z* D" G/ ]5 ?8 v1 n! a) Q* I
//移动当前索引游标指向下一元素' w' M8 r1 \* ?
abstract public void next(void)7 A. o L: \; |6 Y7 C6 |
//重置索引游标的指向第一个元素2 j; ?1 X, h! F s% J! H
abstract public void rewind(void)
9 H! {) X# W& T //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用
- @" L3 f( A: L! s. _ abstract public boolean valid(void), U2 a; u! e9 B, A; ^
}4 L; k# W: t3 C k+ t% E
/ T/ ]1 k. N4 W7 x2 _ | 以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:
0 [* ~$ A$ P# a+ ~6 B ?9 i% F+ u$ |+ ^' [2 x0 P
1% ?" q p# P0 H) M2 o* i- k
2
2 [& P9 z2 b; V 3* X/ J' X( u7 r. h- @
4; A' C' `$ S! m4 W
5
7 Z) i6 M7 _' B5 I& e 6
/ c. i# w5 O1 a6 @6 k/ D 79 ~' L# c; _1 T0 _' _1 u) c. t
8" I) J5 R; \) U1 x( d* i% J/ }
9
+ a% |5 k" e$ E# S 10. P1 g" t+ S9 _" ]9 ?7 L
11" S2 v/ X3 }5 v0 t
12! [- W5 G3 j H1 j
13
3 p" f- o& o; r8 t6 U ~0 H8 k 143 r* F* N+ D+ D, H3 k5 |
15
8 X1 o |+ s. S4 f1 K1 n 167 ?$ _8 Y- W& `0 w+ {) v- i
17! W( u! J3 P: C D9 W& s, K
180 n5 _" R. L- Z$ d: [
192 F# i0 b2 M' ]6 T: B
204 J* i5 x" r" D6 B
213 e- x0 D0 P; {( O5 o3 b$ @2 F
22) r0 K `1 p5 g+ O: x
23
( ]" p" S3 r* E 242 m5 H3 L: b. v1 W5 t) [
25
9 h/ O- L: G, J$ _1 H+ Z 265 r5 W' z; C8 @* A' J
27% Q/ }% i% r; Y& h% V* K
28
0 B2 o" N g2 w8 w 298 F4 w0 q% }# m, h' _- M, t: Y
30& G k* R {- ~* x
31
" L2 e" X7 J7 X( p 329 s9 ~% H X: z: z4 u
33, u1 y0 v, p4 T/ K% o# H& f, u
34
* A t4 `2 Z K6 Q# p 35# i1 b' p1 f, Q3 Q
36
; c; c. A% d6 q 37, y* `& u, n+ |8 v
38
* e% U5 T' k6 W3 \ 390 m- d [1 N) |+ D) L, Z- d5 d( c3 L. V
40
+ A0 B; b* {7 f: ? 41
) F7 Z. c* n4 k: a$ `$ i 42% m* Z3 q: f3 [6 i" c) ~& t
437 o+ v' [( I! q; c# i- {9 O5 |
44
+ f/ N( e; ^/ | | class myiterator implements iterator {
! J# R' K( G% {! j+ i private $position = 0 ;' ^& }) ?# D, |8 q$ Z) i) |6 I
private $array = array(4 `; r' |, m0 T+ M( K, w& |+ M
"firstelement" ,
) C' [/ E* c# I6 w* T B "secondelement" ,
: P- t' _2 `% s3 [$ S( V6 m% W "lastelement" ,
o& t2 G, d2 u );1 k! K' S5 T$ d3 R) y# i4 I3 g
2 ^$ f5 B) X- z% _9 I- D public function __construct () {, P# p+ l- `4 k3 v" g
$this -> position = 0 ;
. J$ I4 P- Y0 `4 W( } }- R, V0 k1 c$ ?9 q- C% G
7 C! [. c2 Q& j2 s8 i
function rewind () {! O6 ~8 u8 c* e! k
var_dump ( __method__ );
5 c: }2 a# s% C( t6 l $this -> position = 0 ;& T8 B& |, v& b
}$ F5 j' a. l4 e, O- b9 i! r
0 m% }0 D$ `4 a
function current () {- M7 P: p( b* X+ J2 L! v
var_dump ( __method__ );
$ s! L7 K+ ]) w( ] return $this -> array [ $this -> position ];
6 K% U8 [* N7 r: N# @ }3 m' M9 k ~9 V1 {
. {2 R: }. m2 G$ ~/ ~) l" q
function key () {
7 c3 |2 `* ~5 N var_dump ( __method__ );
0 K* d4 q. \0 b) y, L g( `& \ return $this -> position ;
% d$ [, m1 q! Q! Q) g }1 y: i) u$ E9 |2 c9 y4 ^6 B7 ~
( }4 r8 J$ R( c- A, x1 z5 R
function next () {9 F2 x. g! C1 J2 E) Y( [6 [2 _
var_dump ( __method__ );
5 V$ T3 u$ |0 I# O# F ++ $this -> position ;% N+ `- t9 R" c% k& g- S. B# a9 ?
}
6 v" U% z- k* j. R
5 [/ B: k. T# h+ k3 Y6 i4 \* H function valid () {
% ]- |8 A) L6 p- b" M var_dump ( __method__ );
! q* L1 u* s) K9 n1 E return isset( $this -> array [ $this -> position ]);
$ W" y/ K+ Y9 b- u4 a6 ^. h1 g% p x- w$ H }
; f2 L/ }* |, k; x$ B, I }
9 D0 W) _- y+ a
1 Y Q7 a" r0 p1 S $it = new myiterator ;
4 ]. f. e) ?: j& d, [3 L- w - t4 `7 `- \- d* f+ U. }; \
foreach( $it as $key => $value ) {. z3 j! G; g+ @% I/ H* e" k/ \" _6 ?
var_dump ( $key , $value );2 T$ `1 b9 c5 }9 b2 v
echo "\n" ;
: {2 S9 v! ]' M( U& w& Z q, M }
5 E5 V+ a+ d4 e
/ j3 c9 q9 D# `8 \ | 3.iteratoraggregate聚合式迭代器接口
6 O! o7 V3 w8 P+ E, z 接口摘要:0 W9 q9 {# V/ }( k- r$ D
?0 h3 N+ y/ ]5 d$ I+ _
1
* G1 Z* z$ d8 p7 q5 ?8 P 2- X& y5 S* z0 [! ]" I) i
3
) t" R9 C# v: v; G* \! z# R# A 4
, A9 ~3 x: A( e1 L+ f: j0 M, }' V; i 5
! T) G/ D! U+ [' B& F | iteratoraggregate extends traversable {
5 K. ^6 i9 K+ _! u
5 x. H7 q5 x; a# J5 {3 j' S% r //获取外部迭代器
+ ~1 L4 B4 p* d. c1 u/ c% d abstract public traversable getiterator ( void )
# s3 R' F w; T# I5 q( B$ G6 x } _0 l4 B$ W0 Y. L8 E Q
0 h# e: g/ Z% x" o1 I
| getiterator是一个iterator或traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。/ K8 y$ s" u0 Z
?
9 j( `5 f+ |9 a% U. } 15 \& B3 ?# u+ \
2
7 F9 n& M6 D" r 3
s. [3 z1 P; V5 y$ a& [) e 4
& H# r1 A) `- H3 {' P 5
1 i; p; x! {9 \+ { E. C7 u1 }2 { 6
1 V( }6 l3 K/ [1 Y, {* n' _ 7 e( k& w& x$ d, {0 Q! |6 q
8
8 K+ P& |* g* S 9
' Z* [, d# G/ [" u 102 x; I$ F5 k. F" i5 y& ?3 r
11
' V1 Z) X+ y8 ]1 h7 t 12- E8 M) `& o; Q- H5 J
13+ m$ `( U; A$ Y2 A4 U
14, k; s) m" P5 |2 D4 e
15% u- }+ B& Z0 v5 q6 e/ t
16
# o3 F$ c, a' n' O' t" E8 Y) y( N 17$ U- Y, ^# f8 L. d
185 h+ c$ g: S$ c
19
. _% y% t* i" W/ D 20
# e* y0 u+ m1 f# q/ y, x 21
/ J \% I$ a0 ]) f- B+ v | class mydata implements iteratoraggregate {
4 m4 C7 R. G7 K8 ~, l) M5 P( D& R public $property1 = "public property one" ;! ~% F7 P$ E5 | r& R
public $property2 = "public property two" ;
! k" b4 i, n' I# E3 q public $property3 = "public property three" ;
$ |& o" o. O& w) U3 E
, w: U5 Q1 x! R' y public function __construct () {& m, K' R( N! u e, c
$this -> property4 = "last property" ;2 b. W: P: O% U3 P
}
& C& C( `. W* {+ Q/ S ! n% H( I i2 ~. o
+ W8 T, t6 o+ F$ z8 J
public function getiterator () {
. ^8 |7 r! w. ~5 d+ i0 e9 T return new arrayiterator ( $this );
% D, _9 j! W- [( i8 v: y }
4 b e. Y3 L+ m0 { }9 l6 e$ T! R2 v% H; h. h$ B( V
( P1 D6 i& P3 f# J( Q( {) k3 h; J $obj = new mydata ;2 Q" G: A! M+ {1 c! T( a
+ L2 s% _4 u2 } j+ a/ n
foreach( $obj as $key => $value ) {
3 M* G* P1 g8 g1 k3 J var_dump ( $key , $value );# b4 R9 B3 K8 U2 m+ q
echo "\n" ;
2 B0 g6 X w% ^ }' r+ z5 P! \4 @+ s) s- J
: w! g9 P B v( a/ a | 4.arrayaccess数组式访问接口: m' {; t( h+ ?- e4 }2 s7 o
接口摘要:
' G% x( ~* f" ^3 T7 G! [ ?
( v' p$ z4 j: ?' y. }1 G 1% `, |$ ^: v# j. \
2; V: z; t2 ~ |% a3 u
30 _- \7 T- t2 f
4
' L9 g4 n$ Z* n' i* K 56 D. @8 `4 y b& |
6
* m8 v; g( X) _# O) k& A 7' K" j/ k& M* }) U+ L
| arrayaccess {2 o/ w: R) S2 Q$ A
/* 方法 */
7 e- s# U+ @, _: C& E7 i$ f abstract public boolean offsetexists ( mixed $offset ) //检查偏移位置是否存在
' r/ z$ g4 j# v6 }2 a$ Z3 J abstract public mixed offsetget ( mixed $offset ) //获取一个偏移位置的值/ ~0 h7 P3 g$ l! L2 e* c, |
abstract public void offsetset ( mixed $offset , mixed $value ) //设置一个偏移位置的值
3 r) r' e$ Y" r abstract public void offsetunset ( mixed $offset ) //复位一个偏移位置的值8 `- f0 M3 v5 ~+ e& u
}/ u- S) ?9 g9 Y$ [
: H+ W1 W: l( g4 F | 如下可像访问数组一样访问对象:
6 F7 w4 G+ Y/ J: }# a* G) K ?/ i8 Z# A/ F( ?7 W5 @5 f2 H8 w
19 i! `9 I0 t* _& d3 Z ~. d
29 }0 T+ @5 f% `- W4 ?6 H% J8 s) X
3
1 F: t1 b9 `; M3 K0 [ 4
! R r1 R) a& Z/ y0 Y 5. q. P; j' K; b& N, N$ Y0 u
6* a" T s" e U0 T6 V V; F
70 h. d$ C. z3 M+ l" o; F
8- D! C9 v7 M: U6 B
9
% G4 ~: }* g/ C$ u. f 101 c6 R; c( Z: E
11
: d0 A; m- g1 j2 }1 J! R) y8 _+ ~ 12; L& l" u- n! U
13
3 Q8 J, v7 s |: c H- u 14
$ h: |2 n& w0 z 15" _+ s" H W3 `, c$ _: W
16+ R4 }# d. H& [4 e
17
7 ~! \# ? b; B% D) D/ U7 U } 18; D- s, ]( b/ C2 @! q! W! n, Z
190 l5 \3 W& ~2 ^# a* b U2 o% j; w
20) w4 a- P9 q Q- C2 E
21( K& |9 \ U6 ?
220 G8 e9 Q+ }/ E2 ~6 `0 h
23" c1 ~) r) M& B: z
24
& v1 s, w# }* {+ K6 j/ u 25
# f7 _% A! j* E! F7 X$ Q& z0 P 267 O( N3 y6 O. ^: R) s8 }0 _
27
! Y1 S- B3 v3 b6 h! B* r* d4 v 283 c* B' N* y# K$ q* p
292 q+ u( z! R$ C
30
/ {. c6 B; w, X$ K 31
/ h) U0 L% r, V1 c 32. Y: W2 @" f" q7 O; ]! D' B
335 m4 N2 e3 S/ g7 f
34: e% f# j8 l0 z- n% o
35
+ Q3 p* H4 I0 c* _ 36- p% J( W& u9 N6 q# r* x" m
378 S ^3 h; b# ?9 b& }. v( {9 l
38
; }! s& v6 X! I% H- n7 Z 39" r( d* W! X( v S' Q4 f% O
| class obj implements arrayaccess {
5 c' i/ M# \0 f2 u% h! h e6 ] private $container = array();6 f. Y4 f0 _0 ?6 c6 n% d; Q
public function __construct () {
6 U8 G( h0 [$ f0 w $this -> container = array(3 R- m, X0 N' N9 M# R
"one" => 1 ,
" T0 m/ b4 Y$ Y D7 y: Q "two" => 2 ,' V" T! T+ ^6 h4 R1 z* k! P
"three" => 3 ,; ^- Z8 M! n- v! T
);
% d+ H& o7 u* ~$ d! C/ Z* U }+ c) ]8 H! m* S0 r/ l- }2 h
public function offsetset ( $offset , $value ) {8 Q$ ^% b8 D9 E( u+ ~: `# `. Y$ e# R
if ( is_null ( $offset )) {
$ Q9 M, ?/ W" Z- @ $this -> container [] = $value ;
* u( U' G- P$ R) } } else {- F! C2 R3 S( Q% Q2 ?8 L
$this -> container [ $offset ] = $value ;
% F& o* T. w7 _6 X9 D. N( d }
" u# `8 Y! |, ?3 ~9 U }1 u8 x" ?0 w( u3 p
public function offsetexists ( $offset ) {' ^7 [" ?2 u$ {' c8 i
return isset( $this -> container [ $offset ]);
3 o# k! }. R3 Y5 E# l# a3 ]' f }
5 }. `( h' Y" u$ U1 D public function offsetunset ( $offset ) {
# t) r$ L( T4 R% |, i @ unset( $this -> container [ $offset ]);
6 W1 ^9 x! |3 q9 N* I% ?+ Q9 w' Q }5 k& v0 z- B& m2 c; [4 e2 _
public function offsetget ( $offset ) {+ }1 M1 `8 D9 G5 h+ |( V
return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;
: Z2 {) n0 ]8 `$ y* w% g9 g }
( b2 ]; l9 Z5 q' ~* | }
, Z( u r$ Y' R5 Z5 X8 g# r2 y
9 ]! {* p5 v8 u0 \/ @ $obj = new obj ;
+ t+ v2 p/ \" b) ~7 f2 `: M9 W
( S7 ]1 ~/ S' R9 P% i# g" M$ [9 W var_dump (isset( $obj [ "two" ]));& ?7 J& G+ U( }3 f' e. y
var_dump ( $obj [ "two" ]);
6 L; E' u7 v: J! ^, M( [1 [8 U unset( $obj [ "two" ]);
; O% f) M: v* D+ U: G2 S; [ var_dump (isset( $obj [ "two" ]));
. y, D( Y! Q- |& { $obj [ "two" ] = "a value" ;" b0 B; s+ X# G3 Z/ p" \- q$ M
var_dump ( $obj [ "two" ]);
. n$ M- g" c4 j2 _2 K$ y $obj [] = 'append 1' ;
% [0 M6 e) F7 h- t% H# D $obj [] = 'append 2' ;
) p2 V% O) u) u* ] $obj [] = 'append 3' ;. T2 N/ L3 W7 p! f, p7 ~8 {
print_r ( $obj );
' N: e2 O0 j2 r6 y ! [/ Z' m6 z# u) J+ w
| 5.serializable序列化接口2 e- ~4 u4 V+ H* D* ~- B4 Z
接口摘要:
3 V: I& A; }1 v0 v, ~3 L) ?0 Q ?
" N1 i/ O! T' b& `, D) x 1
8 M2 x1 N5 h% @' i, L- s8 C 2
8 G; j$ ^* G3 m* B. g9 t 3
" P0 v0 p5 H2 R2 w9 a' E 42 W) z- m6 \7 q$ v! m) ~6 F
5# a- j" m, a- V) E
6
0 C: i. v5 h: s# ]: g; { | serializable {
2 C2 z7 {1 Z7 k# f* Z- b
! B3 L$ V9 k! {2 a! g- L. k: X /* 方法 */ a; k3 ~4 i4 `+ n1 w G
abstract public string serialize ( void ) //对象的字符串表示# n: h2 U8 h9 l) b( Z
abstract public mixed unserialize ( string $serialized ) // 构造对象
% N6 |0 r# f8 x6 w" ?3 `4 Z }0 T6 Y5 J5 T8 B1 e1 @, C
6 n T( Z/ o. m. i
| 实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。
$ q) g/ y7 C9 t8 Q. i# {8 z2 A ?
( |) O$ ~1 W$ a z; r 1
% E' d) h2 I0 Q, Y E. { 2
; @5 G6 h- e3 Y6 e 32 S) @& U; b. K8 n
4' k# h7 p2 z9 Y1 s1 j* g9 \
5
% r {% f! r* l/ I. S5 g 6; [, o. S/ x0 X0 F
7& ]9 T& i* r4 T. M9 t
8! w$ A9 ~1 r0 }
9
3 I& ^3 ~5 W$ ^) c" r% H% i4 @5 F 10
8 G& Z' `. D3 W( |; \ 11
6 S2 B6 _+ X R! t7 g2 d/ x8 k8 q 12& O7 e) \ b! b: [ C
139 J8 v Z4 o! [( w+ a
14
" j4 q+ j( h. E) O 15
9 D6 |& K! p8 l- R5 U 16. ^( |' O2 S( D L. u! `
171 R" e/ Y2 F+ V" ?" d
182 A- m. e$ S" l0 S s* v F9 l
19
5 O+ C9 V3 i+ J2 q0 _4 r) b 205 K: {) F7 @4 |6 c7 Q
21
* `% C, {0 F; d- A0 U; F | class obj implements serializable {3 o3 R6 d! g; u( o4 U4 u" b( U
private $data ;
* r8 b4 F* A) @8 K public function __construct () {
' b4 \( D5 E+ F $this -> data = "my private data" ;' v3 I- f' q7 X7 ]4 _# Y
}3 G m9 ~# _/ x' w
public function serialize () {
0 ~! `2 n# X6 Y* l% ?+ y2 m$ i& Q9 d return serialize ( $this -> data );( t9 m+ W w5 e# L- ~$ x% b
}
! z" _' L K! Z( {/ c' n% x public function unserialize ( $data ) {
7 W0 ^( I4 ]$ f, _7 Z2 I $this -> data = unserialize ( $data );
5 v' R0 y; e) z3 Z( ]. f" I }
- X! k4 S! ]" y+ P2 o& M public function getdata () {% a) ^$ i3 J7 n$ S2 k( S2 h8 l' j
return $this -> data ;0 U) ^ I7 a2 }4 d, s
}3 u# D8 `: M9 `% n
}4 ?: O% @5 r L5 K5 p
: I+ V2 P/ W3 L& ^( ~. F
$obj = new obj ;5 a% \$ a+ s, Q' S' h3 \
$ser = serialize ( $obj );# T& x+ q7 o9 t9 l
print_r($ser);
5 e6 }4 X# u/ i6 g w $newobj = unserialize ( $ser );! o) ^' X& x8 G* i e
print_r($newobj);. s/ k7 T9 e: o) P9 K3 I
: s/ q5 o/ @/ w& M" ]- ? | 6.closure7 k3 w0 S+ v- _; r, a, y/ C7 x6 T9 B
接口摘要: p' b* w: s) ? H- ^" M
?" X- G- W0 Q7 |7 p8 w# u1 H5 K
1
) |( r0 g7 i; w3 u. v* f, ] 2
/ U5 u6 c* V. ^* C8 Y 3! b& R! W' T/ m, W) j" {
4: d' R3 v7 b2 [
5
N9 Y2 j' Z9 |5 \' u7 Y 6
% Q) g8 H3 x/ c0 q. w; @. d | closure {% b9 g. `% D/ B( F) z* N
/* 方法 */
* P$ {9 | B0 }3 u9 K$ F' r9 a __construct ( void ) //用于禁止实例化的构造函数
3 L- W" {* H6 E+ ]! s( C public static closure bind ( closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。9 t$ U8 |, S; w5 x! P
public closure bindto ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。( \" V0 R; \6 O6 S
}
: L. o4 F/ z7 m& `% ?6 e4 v. T
1 D$ ^( ^/ r: {$ Y: u | ?
, O* s/ C" T! S+ b+ O% Y, |# Q 17 @6 g o+ j; l6 g8 V2 e
2
/ s# A- X2 I( H, W% y h 3
2 {9 T! i! J9 O+ b' P5 m6 [- \2 F 41 g0 w- V8 \$ g0 v8 @
5
1 p/ a# o% g' r+ {. p) a8 k 6
& A9 W0 B2 V# a# g 7 ~$ B- `, f6 i
8
1 j6 i$ H) o" @" N5 J5 l 9
2 x. a4 W. s% W! g 105 r7 C3 Q0 L' q6 s( T: Z
11' r2 F# N6 @# J, v8 |
12
# G, B1 z7 B: z& b1 `1 J 13
/ l1 j/ P3 ?* I+ t# v2 [; \2 V 14
* m; s# }( J! R- s- W2 k 15
4 ?2 J$ V' Z! y | class a {
7 v; x8 j* p) k* M0 a, `- O private static $sfoo = 1 ;
/ d/ i# \+ ^# b) z: T3 S private $ifoo = 2 ;( s2 z9 _4 A1 O! b
}6 ^4 Q; V* i* x' G! T7 R9 L0 U3 [
$cl1 = static function() {/ ~, S8 ^+ D: f% z
return a :: $sfoo ;. n; z2 R1 R) F! _% M# S
};
" \! T) |1 |( w3 Q6 l $cl2 = function() {9 O) z# k9 I3 Z, t+ }1 |* q3 z
return $this -> ifoo ;
! b, G5 S o9 X5 j };/ H1 [& ?! s' v4 {
; |% e1 W8 L8 r $bcl1 = closure :: bind ( $cl1 , null , 'a' );
+ U% u( `: T, }, D $bcl2 = closure :: bind ( $cl2 , new a (), 'a' );
7 U( c- M' h7 U echo $bcl1 (), "\n" ;/ U4 s* b% k6 W
echo $bcl2 (), "\n" ;$ B- U1 b# b" |0 d, ~3 ]* _
; w4 Q& Q/ L- B2 i
| 更多网络编程信息请查看: 网络编程 |