关灯
开启左侧

[研究发现] php中预定义的6种接口介绍

[复制链接]
swmozowtfl 发表于 2015-7-28 11:32:32 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
  这篇文章主要介绍了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
            
更多网络编程信息请查看: 网络编程
 

精彩评论9

正序浏览
wwdu926a 发表于 2015-11-7 18:05:32 | 显示全部楼层
 
楼上的话等于没说~~~
 
seazvyt 发表于 2015-11-7 18:05:44 | 显示全部楼层
 
真的 好久都没有这么笑了~ 好开心哦
 
buingeEvineus 发表于 2015-11-7 18:06:02 | 显示全部楼层
 
哈 你逗逗他啊
 
GoodyFouppy 发表于 2015-11-7 18:06:32 | 显示全部楼层
 
我率天兵天将 将你打回原形~~~
 
Acropozelan 发表于 2015-11-7 18:06:53 | 显示全部楼层
 
我是来收集资料滴...
 
seazvyt 发表于 2016-1-15 19:42:14 | 显示全部楼层
 
嘿嘿...没事我才不骂人呢...
 
seazvyt 发表于 2016-1-15 19:42:20 | 显示全部楼层
 
哈哈 我支持你
 
mwxny 发表于 2016-1-15 19:43:19 | 显示全部楼层
 
先踹你一脚再说~~~~~~
 
wwdu926a 发表于 2016-1-15 19:43:41 | 显示全部楼层
 
(⊙o⊙)…好长啊,我虽然回复不了那么多字,但十五字还是有的。
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


0关注

1粉丝

2503帖子

热门图文
热门帖子
排行榜
作者专栏

关注我们:微信订阅号

官方微信

APP下载

全国服务Q Q:

956130084

中国·湖北

Email:956130084@qq.com

Copyright   ©2015-2022  站长技术交流论坛|互联网技术交流平台Powered by©Discuz!技术支持:得知网络  

鄂公网安备 42018502006730号

  ( 鄂ICP备15006301号-5 )