1.命名空间的作用:" c* N, l: {2 W$ c
0 A$ s b3 e+ h' |
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 i# N; ?1 |3 Q" p8 |
' W+ N) M- C# o7 l
; m3 m" u/ x3 i0 {/ F" b* B
4 Z- g7 G) f& U4 |3 i6 H
我们来详细的讲解一下PHP中的命名空间:
, p Z* ]3 {5 M. M4 Q ^
\. y! E. D1 A+ R9 u, {语法:namespac_e 空间名\空间名; c: P" e! b( x% B2 V, K, T2 D
! t; O+ A: I* V, G) l& R说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
) }/ i2 y0 i% ]8 w5 u2 d+ X& e3 H/ B/ W: S- `
----------------------------------------------------------------------------# [$ @$ Q! D \1 H5 Q
! U( I+ k3 K: {, P/ X
<php
2 x4 Z( ?7 a$ Z _' w/ i; D: m: G. u5 z3 { a
namespoc_e AA;
" A3 H- L: o# H1 L lfunctio_n showInfo(){* L/ C9 ]" f0 j
echo __METHOD__,'<br/>';, ^: v' v3 C$ T
}
2 n6 V: W" ~8 `& I) j: ~9 ashowinfo();
5 a- w" t+ z% \. w( g" _
6 V( z6 m7 n# g8 n3 ~+ Jnamespoc_e AA\BB;
+ D% }) {1 K4 y n
4 V( g5 H3 X: ^. I c7 z6 Yfunctio_n showInfo(){
5 S4 Z$ k2 h9 E6 [ echo __METHOD__,'<br/>';, e, _ q* B [9 C: Z
}8 h: L2 S! u/ j8 L8 S: Q2 ~
//showInfo();3 W) y( T4 D+ R0 k' T
----------------------------------------------------------------------------; X( p; ]. _5 b6 u0 r
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)5 P: l' b4 c' h1 E% ~
3 J8 h& x% o/ N8 J3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
* h0 H) G u, R3 O: j9 Z8 x, m' H& H W( E! `$ { {7 R
----------------------------------------------------------------------------
8 Q5 ^# R, W( B0 Y- z% e2 ~( y- A0 O
<php. U2 P' u* ?' r1 A8 N! h Y
namespoc_e AA\BB;
' K1 u+ c: s/ Q5 ^, S- [functio_n showInfo(){6 D: C6 b z& F, W5 D: u" J
echo __METHOD__,'<br/>';
$ K [% i9 U. Q( `1 e/ M6 z}1 m( |; s7 L) e& u; z; }2 A) A: `
namespoc_e CC;, A+ N w% B3 A, I$ h4 t% |
functio_n showInfo(){
- u7 d; E4 t, F( o9 } echo __METHOD__,'<br/>';* W4 }/ o( |& O, |6 n9 J, a
}
8 F& h2 b3 P1 p1 Cnamespoc_e AA;& O U- c' b8 m" G" A
functio_n showInfo(){
: v5 c+ N3 W, w2 V5 L echo __METHOD__,'<br/>';
# s9 A' l6 R* y9 W5 \4 V}" N( Y2 }: ^+ E
//非限定访问:用于访问当前空间中的成员
/ @! i6 G& X+ w$ w3 P- H/ PshowInfo();
3 b- `7 @0 F% G o: B4 B//限定访问:只能访问当前所在的空间的子空间中的成员
. n6 u) x4 O! G* |" p/ [BB\showInfo();4 s# ^, C0 s- b1 Z% y k
//完全限定:可以访问其它所有的空间的成员
. @: y! o. V3 p6 M- w; ~) S( x( h' ~) G( }\CC\showInfo();
: i% E2 v$ _0 f' P; \↑根空间标识符. v' T; k9 U4 h* M8 o: t) `
----------------------------------------------------------------------------1 w L, @. e9 j* _+ Z
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
; v+ |# z9 U' h) M" V3 u! j$ s7 A* N% c# Z9 ?
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
" S4 G0 w/ Z6 X9 c4 s/ a& }
( V% L9 L; X: h% n代码示例如下:
* _: v* B1 \. @4 r1 b+ a& r, S# r9 [
4 V \- { {! X3 A& X* C----------------------------------------------------------------------------
& R, ?4 D9 J) l1 Z; Z2 G$ p& L. w$ P7 ^! ~' E5 X
% d# ?8 w! G4 R! K( j5 y6 h: }
04inc.php3 }7 q# V/ [, p! r' A
<php
" t4 y/ W8 q& D. p$ y; z
: I; F+ x6 N6 @. Q% [namespoc_e Core;
f; B- ]' k1 R! ~include '05ou.php';. y7 `9 ?* w+ ?; r f
new \AdminController();
\! ~/ |, u0 r- O9 h. F+ rshowInfo();2 Y7 _* @2 p; Y5 J! \
* L) ^& m% O5 ~# z; ]( {4 m
echo P;/ E! x1 F2 Z) {3 [) T
//根空间中的成员,只要类的访问必须加‘/’
0 q7 U6 W5 K! R% s----------------------------------------------------------------------------
" k! ^* z) E3 X& g% S$ S3 S
5 X% [+ b3 I/ f# i05ou.php
; c/ T6 ?6 W! C# @1 |<php
, T0 Q7 Q# A& lconst P=5;- t! c9 h3 X3 G& J, j# q2 f8 {
: v( w9 z% e1 Z. T
functio_n showinfo(){( q% ^" A0 k' C6 J
echo __METHOD__,'<br/>';8 D% I \* j0 h
}4 `4 \8 H8 m9 v1 D) u
3 W0 N- I0 k ~4 T. xclas_s AdminController{
( q: J" c+ [5 u: w) i. J% V public functio_n __construct(){
3 g% x3 G1 S# D1 V1 ~- p' i echo __METHOD__,'<br/>';- X# R# g9 z) U+ l/ V. C) P
}- Q0 ?7 @0 ?& }2 u, N' D
}2 a( D" [5 s* j; L
; {4 k. B$ r6 z1 L( |9 x7 @; ?. o/ P
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: W& @: Y: \3 K w. {6 ^# v/ l
----------------------------------------------------------------------------' `% O- h5 F& v$ P. V( `8 w0 D
04inc.php
% R, @. P( ]. w4 o; y" q- O<php1 s/ n" B) t' I1 k m" M
) v+ h& b D# Q: O6 d
namespoc_e Core;
2 r: Q" X( t" P$ G/ hinclude '05ou.php';3 q) i I- i/ @6 i
functio_n showinfo(){) ~1 S, P3 E# Z) ]+ \: i% D1 a
echo __METHOD__,'<br/>';
! {* T* j6 L* J9 W}0 e. {9 I1 A) ]& \' N9 Q
, J4 I$ ~- |- o8 ~* J' ]2 H
new \Controller\AdminController;
8 K7 |6 V9 s" B% {----------------------------------------------------------------------------
8 H2 `8 k% a0 c+ C/ w$ _7 K8 J05ou.php
1 O& F* ~* T* l( O<php% H: B j$ d. H6 V& ^" Y9 Z y
namespoc_e Controller;/ r* J) h3 Y( B0 T- W) [2 L( f9 E
. w) y/ o/ \) Z4 U' i" ~clas_s AdminController{0 X; P6 C! U \( T( x
public functio_n __construct(){* U1 _8 t8 P* I% r k0 b# h6 r
echo __METHOD__,'<br/>';
( y/ `- `. F+ U; E0 f% T }3 C2 s$ _1 |$ a
}/ r/ G6 p7 p; C
----------------------------------------------------------------------------( V0 M4 T% P, T5 s$ w0 F, j" t
/ t6 E; q# I' W& d9 ?: q: m" z4.引入空间成员:7 [$ R4 ^/ \- v; A7 c3 K. G
& _+ H1 {3 J, p. F, _' U1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% p. L, G0 V8 _6 o' p6 m) |# ?, I; Q# S
----------------------------------------------------------------------------3 m' P% F, W/ f" f! g" k5 i1 Q# P' [7 m
" r8 a/ n$ L9 v5 r y7 q
04inc.php# y! U9 C4 r2 E# G: ~! a {- v
<php
' s7 S1 r. E" ^% E2 {$ A* j. ?namespoc_e Core;
2 P) Q6 M3 M/ f9 M" B* [use Admin\Controller as con;9 ]3 ?2 L7 g s/ y+ k
4 y9 y3 g$ U4 yinclude '05ou.php';' x/ Z' f x3 R m8 x
7 q8 s/ o3 v1 V) k ^# lnew con\AdminController();
* i2 y' y1 y1 S% C) V. n----------------------------------------------------------------------------% p. f+ s/ _! }6 o
05ou.php9 [! [2 f# ^9 @/ Z; n
<php
$ K/ T7 _, o( S6 lnamespoc_e Admin\Controller;/ F2 q3 J8 Y/ x
' W) I9 { K, {clas_s AdminController{) s1 s% Z+ \6 |# a- q
public functio_n __construct(){
4 c# [* |; N: f* g echo __METHOD__,'<br/>';
4 ] F# l0 t O; j5 s& f& [ }- `" p$ y, m, c% q* O
}, `- D3 m; O" P
----------------------------------------------------------------------------3 n; z" |- l9 I) D* v( K
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。& u) b3 p M# \' k2 u
( m/ m6 ~( f* V( w/ e3 M----------------------------------------------------------------------------
K& i! L# c' |' s* x8 l3 z; V3 w- I2 s) C
04inc.php
8 s$ j7 p% c, ^' h% P<php, o8 X+ ~9 ^4 _/ ?7 [3 q* t
//引入空间成员类' N7 y6 o2 m+ p5 R. f N
: d& m9 w) Y) @" q# z, M$ G! Tnamespoc_e Core;
% |2 _) l% U+ @ Zuse Admin\Controller\AdminController;
) `' D7 g) [# f5 T _% tinclude '05ou.php';5 R9 e0 w+ M. N
! \/ X) A6 T! @new AdminController();2 S1 `1 V* U- Q7 ~: g
----------------------------------------------------------------------------
/ l. M1 a/ v9 j$ ~. `4 t9 O05ou.php. x. L" L! Z8 E" A
<php
% ?& T4 _: _" L1 S5 @; t8 Rnamespoc_e Admin\Controller;. m+ Z8 N- b, v) d# {0 U
% \8 Y4 I1 ?; V- u; W; c7 [% S
clas_s AdminController{ `5 v4 i/ K/ E5 G6 E1 X& N
public functio_n __construct(){) s/ v6 @! b% x" F
echo __METHOD__,'<br/>';; }5 x# \5 f9 D; f0 k
}
( a' `: s) \" p! r# y) H% h5 e}4 L1 X. ^: r: ]# t
----------------------------------------------------------------------------2 }# e! o8 T( s; m: l" C X* Z, Y9 e
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
. ^9 O0 J& m# q: w% S( D' ~* E$ h4 j, A. C# r0 u) x
4 V7 S. J4 Y9 y% Y# j2 v
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
+ m5 a _; R G% ^3 }5 a; q2 M9 n" z2 n
: t/ J5 F4 T: B! H. O4 R A5 `$ z& r. t
7 O: _7 i- ?8 P7 g/ c8 \
- m2 a" Q8 s: E! L2 L/ X; P* F
& g `" T0 x# ^" x |
|