1.命名空间的作用:3 [- o* h* Z% p' c
' \4 G$ X6 F; x; e) w在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:( X2 @ h2 O" `, W+ {1 |! J
( V9 r" d( M# q, [1 m% s
z! k" z& u6 V2 s
: F9 {3 x9 ?- ?
我们来详细的讲解一下PHP中的命名空间:
/ G2 j4 h0 b) |) s, e
. ]; X$ d0 j8 C+ C语法:namespac_e 空间名\空间名;* t3 L# {4 E7 _, B
M9 m, M7 `6 F/ s, o# {" Y5 I说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:; v! O9 v: q7 t8 O/ `# p% `5 I" V
l$ _2 @' ~# J3 i9 `) D- `4 i6 ?
----------------------------------------------------------------------------
6 e5 i) f7 b5 O- _; ]9 k% X6 t. x: d+ E; Z' {0 n; C( U$ y/ n
<php
3 E( i; E b- O2 z. ~1 s
$ |2 I, e; j3 Y. N. R* tnamespoc_e AA;, P5 g5 A) U" E
functio_n showInfo(){
% k8 x- {) ^: p6 @ echo __METHOD__,'<br/>';
/ O2 l/ E1 R5 h% c7 J: ^# k5 A}; r9 G* f1 l6 Z& d) `2 l: L
showinfo();, L" |! P m& ?5 `
4 L" `1 t6 J7 s3 t6 I- R4 hnamespoc_e AA\BB;
( l0 O$ g# J6 m& b* C _1 g
5 `; ]. T2 w& t e$ |2 }functio_n showInfo(){
' ^$ J: \0 Q; D) H' z: w+ w ~ echo __METHOD__,'<br/>';
t) V8 M4 g5 C8 O/ V}
: D1 I9 m: n( L& a. }2 ^//showInfo();
+ M; D' f% u4 @" B0 H0 s----------------------------------------------------------------------------
! a/ G9 y* a; D5 ]3 P' R2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
6 H8 f; X a9 Y, x% ?, e! j2 l8 k9 L# S0 ?8 l. T2 r
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 F+ n V5 q5 _; m% T
$ T% ^8 a( V& C0 ~ s----------------------------------------------------------------------------0 }3 U8 X4 f, K; [1 X! O
/ \# k2 c0 b; A U
<php5 L- R: l" }9 L# y% c7 Y% [& \' {
namespoc_e AA\BB;
# G' F6 Z3 F1 \0 S i4 [2 T4 Xfunctio_n showInfo(){( x7 ~' d" o4 O# C; I% s! t
echo __METHOD__,'<br/>';; C- ~% e* Z" ]. ~; L
}+ J( B/ L5 }, j; E
namespoc_e CC;$ I2 v, E+ d4 k( }7 e! a
functio_n showInfo(){
' X k1 P; U$ A% j8 k& D echo __METHOD__,'<br/>';
4 u4 s( {: Y( p* F}* n, F: t% L) W# t+ I. P9 c
namespoc_e AA;# l+ P) B7 S) s
functio_n showInfo(){
0 A6 ]' D0 ]8 s7 Z: n& ~) q echo __METHOD__,'<br/>';' I2 i- g& f/ e9 I7 R& _
}
6 I6 Z6 B; o( R//非限定访问:用于访问当前空间中的成员
}* B. d( Z( V4 T. A3 t( L: pshowInfo();
. v7 o8 _+ o2 u( ~% D+ e' J//限定访问:只能访问当前所在的空间的子空间中的成员* Z3 }/ ^$ r3 h6 d. W
BB\showInfo();
2 g) B+ x; M6 G; u//完全限定:可以访问其它所有的空间的成员
6 g: G+ K3 k3 D5 l4 \* R5 n\CC\showInfo();0 d* u0 r+ z0 l) a+ F9 C
↑根空间标识符! N3 `. O2 K: S
----------------------------------------------------------------------------
* y/ Y* j" C( `但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
& E8 Z% }+ t3 K# ^1 p
7 C. C0 I" _2 @8 u# M当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 S4 f1 E) m4 h& F! }6 H
5 P6 p' P7 ?$ P: o/ t5 i代码示例如下:- [: i6 F* s# w% T7 G( ~" v
`! T0 }$ T5 b( d2 ]6 J! I----------------------------------------------------------------------------
/ D5 w7 I# U! _, R& Y t
/ V% J' ?# S3 Y' q6 f
0 h0 [" v3 g, U" J b* C8 I' |04inc.php9 l9 e8 H9 `% Q: _9 r7 J
<php
9 X; I# l% O4 R; _* @& ? d9 S6 O6 h1 h0 ?9 w" p
namespoc_e Core;
; H) [) r+ j9 R5 ~, J2 j$ Vinclude '05ou.php'; |& y+ a+ b! H4 _9 _
new \AdminController();6 f: `5 p: O$ m0 e! U
showInfo();
u% p0 @( h! g0 `, S" K. g
; z% }% l% E2 m+ F3 Mecho P;
. n3 o8 O' r" U* U$ g q1 e/ G//根空间中的成员,只要类的访问必须加‘/’
: b8 w) l* ?1 P' G' b----------------------------------------------------------------------------* i7 }0 y& x, o; ^1 K% g
2 @6 i. U; b3 n- e" f7 s' Y1 B05ou.php
9 ]1 ?' Q! E0 ^$ X: l1 g3 v4 p<php% L% `9 Q& g0 C. w$ n. } _$ {
const P=5;
; j0 F) h i% u [- y ~
* b8 \9 n7 p% U7 E$ ifunctio_n showinfo(){
' L: ?4 C" H: \1 R1 B echo __METHOD__,'<br/>';: A* X A! v5 P$ r
}
0 O1 d; @, {' x) c* y; u4 `
/ `. y' D+ }! Q/ V* n6 M. N( rclas_s AdminController{7 w1 R2 G- Q$ O5 I& W
public functio_n __construct(){, i# W: w5 J9 R8 ~& @/ _3 [, L' R5 e
echo __METHOD__,'<br/>';
4 ]( d2 d9 I6 [! |# L }
0 K. A5 R8 @% m( Y}% r7 J: K0 g5 L3 Y% v
- `" E! B8 i$ E. \) @" ~, c
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。 d: Q T" K3 @! E. b& e
----------------------------------------------------------------------------
& i9 m" [/ D3 o) [! y9 F04inc.php+ V; n7 L5 }7 U7 m& F& ^( ]* }
<php9 f' u G. M. B) |6 F
" U) ?; D6 d0 J2 {. [4 d' qnamespoc_e Core;
3 ~* X" h. A ]include '05ou.php';$ K$ ^9 N3 U# @/ @
functio_n showinfo(){6 Y* `5 \# k$ s L7 j4 ?
echo __METHOD__,'<br/>';
3 N7 B6 o) j; z% D% ]}: P% L1 Q" A+ B2 V
, {0 L- [ p# A) s& N1 r
new \Controller\AdminController;
) S% l# L2 G! r8 `! J/ M----------------------------------------------------------------------------+ A N1 H7 C8 n! f" _/ O. T- t
05ou.php% P; k$ w( ~& B+ y! o2 D% l
<php5 c$ j9 G" T9 j$ v5 r
namespoc_e Controller;* n& R* a1 ^/ k/ Z
' S s" x. ^5 ~- L
clas_s AdminController{
" Q+ _9 ~# X% G* L1 P public functio_n __construct(){% C( Z) o ^+ ` f% Y: b
echo __METHOD__,'<br/>';
7 P( i! r# W- v( h7 E. y6 R }
/ W4 h, S7 _! I1 [}6 l9 j" P3 T) G6 V J9 _
----------------------------------------------------------------------------
8 g0 j9 `7 g8 E* f3 a3 i3 Q5 b4 I! M& V/ \' z) k+ i
4.引入空间成员: }8 p# C0 M1 T2 {& k
( c6 @$ A) I6 }: V* E1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
2 S- t3 [0 M1 A* G; p. i/ Q1 D* C3 J, G* L( E; O0 C. X0 O
----------------------------------------------------------------------------
/ C# w+ J' E1 V, s# @5 m1 o" C+ j
04inc.php
$ H1 A& o# I7 ]8 O5 T) _# k<php3 \2 C6 J m( U! _' k0 ?
namespoc_e Core;: }: z" b4 y& P
use Admin\Controller as con;
* U; j% w: ?0 c2 [$ T6 A& y1 ]" e9 q! _% x7 Z) k$ z M
include '05ou.php';
2 A! _0 J8 x$ l: ~
4 ~& x1 T* [, t% w% mnew con\AdminController();" q h+ g7 ]5 ~
----------------------------------------------------------------------------- ^. y+ k, N- E
05ou.php
: k+ ?1 F) o+ m1 v<php
: K2 s- W, Z& J# _! T! P! Cnamespoc_e Admin\Controller;/ o3 p5 M# L* n! f5 g. B
$ g3 w0 _- Q0 Y0 y' a
clas_s AdminController{
& y% V& c7 o. O( R# x public functio_n __construct(){
j: R' k+ U; H; q echo __METHOD__,'<br/>';
% I; ^$ g( D& K" f4 X0 y }; I q& r/ P" C) D2 R5 a; S' K
}: B9 |5 O7 b% i& ^& L4 G' I* S/ l
----------------------------------------------------------------------------
& I T+ A1 O/ [: F. r! x) e2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。, ^: M! Z; Z2 O2 ?7 g4 T
. b$ }0 h# e' M+ f$ {
----------------------------------------------------------------------------* R" Q1 V% r P6 k m* C( x
+ |& ~4 K4 k+ b
04inc.php
4 t+ E. j: S8 j9 H" }8 }9 r; r<php" `) S: c) E& Q; h9 H# f& r c! V
//引入空间成员类
6 U1 {: x' Z) i
6 [( H0 ^( v8 E) \namespoc_e Core;
8 S; c# k# I' \* p8 `% F2 }use Admin\Controller\AdminController;
8 b" |2 i1 y4 [0 @include '05ou.php';
3 T- `# w4 u$ d) [) w6 ~' b+ {3 \. P) ?+ z, J+ B
new AdminController();; p# X `! X8 \& M
----------------------------------------------------------------------------! t0 \3 F' b. H3 X
05ou.php
4 l+ D+ R$ J- `! [2 Y: ~ e<php
* Q6 T6 e9 Q6 B/ V% L& X, U2 qnamespoc_e Admin\Controller;: x' |2 s" P4 K" K6 ]
" J! b2 A3 Y. Q: v
clas_s AdminController{: I' x1 s) q J* }: }4 |$ ?
public functio_n __construct(){
0 P2 j( w- p# U1 F- E8 e$ f5 r" } echo __METHOD__,'<br/>';, t8 I- R1 M, L
}
" `7 E# O; g9 }' D M}
F4 G4 q6 l7 H) E' l) A----------------------------------------------------------------------------( c% L% b V/ E' v( Z6 x! D
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。5 _ P6 U" \$ s0 Y8 Q
Y' ]! d7 U3 ?3 S6 E) J( V
# t8 R$ {! {6 X6 M! F; k7 U5 w这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。( \" T: C: X9 K2 R1 J4 X
$ F8 ^8 Y8 O8 c: m# i: Q' _( o4 ^: \' G
: ~& T7 w8 m, N7 ?
$ w; H& |/ g( V# p+ Y
: V. N5 |3 ?) r7 h- |, h) ^/ D6 f
1 h( B; m* Z! c! c- B2 ?1 ]/ r# Q' h0 o; S
|