1.命名空间的作用:1 K5 f+ }$ J' u
/ I5 h5 D" ?, D; b' ^7 ^) }1 C5 v' k在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:. B3 S. p& \6 z. g; N
, M. ?; B7 o2 n- v* r
1 ~ Z/ a1 n, E$ R; i
+ G0 ?3 S l/ X( I6 N1 H1 _
我们来详细的讲解一下PHP中的命名空间:
6 W W1 T6 w* h. ?
+ {; K0 }' M: E3 A: b K3 k语法:namespac_e 空间名\空间名;: S9 U8 c1 L, A: ^5 P9 _
. o0 w/ _: E! ]* r
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:! H) L: P* {$ Y- m& Q$ f: z
* k1 R, y0 ]. m+ w) f----------------------------------------------------------------------------* N) r0 c. V( r) |
8 @3 C0 f4 I; u9 S5 b; d# m
<php; J/ V. I9 d9 M/ F ?
0 q, o0 m P7 \' |6 Qnamespoc_e AA;
/ A, \9 y) U4 v0 Rfunctio_n showInfo(){
( _6 H9 Z5 a* i4 A echo __METHOD__,'<br/>';
- C2 ]0 z" ^/ D: u8 K}
2 b5 M# W" F7 ^6 ~showinfo();
9 U" U2 C. z2 Q0 Y2 D6 K5 A3 P" d! r* [; d8 @# X
namespoc_e AA\BB;; o( S; d1 y" b- ]/ V% ]
% v/ g- H! b* f4 y/ ?, w
functio_n showInfo(){
9 R( O4 _3 i. Z) o0 R1 E echo __METHOD__,'<br/>';. x$ j+ F! B3 B* L
}
0 w2 ]8 A4 x. |; X8 x//showInfo();+ p w" P- A0 k8 o( u% ]
----------------------------------------------------------------------------7 {3 D; v+ p9 s' }3 R. A0 K1 W: t
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)4 u! S; t' n" @' C% ?, S, }* w
% d5 s( M0 u7 K
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
* {: c( n1 h1 w/ c; V5 Z( L$ E) g5 l$ s6 V+ B. R6 I7 j
----------------------------------------------------------------------------
( N+ J! \; l8 [% Y2 t
+ P1 Q1 P6 |+ b `5 i3 i1 D. z<php
" R# S# |+ L; ?7 h% W0 M6 P7 v Z' bnamespoc_e AA\BB;
5 D0 I- w- | k& S3 R$ y, Sfunctio_n showInfo(){% S3 \4 I0 ?3 U7 H8 g1 e% n" x# k
echo __METHOD__,'<br/>';# Y2 J0 e! k& |4 |& y
}
) N7 n o1 w+ g8 E' qnamespoc_e CC;
5 N0 Z+ `* S: @ M* ^functio_n showInfo(){5 G5 o: |9 z0 C5 v
echo __METHOD__,'<br/>';
4 U( l0 b4 B, H O% i9 x( n0 }& l6 T}; i9 R3 f- @$ m5 ? A% g0 O, z/ Z
namespoc_e AA;
+ ^5 J% p0 N5 t6 M4 Z1 b5 p- xfunctio_n showInfo(){3 N0 T# o; {# u0 H2 E1 N, ]; K
echo __METHOD__,'<br/>';7 f7 o; [+ u+ F' w* p( Y
}
$ _8 A/ M8 ]$ N//非限定访问:用于访问当前空间中的成员
. a4 N s( W' A8 AshowInfo();! t0 p- f$ ^! Y# i w
//限定访问:只能访问当前所在的空间的子空间中的成员
# d8 p1 P; ^: p! yBB\showInfo();. Z, \& v ?) W# m
//完全限定:可以访问其它所有的空间的成员
7 O2 t9 d2 `' I9 D( u\CC\showInfo();
0 s% c9 ~. G- b. n6 X, z, x3 _4 M- f↑根空间标识符
) I( }. x% ? W. r4 v& C5 N+ a----------------------------------------------------------------------------
& K3 ^) d$ H5 G( n! ]+ Q! X5 y但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:3 H8 E. O3 z' v
9 l7 i0 y; v: i0 P
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)% J v( f! N* u }5 b' s z
8 k& [9 x- {# N, ]" K代码示例如下:+ x2 r7 \5 A( B7 `1 o5 N
; r# n- t$ g' J/ i5 o
----------------------------------------------------------------------------
/ W; q0 Z/ C+ ]8 M( ` [/ ?) d( p8 x
5 z4 V. y4 T) [7 H6 U g9 G5 m/ b
04inc.php- x4 z9 W( Z; p/ ?( {4 U
<php( B* B( F9 G q; h2 A7 ]$ d, g
& G0 Z* A" `& A4 V0 ~6 z
namespoc_e Core;" C8 u) D. c) F$ G! W8 e* F
include '05ou.php';# ^) Q; P) x5 v0 Y+ N" ^* n
new \AdminController();
- w4 t+ ~4 Y4 ~& y5 F5 k& ZshowInfo();% Z) m. Y" t/ h1 J- R& D5 B
@* G& [4 h5 L" L6 Y
echo P;; b& F8 K R9 \
//根空间中的成员,只要类的访问必须加‘/’# A* h( C8 B- Q
----------------------------------------------------------------------------3 j# F d0 B/ j. h3 g: e. J: q
7 F# o/ u: O$ ]- p5 X. D- R05ou.php/ v" g# c3 @) ?" w
<php5 r$ ]; [/ J i* u& Y
const P=5;
# D7 M- _) E7 w2 E" o
. G: R9 u& I* j6 @ b- A8 J; {functio_n showinfo(){/ h0 M3 @' D8 j- |: u% c
echo __METHOD__,'<br/>';+ A2 B: U2 `0 Y2 D2 K" t
}
0 K+ j2 ^3 ^; y" @' ]0 w& b' _ P* I- Y) K
clas_s AdminController{
: D% @ K! N) X' R7 y public functio_n __construct(){
p7 [, W: \5 }& Q h9 K% w; Q echo __METHOD__,'<br/>';- r1 [ g4 ?6 X; x9 j$ \6 G
}' [* l0 i9 E2 ~: N& x3 `( P: T
}1 j( P2 y9 s" A6 i- y$ R
3 T% z: n. [ Q' A/ W
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。8 t6 l7 S3 v r g4 Y4 I% ~; D
----------------------------------------------------------------------------
3 H; v" L X/ q8 W' o04inc.php6 z- u8 r. `% P* u9 z
<php9 Z% a4 X7 S& Y* [4 Q
; i: ~- |+ q' z1 | h& J: w* Q6 ]6 g
namespoc_e Core;1 \ \ }0 |# n. `9 `
include '05ou.php';: v0 @- r) j) u9 E8 s& J" b
functio_n showinfo(){" T, n- F( l8 L* r
echo __METHOD__,'<br/>';1 q- ~3 @1 Q5 \2 o. F- \
}9 t1 [) X. `! ]7 E
/ B7 T: t) e# x/ o2 Snew \Controller\AdminController;2 s5 W2 ]! N6 p5 J: u0 J
----------------------------------------------------------------------------! Q: ~, @! }* Y( _) o, t
05ou.php1 p! H2 n0 z( o& L
<php
) J! O' _4 j4 g9 Q7 Knamespoc_e Controller;
; ]# y; {# p3 C# L H" w5 i& C
6 N: K) {4 i7 f, C5 O' C- j! fclas_s AdminController{, l4 _. }" ?1 V
public functio_n __construct(){% I+ e2 V' f: T0 b2 Q; X3 ?5 A' X! r4 _
echo __METHOD__,'<br/>';( ~" A: _- O' |
}
8 k6 t d0 R7 T. D, R}
8 {4 ~4 U$ L) x. l) J6 b----------------------------------------------------------------------------' Z- S" W' `+ \ h7 v D7 h
& i+ E$ T8 `* _* d2 J
4.引入空间成员:! J0 W9 m( U5 b$ A4 A- p
7 c# a1 B. X* k% _" w- w
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。% v. B3 [) h/ T, o
+ g7 Z' V/ H3 W0 E& b* V----------------------------------------------------------------------------1 W4 e: B A6 M: ] i$ l5 b
2 ?8 w6 K) A; A04inc.php
9 |6 l5 e' J1 T! \<php
4 V* V6 U [0 e1 [namespoc_e Core;
) C3 k/ f0 M8 a0 R" `use Admin\Controller as con;$ Z M- K3 ~7 Z* c/ ?2 B
+ Z3 c# j4 H: y f2 D1 Q9 n. X2 Winclude '05ou.php';/ o$ w( p, ~" M, U- e% B
$ H5 x9 t+ t( d/ o, X t- Mnew con\AdminController();
1 i; A6 \/ y% F----------------------------------------------------------------------------( b5 I2 S, x+ A0 s L, k0 l
05ou.php6 j. O& W B. R, W! u* t* f7 @" t
<php
/ Q: k* r! x2 H$ anamespoc_e Admin\Controller;: `- e( {% i! M$ U/ J$ S
( W" J( B6 [- H2 A9 u) X
clas_s AdminController{
: X4 O: K- y% Y% U# U public functio_n __construct(){
5 a3 G5 _5 m# v6 Q$ i echo __METHOD__,'<br/>';4 W& S0 i: I5 D
}
! c; Y3 T+ x2 {6 U/ i" u- j}+ p6 u4 X% m5 j
----------------------------------------------------------------------------
7 R' ~ z( R7 U2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 `; i( } U2 @7 E" b& N0 J
4 h7 k& r; t# ?; ^/ I+ p----------------------------------------------------------------------------: A2 L. k1 c( c- s1 O) P; ~7 s6 v
, [- a/ ?% e, v$ @$ M w
04inc.php
2 a/ D) j, A+ Z# ?* z<php
- A, V& c5 ]# @//引入空间成员类
2 @& } g' f3 z. A/ A& c. M9 k% x6 z9 p4 }* S/ F
namespoc_e Core;: b4 U4 ]7 V7 H- ^
use Admin\Controller\AdminController;$ O) _3 g; O0 V! q8 o: {, S$ p2 P
include '05ou.php';/ j9 S: U) n: g( I+ {/ z3 o
0 l+ U9 q5 p( q( a0 s% u9 wnew AdminController();9 a' L" d. c) a p0 I5 U$ v W/ Y
----------------------------------------------------------------------------, h8 ?' F) H" \1 j
05ou.php* f6 P6 W' W+ l8 C
<php. E& ]2 @) g q
namespoc_e Admin\Controller;) h* V/ l% R+ p1 v
; U# K; E" x( o w$ x- a
clas_s AdminController{) m% Q' s1 e' a) u
public functio_n __construct(){9 V- z! Y3 z2 B4 S
echo __METHOD__,'<br/>';
" H- B T4 T/ [3 J }3 b8 e, K) H; G/ ~- |; ^ i! w
}. j: L/ Y. S) L2 T$ ?! z! y
----------------------------------------------------------------------------
+ }. X! q* l8 R$ }( v2 C* J5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。( `& d0 n: z) Y( Q
0 K- c7 R# g2 j/ p& S0 |1 c6 M/ {/ R Y' p; u% G; Z) w4 Z( \
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。- e8 y* a8 B7 M5 |/ p3 B4 |) y& t
8 I8 g2 \+ u2 {7 c0 O! m) ~' G) B
. y8 p K* U* U2 w2 \2 g/ X3 f2 b' i
; L8 D: D9 [+ ?/ m+ [
3 l; O3 h' P( J) v" y$ _
& g( V$ e. J5 s6 W! w2 j |
|