1.命名空间的作用: |$ i9 F- T# G7 Z
]( U) S# U& ^. d H
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; O6 Y0 S1 `6 Q: ?6 |8 i
1 X3 ?4 V" e4 W0 V1 x/ O5 V
5 l- g2 ^; ?: C
) A( z, f4 \& Q/ J. C p: X' ~
我们来详细的讲解一下PHP中的命名空间:
/ G4 Q/ d9 o% j' }8 x4 t/ L% y9 A _4 G/ j. C! p6 s. p
语法:namespac_e 空间名\空间名;
: j4 R" p9 ^1 ~: G/ u" C% a* j5 D# B
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:; {: W( E, g. q6 T! ^6 [
5 P1 l/ @" e& t) G$ k----------------------------------------------------------------------------
J( |7 R# v( H5 V B6 W, l w! X9 H6 z6 S1 R! k3 F$ p
<php; H' L6 {" J9 y( e' _- A
5 _* W/ a: Q6 L9 n9 X8 R
namespoc_e AA;* D4 e( o; ^/ |
functio_n showInfo(){
3 o5 `$ D1 \& o& L& a6 B: s% q echo __METHOD__,'<br/>';
* X& n* b4 j5 B}
: e8 x/ S# q& W; V! @- {. jshowinfo();/ Z6 k) r% e' d* K" G" o0 P
+ a! X. f" Z; w9 P. x# ]- d3 z
namespoc_e AA\BB;1 {! U) ]/ @% U2 a) O& H
% e1 U X% ~% j& j9 p+ ?/ D k( A
functio_n showInfo(){
% V8 K- |4 Q7 ^ echo __METHOD__,'<br/>';# q' F3 j- W6 m
}
1 x& w7 x! V8 e/ s# N$ U4 K//showInfo();& V4 ]* O. f+ d2 N7 v$ }
----------------------------------------------------------------------------
5 Z2 O) h2 F0 d( V4 E5 K6 L2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
- w* D. H! E4 s. j0 q3 a& w- w; K6 Z9 x4 k k. v3 U, n
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
# z/ j2 T6 D+ n# B2 }
- b3 W# H2 \8 e2 ?2 c; B----------------------------------------------------------------------------% P9 G$ n8 ^( j; \
/ @0 _3 @( l4 x
<php' _+ Z# T* ]0 t e1 k/ n) h1 A( V# N* m
namespoc_e AA\BB;
$ O5 ]8 |$ q0 m; rfunctio_n showInfo(){3 \& c/ D! n- f3 _& }3 U0 K
echo __METHOD__,'<br/>';( J- y3 F3 G1 i7 a# m5 m
}
' a& x* c6 M6 S2 U C5 i4 f' i7 Anamespoc_e CC;
* }. h9 [' v1 P- Z; `; mfunctio_n showInfo(){
: v; c! v6 l6 E; }4 n echo __METHOD__,'<br/>';8 x% V+ z6 d/ K4 x
}1 q: F0 M# F( {$ u
namespoc_e AA;9 g4 s( X7 w3 M# u# O% V5 t
functio_n showInfo(){
! c+ D% i/ K! H: c1 ?/ v2 ~ echo __METHOD__,'<br/>';; d+ H' E: W2 {7 |/ \
}
+ |: Y$ E3 E" w6 c4 I; g9 U) N2 _- {( v//非限定访问:用于访问当前空间中的成员- r0 o% V& M# G- a! K- }
showInfo();
, V9 R E% {0 u& Y& p//限定访问:只能访问当前所在的空间的子空间中的成员
9 }) ~; e9 S: X8 g. f5 w* J% J! Q2 K5 OBB\showInfo();
) S! T1 `" [+ _% J8 k//完全限定:可以访问其它所有的空间的成员
" q. E+ K2 o6 G0 d. C\CC\showInfo();( _1 q6 K- y4 f; c$ D/ W( Y4 K
↑根空间标识符
6 o5 J/ e* |6 \----------------------------------------------------------------------------7 o: ~1 j/ Z9 Z m6 l) d) m# N
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:& y, n- U' |# x, n5 y8 Y
9 ?* \# Y$ @% H* h当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
) V( N' M) F) r U* o7 \1 b8 L2 | q0 H
代码示例如下:8 Z1 ~; {$ _8 e5 ]
: g5 U% O$ A; g
----------------------------------------------------------------------------1 u( ]2 R& o! U7 ]$ m
( i6 P3 v% K9 J3 a0 d6 r# C% S& F$ j
$ L" \2 F* \5 X5 O: {* E) @
04inc.php
5 L# n, M/ B" G) ?9 z5 o. ~( G<php
1 I5 Q4 ~0 N( a W! p% ^1 W7 x0 ~
# C% w4 W7 c% o! Z: B- mnamespoc_e Core;: m. J. X5 a' ~& i+ r3 F& P* H+ @
include '05ou.php';
9 G- u o% X5 `9 }0 }9 y6 Enew \AdminController();! M/ o: i5 G& H& J2 v. J9 t* ^
showInfo();; F+ u/ K0 w, h8 {& k% B: U
3 W1 _' _- Y6 q" g( ?
echo P;' u/ q0 q3 U% u/ H, C9 ?* W/ s
//根空间中的成员,只要类的访问必须加‘/’
9 _1 c& k5 [( Z, N" ^8 K# U" U----------------------------------------------------------------------------
u2 }3 p3 a# R9 V" u! V [+ d! R- {* G- m8 \1 M g. a
05ou.php) S1 e( U6 u h$ V% b/ q, A
<php
# q L4 e# E; x" U; ~const P=5;2 ?# i4 o; }5 \6 Q% [: ^) ?
: }: H: r( v" G/ E
functio_n showinfo(){9 w7 ?- }$ D6 c) [8 h- F
echo __METHOD__,'<br/>';% r8 ?( P7 p6 l: k7 Z
}) r9 q; f; y) r: o" E
# w) C* ?; n! F8 p: c/ `+ E8 q4 w
clas_s AdminController{
0 [. h: b" K7 C) i) e, k public functio_n __construct(){
+ o* z, }( J3 B2 K echo __METHOD__,'<br/>';
; b/ U; w# Q5 |: Q* h' { }9 U* W4 r3 s1 i( D
}
% l" F. Q6 w0 @0 E: Q1 B
9 _0 c4 E ~& u第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
7 x, h9 [1 z5 ?. h----------------------------------------------------------------------------
: }4 f, C2 a, E! P04inc.php
2 X$ p1 u5 f9 h. Y<php
# p+ K; i2 s, R+ G S2 M9 O- u- `7 E; ] I9 H
namespoc_e Core;
* }( x" i+ |! I/ oinclude '05ou.php';# J+ ?3 R6 [: {' |; }
functio_n showinfo(){4 H! I6 z; M; E$ _; ?
echo __METHOD__,'<br/>';. Q% w- C, c! J
}3 t3 y" ?! q- S2 t
0 P: Q$ `1 J% H9 k3 u/ L
new \Controller\AdminController;
( n# _9 G% s! @0 f. h+ a+ s. e) z----------------------------------------------------------------------------7 }7 V. Q1 |% |: H( J+ w5 C
05ou.php; K8 p$ y$ b' z/ s I9 f
<php
( X8 e5 M: G# z$ o/ h+ P: lnamespoc_e Controller;
4 @: T# v+ C/ |# P( v) e2 q
( u5 B" j, G' o0 b" uclas_s AdminController{4 E- I% U( {$ n2 r% w/ E% T3 V8 H
public functio_n __construct(){
Z. w, _, g4 M) v echo __METHOD__,'<br/>';( w' }% b1 \- M0 _
}
0 C) [" C: c- ^" e+ w/ x+ L6 K}7 `8 w7 Y7 Q. k0 }' y
----------------------------------------------------------------------------8 X7 B/ M* y6 u! `
& o' D9 P9 }' f( w" v$ e* i
4.引入空间成员:
* y% L8 j; q% t
5 q. E5 k/ B+ \9 N" |, z& J) S1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。% M m( R! y* i, k; x/ A u; H+ L
6 W5 ~5 ~+ z1 y6 c& f% C
----------------------------------------------------------------------------4 M! ]: ?; e& L0 ?+ I5 d
* G9 ^# T, ?2 M% L04inc.php
: v' }5 A' E( B3 v<php
) Y* ]) M# s1 Y& Rnamespoc_e Core;
9 B4 {: h/ ~/ ~" A1 C& E: Iuse Admin\Controller as con;6 y$ q9 [0 a* N0 n. K: @% Y
6 G' ^( H+ k& ~! f. R% K) U
include '05ou.php';8 k6 j2 I6 R3 j8 O- R
$ u$ d& H- E) ]6 Q, X" J- |" r7 @
new con\AdminController();+ Z* B" p+ w' K9 u4 ^5 J
----------------------------------------------------------------------------5 g7 Z, x/ {+ ] g Z r Y
05ou.php
R3 |0 Q) D- M& z<php2 I" c% L4 U9 t( E4 M b
namespoc_e Admin\Controller;
) \. B, J5 `# b' b4 @8 `# l9 n! `# [0 R, l; _! I
clas_s AdminController{+ b7 J8 C0 u2 L& \" p
public functio_n __construct(){
; y2 n+ n; Z2 A3 M' n/ } echo __METHOD__,'<br/>';
9 v5 E( \+ c( l3 A6 { }
: b/ g& L) R+ p$ O4 A: W8 Q}
* s7 W0 c$ Y# [- a----------------------------------------------------------------------------
3 J6 M# ~; b& E( V% C5 y9 Y; ^2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: B2 r8 o9 M$ f' G4 a
. f' D% |: a- `0 R! z( [7 I( k----------------------------------------------------------------------------5 R/ X9 g5 ?: Q3 }/ w! v f, J
( r# R* i+ ]3 i
04inc.php
+ p# c7 C( e% J' u9 H! X<php
7 Y/ C, x. d9 I7 [//引入空间成员类* l! `8 E* @- ]4 L8 B5 ~" j9 a
* z9 Z1 ? N* t0 @2 p/ ~. k
namespoc_e Core;
& W: x1 T* X- Euse Admin\Controller\AdminController;+ A6 K& t+ }3 I) _3 D8 [* h
include '05ou.php';6 H$ S; r3 v0 B# H) a ^0 J2 }, p
7 D* G0 @, A4 y5 b) `, `* D" k! E ~new AdminController();
) l7 t( s% v5 m- L----------------------------------------------------------------------------
4 P( o( e4 _+ r! s" b05ou.php6 G+ S! g7 V) y
<php! X |5 f2 T- c. u0 c* J( U0 [) P
namespoc_e Admin\Controller;
0 q/ e, F; F/ u' A G. W( h" P; ^3 j) N: f
clas_s AdminController{
2 G- S7 o, q" K- ?) g public functio_n __construct(){9 X* @. d9 o; T- J
echo __METHOD__,'<br/>';
; l. b# z! l, n$ N; @+ E }& i: P2 v) S3 P9 @
}
& A9 v; x) q) k! ~ H+ F----------------------------------------------------------------------------
. l0 c. y, y+ r6 B! Y5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 f- U0 O9 {4 g" t1 O4 ~5 X
+ Z$ y' z, ~' ~# Q. o
; {( c. X4 h, a+ Y这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。. U) N4 c% b# O9 z
) }2 T9 f" u& W. |6 ~0 ~9 W
6 i% n8 i( w/ l* t y# R; B3 r
8 M: x8 s) h# H) l) G) m! \1 h) |% g9 G" t
5 ?* K: j, T6 X$ N% b$ T* t6 ~2 d0 r' W$ o. O
|