管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
% A8 L2 Z+ M" ]4 Q0 v
* x3 Q# `* R4 k C5 v* q在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
5 U' g, `+ r5 S# h: K5 E4 e3 G# }5 P9 `5 r
; m0 M/ p _* Z
% h1 ~# h4 A S: d我们来详细的讲解一下PHP中的命名空间:2 L! l4 X( P- ~# k
. l+ ] N) |$ r. e0 B语法:namespac_e 空间名\空间名;4 t( V8 i2 C5 C2 n- C, r
# P% J3 A6 g- t* y2 _0 K
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:# O8 }# @* x2 F( f: f1 M
( v3 E: V- |3 { I8 n$ X
----------------------------------------------------------------------------
% X9 y g) u. u9 {* M; i9 X; e
7 W/ d! X0 @& Z5 V% A<php
1 L3 F t$ g1 u0 q0 ~" A4 c
1 m$ U3 t- P: {- _" s# d( d5 Tnamespoc_e AA;. U5 l3 u5 U, Q3 C5 E& U
functio_n showInfo(){
. {! @9 L: l9 T( ] echo __METHOD__,'<br/>';( m% D, U" f1 C- I' y6 B$ \1 S R
}
0 o; G! ?" v: j3 hshowinfo();, n$ H" Y2 }/ u6 J$ E ?0 R
5 K+ C) h# I$ T* nnamespoc_e AA\BB;9 w f( l) X* Z7 R8 t" T! v
; e4 _0 g: T! c9 U
functio_n showInfo(){
8 q, H* ^9 C3 c3 C& S$ l6 ^ echo __METHOD__,'<br/>';3 F4 g7 d, {$ C
}
$ f1 k: r* V! d6 [//showInfo();. H$ k _- c" n$ r1 }
----------------------------------------------------------------------------" g$ U) `9 e+ p; w* B
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' C( @7 M% E& P% l
0 B9 C }4 J( C/ D3 S* J
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 E( g# P& d7 A, [% @
- j+ J+ t P1 A0 {3 S+ _----------------------------------------------------------------------------
. _6 H7 I' t- q+ h! x+ G! I! s: i8 Y9 S _/ ^& X" ^
<php
0 i; @" ], o O& V6 enamespoc_e AA\BB;& C$ X4 G% r4 c* s- r* Y: r
functio_n showInfo(){: u" S% V0 ~2 |5 M$ T
echo __METHOD__,'<br/>';
$ s; O6 i) e; e: j( q! j: v}& r" X: ~* W4 x/ N4 A# Q& @
namespoc_e CC;- |! W4 f8 _9 |" ]$ ^
functio_n showInfo(){
: o0 T7 J1 A$ d4 t6 N8 V3 ~ echo __METHOD__,'<br/>';
$ _! P$ c: w3 E& |1 `}
, c! L+ @5 l8 ]9 o& p- A, {namespoc_e AA;
8 `3 s- B8 W" Y3 N" b- Mfunctio_n showInfo(){
& U2 M' {& L: n echo __METHOD__,'<br/>';
! ]% n- C M( k6 N% P}7 b8 q9 s- K; f: s" V. j# T8 @1 W/ R
//非限定访问:用于访问当前空间中的成员
& S( |- I1 c8 D' VshowInfo();
8 w) ^ w x k//限定访问:只能访问当前所在的空间的子空间中的成员6 U6 I O' o8 j4 M
BB\showInfo(); D! b8 v: ?- `* K- O
//完全限定:可以访问其它所有的空间的成员) h* ]4 D6 U: ^& I3 E, F
\CC\showInfo();0 N" x7 H8 F: Q3 V8 y' _6 ^
↑根空间标识符- K5 F3 u' T9 p4 T
----------------------------------------------------------------------------
' M1 _* M. P5 F8 J但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
) S8 h9 G4 G9 B/ t1 k! X
Q3 v" f5 H6 m4 f3 x当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' }/ K4 M& l4 P: J" H" I7 I
/ R) `4 s/ f/ b' a" G9 i4 q/ y
代码示例如下:
) e1 c. W2 x( Y! E& H; d8 n2 X6 N, N; V S1 V) A- z- S Z$ _
----------------------------------------------------------------------------( O9 @. Q, \6 w# z/ t% t
4 k( f |8 ~# C- u& ~
* x& |; P2 g. a$ X! d( D. a1 }. K04inc.php
. i: }3 U) g( b0 I( Y# V, ~<php9 q* j/ T5 ]8 f9 j% m5 S/ F" h
D) m7 a( _# B, ^7 {8 q
namespoc_e Core;
: y* R( m3 E( j7 r X9 uinclude '05ou.php';) f: a% H& K8 O5 w" d Y
new \AdminController();
5 m8 S% w& G) c9 k$ T% ~0 dshowInfo();# h9 r" e( H, s' k$ a* u! L" [4 v
2 J6 q6 b$ C' z" A4 v* |
echo P;+ n0 L: v& |. n& v( C
//根空间中的成员,只要类的访问必须加‘/’3 j {# y# X3 g+ s3 J% A; E
----------------------------------------------------------------------------
, `! A( o# b- W+ g) Z4 F
0 G/ P4 q# V4 k0 ^. ?$ U& d# i05ou.php* Z; r& b9 y7 K) E& o0 n- i
<php
. \/ N. I. l2 F/ aconst P=5;
" [( t+ I! t) T2 _4 r" H1 q E2 t! H6 b
functio_n showinfo(){
. p! r4 a2 M: i, ]* Z8 s6 U4 U0 } echo __METHOD__,'<br/>';
6 O+ N, w/ l( {; L6 P- A}
9 s' I! I) K' K; ?2 ^* U1 m) R4 e* o# m1 Z9 I# C
clas_s AdminController{
5 M& p$ a' f( I2 {) m3 m, {5 F public functio_n __construct(){& E( E; }! H3 L" r. g$ [
echo __METHOD__,'<br/>';% E3 u: s: W- ~1 {
}' ?' I. P' s; }5 P& b7 p
}, [) F$ k- i. L- z& j
( d. R. {; e8 v' |# ]2 M
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
7 _9 k" v9 x( e7 F8 e C- I----------------------------------------------------------------------------$ O0 l7 k* c, `" ?- ]% b
04inc.php w5 W$ H* b: D2 L+ w3 s1 M3 J) P
<php
' O7 a5 c' `( n: {! ]$ D% c$ }; N4 b2 s
namespoc_e Core;0 H/ r6 L# v( j! I$ u+ a) ~. G
include '05ou.php';
3 c$ q, p/ D! P$ `' \5 qfunctio_n showinfo(){$ A5 H2 [ c. E' B! v, P: {& A4 A
echo __METHOD__,'<br/>';2 P' G' L' b& }0 D# H' o, A3 w
}9 e* z7 j8 w$ |6 h8 W
0 P" A) M% o: c/ b/ ]new \Controller\AdminController;
& h& D5 ~. X) b----------------------------------------------------------------------------6 E5 i; c$ \' y/ C" `6 X
05ou.php' M3 R7 H; V: V9 x' p. V$ ]
<php% A5 F% M/ G- P- Z( H
namespoc_e Controller;" X: b: Y8 _$ x8 I$ u% S
, v' ^5 |0 _' u; }
clas_s AdminController{
* S" L k8 \7 Q1 h public functio_n __construct(){
( [* o6 J1 E' K) A' e echo __METHOD__,'<br/>';
- {& r2 n9 e" {6 E! X }
+ H" E' T5 p- B* x}# H8 ^. n- I1 t b4 k t" ] y1 H
----------------------------------------------------------------------------
# ?& {. h. {( \/ Y2 U7 _. e h: \
) Z5 ^( F$ ^: _% _0 l. N4.引入空间成员:# b, C0 b4 ?/ s9 Z2 f
4 V. v( [, F N: Q- S# T
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
* m5 R9 u' d) T, v5 `3 H& J
4 }7 M& ~ C; T0 Z0 r- A----------------------------------------------------------------------------% R2 [8 R0 m; y; N7 ]
7 ^$ J: z5 x, ]! ]3 a: r% Q04inc.php& `# v, n: G0 W+ v
<php
4 o {7 @7 h% _) Z+ M2 z/ m8 Tnamespoc_e Core;
4 i* t8 N1 n$ ~use Admin\Controller as con;, ~" I' I, z" N) A; m- s
+ _# z9 A9 K( S A$ _
include '05ou.php';
3 ?" t0 t' L- ?5 A+ O% ]' E% b
- K* {+ n8 E4 }/ }9 |) Nnew con\AdminController();
) s5 W" v w& _# e+ F, y. q----------------------------------------------------------------------------/ W5 m$ y+ H$ f0 b) l) l7 e4 F
05ou.php
3 B* | M5 q$ m6 V/ p5 ?# E<php
1 X0 P0 \, J$ Enamespoc_e Admin\Controller;
2 c2 X% t; n6 \& A0 x* c4 M
; b. u* E4 m! O2 n$ V, D: ]clas_s AdminController{
1 K% S$ t( h& M' R, A public functio_n __construct(){
$ K. h0 g2 z0 S/ w echo __METHOD__,'<br/>';5 `8 }, q) V! s8 O( Y0 K4 J0 s
}
1 L5 a1 _! f3 M4 W! x! H) n% E}! I2 K- t; K* w" d1 ^* G
----------------------------------------------------------------------------
# B, f3 w! M6 z# D" T$ F2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。! Z4 v3 J4 S1 e( L2 j' t! t# v
& [) T v: f$ b$ O+ Z! P( N# g
----------------------------------------------------------------------------
1 a. D+ l, T0 F3 e2 I
& v5 j6 {& I3 o3 L/ H: O- l" R04inc.php9 h4 O) |$ v* w8 ~& l! r
<php
& _1 a8 B& F. {2 \) B& R& S//引入空间成员类
. a+ C3 [3 ~& S, `7 N% [( |/ t) \) r" l B5 d! _# B- V* c
namespoc_e Core;
0 \7 G5 R0 U) [4 w7 Kuse Admin\Controller\AdminController;/ m) h/ G- n7 x. t
include '05ou.php';
1 e2 [4 J6 t0 P5 \1 v2 U
+ @% m9 M0 M2 r& x2 f8 ~new AdminController();5 D1 M+ T, x: H+ a+ o2 D3 c. ^5 `
----------------------------------------------------------------------------# o4 ]- \4 H7 \: J+ b( o) N
05ou.php: I9 S8 \$ [. n9 i' u3 y9 u: Z
<php6 F1 g: s( I( u3 Z( s) k4 v
namespoc_e Admin\Controller;- q5 v. ~4 g8 x. p3 W0 ^
2 j# E" }' \$ c: _9 k. z
clas_s AdminController{8 x9 X# J O; c" X/ `6 y* T
public functio_n __construct(){
& X' _( y- a( |' Q! h, w* p0 {8 W echo __METHOD__,'<br/>';# H0 _: f/ ^2 n( S
}
% `+ s+ l: C8 W8 z' ^" _}+ }, h. M) q& Y# ]; R# R( k7 m+ |
----------------------------------------------------------------------------: S6 g# M/ V1 w# B
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
Z9 W, K" H. M5 X r% x3 g, m8 F, |" R# H
: O1 b; E. x9 V
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" z/ M$ I2 _- u2 P3 v B
. `& x$ q2 f D+ u2 J
) E1 [" F f# v+ w
; P5 r8 I& |* @+ x1 `3 }* c
2 z- [& D3 W3 \9 d: x( S9 {% d) |
+ a5 U1 i% ]+ E; ]& W
9 n7 [) j1 _: g8 w |
|