1.命名空间的作用:& X- w. J& |3 g
) Q) T4 g; ^1 t, W在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:: W! X8 c5 `9 t0 S
3 E6 S# ~5 e3 R" F0 T
# }8 ], e, [2 X
]9 J1 m$ V$ H, v我们来详细的讲解一下PHP中的命名空间:
0 G% x; M# C0 p
+ \4 l4 p$ a p( V- K+ U1 w语法:namespac_e 空间名\空间名;
4 b% ?5 \! x T4 d% b1 I
, y2 [9 r; T/ C4 _说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- M2 ^9 q# b1 }& Z0 O" B
- \* {1 g1 L6 X0 G& i" u1 `
----------------------------------------------------------------------------" d! r# l7 [5 G3 C
7 I, N8 _0 s2 R% V0 D8 |3 I2 N
<php
4 N; m, I7 J& @& a# l) Q: M- W3 J& w4 u; T/ i' \$ H* d& N- I5 c/ H
namespoc_e AA;
# _$ i( X' w6 k% O! Q- J, tfunctio_n showInfo(){
* F2 S* m$ c$ @2 @* F( p7 h echo __METHOD__,'<br/>';
% e" V6 P- R# @. g* |$ F}( t/ j6 K5 W2 d! g* l, W
showinfo();2 X+ ?5 I$ E# y, _8 \- q# H3 j
% {2 n6 a( {3 {1 ^namespoc_e AA\BB;% ]1 [6 w$ @! ~2 ]% A5 _! F
( p Z1 t5 M, R. W+ b- c( a
functio_n showInfo(){# s; u4 |) f( [0 Y7 ?* u( B( |. \
echo __METHOD__,'<br/>';
8 U& z8 [; R: D: m [}
4 B T$ {9 z) {- R7 K//showInfo();
) ]8 m( V+ Y% r* _: }; y4 j7 ]----------------------------------------------------------------------------5 R/ z+ ?: T' G
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
" e' M' a8 h# [1 H/ a' K6 x6 G
# v- }1 C' q, G1 G3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
q1 l' ^) {2 I4 V+ i2 h) i; T J" }
----------------------------------------------------------------------------
0 D! D1 z3 b3 P, y4 s. ?" ?7 W( W
. v2 E4 r& n$ V. G( E<php
) ], z& `" c" V" V9 v+ C U& [. knamespoc_e AA\BB;* _ o) c6 V* J; t3 p+ q+ y. `
functio_n showInfo(){
$ z' F( Y; Y0 ] echo __METHOD__,'<br/>';
+ W6 V5 y& |# X3 O; _" B( b}3 H" I; C6 J. n( O5 p
namespoc_e CC;$ e5 [$ w0 w+ B7 R! F9 U. ]/ ^& E% @
functio_n showInfo(){
( M! R8 d( V! Q6 o/ L! V echo __METHOD__,'<br/>';) Z" B% E2 G& p4 f: z
}' C E i3 H/ ~9 q
namespoc_e AA;
1 y& [" X( S- w; ^2 g( Hfunctio_n showInfo(){
1 N9 L6 ^0 o: V4 s. S& c0 d1 T echo __METHOD__,'<br/>';% S# v' d. t0 c0 N2 l7 H
}
: _7 n( x4 I' }6 B5 d( M8 t, T//非限定访问:用于访问当前空间中的成员
1 ?: L3 u7 _# AshowInfo();( Q! W" [1 u( a8 Y5 f
//限定访问:只能访问当前所在的空间的子空间中的成员" f: D- k# S# C& Y5 p, S! C
BB\showInfo(); Z, b1 n8 N/ E8 ~* [2 g3 {
//完全限定:可以访问其它所有的空间的成员# [! Q& h/ }, \9 n
\CC\showInfo();2 ?9 p% l D# f' i6 P' s
↑根空间标识符
6 r3 [ ^5 _8 @; e0 U----------------------------------------------------------------------------6 [- l5 q, Q1 x# K+ |
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:: @+ d$ E9 h' M0 a; N: }: Y* D( B. c, h
+ M% [* ^& R1 Z
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
5 e3 O8 c+ b/ P3 H0 m- w. B! R0 H$ G1 M9 x$ `3 R3 E3 Y3 q, f- h1 ~
代码示例如下:# x! S+ S1 i( u) x d9 @
' @9 ?8 f& @8 H6 b |+ W# S; t
----------------------------------------------------------------------------
1 M; U& G, k. y9 J/ i
1 N' m- S5 T. A! Z9 J2 e a0 a$ x& L% h8 ^
04inc.php' L( s* X3 W$ _5 S, ?8 L4 \" Y* w( @
<php
0 P( D/ S. I# W% @9 x: k+ @* }" A4 A4 [7 R" q( j
namespoc_e Core;
6 @- l; Z/ ]8 e. ]9 Q9 U% V* \include '05ou.php';
! A$ p9 f' ^0 |- ynew \AdminController();' E+ E+ D& f6 k" w
showInfo();
) A1 H' }) e8 z; j. f& U" a# d! E+ ]' {
echo P;
1 n5 z' W4 M7 J//根空间中的成员,只要类的访问必须加‘/’
5 s2 N, I" s+ m( B5 e: B7 J H----------------------------------------------------------------------------
% ^- ]; k' C; v5 U6 d: z1 ?; Q. m( w% @* V9 o
05ou.php9 S, ^+ x- I$ r: o: E: G1 y2 X
<php
$ Y6 t, v) V; j4 y* p- D0 Econst P=5;5 x e4 D6 L2 q9 H
3 d/ N% Y* a; A$ ?/ K" i8 C1 I
functio_n showinfo(){
( n* x5 Y3 s; L8 r1 t echo __METHOD__,'<br/>';
0 O7 r* |2 I3 r) G( D5 V* b}
: {. W3 q* P- n7 ]
9 e3 W) L9 i; E* Wclas_s AdminController{
6 ?5 Z+ t9 M$ h3 |/ r public functio_n __construct(){
6 a8 a8 Q. _* m' C# `# s echo __METHOD__,'<br/>';- ~# M5 u2 W8 }7 m# x+ x
}0 ~# g) y) Q! S1 K* ~- }
}3 |5 t: r5 C3 ^0 |4 ]+ G6 O& B
: Y! ^! O% b& x第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
( q) u/ _' T- N7 }9 P----------------------------------------------------------------------------
, j& |( F* m/ C; G- _4 C; ~4 G04inc.php' h0 d) `' y" u9 W
<php0 P8 J8 ^8 f% R) t4 w) y" H/ C
! P, Z |* l: m. [/ i3 V. R
namespoc_e Core;& Q" J8 a# E. O% X2 d# q6 @
include '05ou.php';
9 b% Y! A* g7 r; A. ~8 ]$ G+ I6 Nfunctio_n showinfo(){6 F7 W6 } p1 g- P, Z/ T
echo __METHOD__,'<br/>';
" g/ q' g% @ _. V0 H7 Q7 c E}
4 D9 f+ p# N q) b1 A, p+ z" i. ]8 u- k! ^! f4 u* V5 K
new \Controller\AdminController;
0 s+ ^, [2 U5 j/ e/ m% E----------------------------------------------------------------------------
8 F6 T) x. U& e05ou.php
6 P& D1 F+ y7 t6 i* `* Q<php1 E- s, o# y: D* \' {- a
namespoc_e Controller;- D) P8 H! \9 l& f- h: k
C- c) c6 {0 p) d r
clas_s AdminController{
" r1 H6 @4 v' V$ n1 x6 N9 ]& k public functio_n __construct(){
) n! g& z' N$ H: c! h echo __METHOD__,'<br/>';
8 f- c$ c. N t3 ^% W: h }
4 V! ?. S- \# i}; w8 N% K- b; u' A& Z+ _
----------------------------------------------------------------------------* V: q3 F/ E1 v: s- H( v5 ?; `
+ N% o9 D. T& E. x; `, \8 Z) R2 o4 t2 n
4.引入空间成员:
6 c; B; k$ z7 \. H: i7 g" V; ~+ [ L- @# Z* V& E0 x& E. I
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。+ \" z3 ]2 T* l; R+ ~( @$ r A
0 S1 F& V8 G8 T" }1 t+ K. `----------------------------------------------------------------------------
3 i% @/ `) f- |3 h* y
. S+ j, C# ]# W2 G5 L) }; d04inc.php
. f% l( B) S: q<php4 T! F: {6 F" @. _8 E. \) _
namespoc_e Core;0 q/ c+ ]+ X+ B) i5 U
use Admin\Controller as con;
0 D+ u. O c3 ?# T2 [: E
7 u1 X _, N- Y7 T2 Oinclude '05ou.php';9 A5 t. D, V e8 O
4 U' n. q1 W# U1 \/ G
new con\AdminController();, b- E: H$ l s: ^# p, m
----------------------------------------------------------------------------
' K) t- d) E2 D05ou.php" u) \1 {! A9 g! \" A
<php
8 V' R1 @& f! u3 wnamespoc_e Admin\Controller;
6 W: G* K; f7 b3 p$ J) u6 I* ?
9 i# g' s2 W0 s4 [clas_s AdminController{
* `. z! f& I* o: a7 M- I public functio_n __construct(){
! }! d7 U; @) S; [ echo __METHOD__,'<br/>';
5 d% X6 }, |" u) T7 v( g }! M- X5 \ Q0 X% G8 o
}$ S0 l, L4 h: C
----------------------------------------------------------------------------
# e. C" j! Z" Z8 Z0 o2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。: ?# K2 x/ \1 n; U) q
" q! T8 C0 g& o4 ^# e1 D----------------------------------------------------------------------------( b/ |4 h. S% ]. S* i
) L) p0 T) G, x04inc.php
7 t/ G# D6 w o) Q6 X1 H<php
; K5 ^' Y& J$ P; q1 C//引入空间成员类4 i) O, Z- J( O4 Q R1 b
3 X( F0 q& P* X4 T1 l6 [! |. k
namespoc_e Core;& S& D, A6 x& Y9 {. I
use Admin\Controller\AdminController;
- Y: L+ I2 S, ~* K8 a) Binclude '05ou.php';5 s9 V6 ]' z+ A% A' u V, Y2 H8 ?
+ m& L( W# t& P& g& x& f2 {( enew AdminController();
/ ~" i& w' s. [5 W, Q: r/ F----------------------------------------------------------------------------0 P3 z3 K1 F9 ~
05ou.php# ?! P, a* d/ z/ c! T1 k. e
<php
2 ~7 m. F, V4 V6 j; n* }7 Ynamespoc_e Admin\Controller;% t) ?) z, b/ w' V$ x y* a
) M9 D/ V- Z t* ~9 z; I5 Wclas_s AdminController{
4 a* Q/ _6 A m% A' Q' k( P8 U public functio_n __construct(){: ^& e2 n* K5 j- S( q) `! F" ?0 r
echo __METHOD__,'<br/>';
0 y- B& G+ b4 z [ }# b6 J, h8 x! y0 W" Y- ]4 x
}
3 S1 ]" M6 V! b% m8 ?0 |----------------------------------------------------------------------------* T. g4 N( i( s. Q" r. a
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 V6 F# t t' X9 i
1 j! F# H# l( V* ~6 ^+ G' ?" t6 ^, d: m4 @' i) h( g5 t* V* y
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
/ C, B3 F: l, H3 U L; O+ _$ x2 |) _
0 b% n' P: J8 [) |+ K
& S6 c" a; O9 D2 i0 s+ T- ~6 i) b. ^
5 H. O/ y' I2 V6 z' t6 `. `" X* a- _# D# Y, D% p* N6 T
' E8 o, |3 w( P
|