1.命名空间的作用:/ P( ~/ F4 D$ i! p# B
3 c: _" O: K) A; f& S+ s在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
6 g6 c% M. ]* C0 U' t4 l# }5 ~$ {* h5 I- s; X5 X9 ]/ b6 i" ]
9 v4 |; o: O$ }, ]! A7 q
5 |; I+ e6 ?, b$ l; b我们来详细的讲解一下PHP中的命名空间:- J6 T; D! e6 e' m, O( h* o
4 X( ~( l9 \; Y9 w+ a3 a语法:namespac_e 空间名\空间名;
; _8 y' e6 M2 `) w7 V3 \% _ P
4 ~5 C6 ~) J0 V0 k说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
2 G& H. r) u" y- X7 S7 b
+ O+ n- e( M" c----------------------------------------------------------------------------% K5 R& t% {; i, J/ V. E- {$ X
/ i+ }+ ^, m% b- p6 z7 M3 b! O- ^) B
<php
" W5 m% d- e9 s) u9 n0 Q' R3 k- B0 c4 V# O0 p
namespoc_e AA;$ N' j; a$ f9 F5 Y7 Z6 W- D
functio_n showInfo(){5 h5 Z5 o; c K" D! J
echo __METHOD__,'<br/>';
7 T, ?+ U% A b} Z1 P; J S0 r) f+ F
showinfo();
$ P. f8 o. z$ u0 s! U; v$ A2 V/ W) p3 [ f
namespoc_e AA\BB;
6 T! {( y' M. d1 |9 n; Z0 j9 }0 ~5 W- x* p
functio_n showInfo(){1 i7 T9 d: G' `" q# s8 j
echo __METHOD__,'<br/>';! E: e. E7 l, w. Z3 f- [. N
}2 j$ r! K' i4 l0 X
//showInfo();+ I/ W- o7 X$ R5 N
----------------------------------------------------------------------------
0 Y- z6 q- {( O& g" U2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const): Y* }0 T j9 n; r1 T/ v3 @1 \6 d
& |9 s2 |0 S4 V. V) p4 n
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- h0 h4 U, [% ~2 p& L% ?
2 P& ^; y) M# y: I: W- |6 w----------------------------------------------------------------------------1 v$ A* F/ A4 u& C$ t: F% {
+ e- Z8 k0 ?9 a# I1 ~* H<php
7 P, k; W* _3 Z% a6 {namespoc_e AA\BB;( t s+ Q+ `' b) t2 F+ P! Q
functio_n showInfo(){
7 _- H; h" Y( t! ?& w echo __METHOD__,'<br/>';" `; F/ ` h; k4 S' I% O7 ^
}
3 S- g8 x! x/ B7 z# hnamespoc_e CC;
6 l; D" q7 ^$ ~/ Q- O" c5 ~- {functio_n showInfo(){+ B) D- n& A3 F
echo __METHOD__,'<br/>';
/ T* @- d" v* a, o1 b9 X' e}" u) w& @+ \# q3 J; b0 m9 k
namespoc_e AA;
1 p- z& }) d: k" Afunctio_n showInfo(){
9 ^" f7 X& G+ }) ?6 l7 L$ } echo __METHOD__,'<br/>';4 W+ A% b3 `6 B$ h, F3 T. X# Y
} d) |$ T6 }# {) M7 j
//非限定访问:用于访问当前空间中的成员
1 B" d0 a' i/ w; I- o8 s" y; {showInfo();
: {2 [) W, x0 S3 o3 g7 ^& l//限定访问:只能访问当前所在的空间的子空间中的成员! ^8 ^" e) k& m* j& _+ v
BB\showInfo();
$ p B& g* Z' l, A. b2 r4 Q//完全限定:可以访问其它所有的空间的成员 K, j. V- G T& D0 _5 U
\CC\showInfo();
T+ N7 a4 V9 g7 r* d+ @. u↑根空间标识符
: }3 _8 l/ [0 N+ S: |# J$ l----------------------------------------------------------------------------$ i( ^5 T, n5 H" {
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
+ j. E- Q" Q) N# @' w$ l5 m
6 R2 y3 B1 o8 T4 O% k当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)3 F5 J6 R, G6 A4 q K
, D5 B. T3 x& }3 q! ~- m& T代码示例如下:* q, B3 [4 M+ ]# g& |2 `! ]7 A
$ x$ z& j. b2 I; z( w
----------------------------------------------------------------------------: u- ^) P! }9 c& z0 n
$ p! {4 Z- E" L% ]
! Y0 r* v1 S, C8 z( g4 O" i* z04inc.php3 _- A a4 w8 I& w
<php* m6 Z9 @) c3 U$ v! j/ ?2 K7 Q2 G
6 E/ `4 U8 o2 \) Onamespoc_e Core; ]9 y9 ~2 T; T" v% c0 w+ @
include '05ou.php';
0 U& v6 c" n( c' @6 A1 G6 Pnew \AdminController();
3 `& [) @- k" j4 {showInfo();" h0 |0 d8 k! {5 Q* F! X
/ D# ?9 m9 B% l0 C* ^! f* U' Techo P;! R2 V& K' W f# ~" \3 @$ o
//根空间中的成员,只要类的访问必须加‘/’
7 J H' q k: U0 ~- d$ n$ s+ o& S |----------------------------------------------------------------------------: d/ ?# \* i: |/ \) e$ x, M a
- U" g3 A9 S7 y6 c05ou.php$ b6 v. W/ h1 F& X' i6 v0 b
<php# ^1 C/ H. b) j5 i* ^8 _( e
const P=5;- _. |/ W x3 A4 |5 u
. h) I& e; X) |: M5 `8 ?. L o1 E4 A
functio_n showinfo(){
% Q! g( f9 {6 U( G7 e! s) U( a echo __METHOD__,'<br/>';
) z/ i/ t' S, ]; C1 h5 |6 f( f}
9 [' O) J# P% g( e! ]" p6 ~0 T" _. X( }
clas_s AdminController{
1 ?! X$ ~0 l/ X! D$ U1 V public functio_n __construct(){7 m- P& `& s- A# Z, H) {8 V
echo __METHOD__,'<br/>';) \: K5 R! z0 m0 i% F }
}# Q! } ?6 P! ^1 ]. Z
}
& T: b& Q8 u% G& p0 ~! V' c
7 E0 U; y, Y8 X7 O2 k, V第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 D& ^' F J f, T
----------------------------------------------------------------------------
* O! \2 N' C: B3 A$ h04inc.php+ T! x! _$ _, Y7 P6 P- t
<php5 S- s; j' ?) K/ n- a
" p9 I- M7 E G2 k, B' W
namespoc_e Core;/ n) ^6 l2 z4 _" T5 i
include '05ou.php';
$ i. O3 Q8 C! y/ W( Y8 V' f. F# _; pfunctio_n showinfo(){
* s" ^. J, D6 y; @( r echo __METHOD__,'<br/>';) n* R# `( Z' x8 v* s; K4 Q
}3 d, [/ q0 a! S. x
; H7 i% K* u4 G8 S) ]
new \Controller\AdminController;
3 M* b8 w" U' B' X+ C6 A----------------------------------------------------------------------------: U8 H/ n$ j2 S G8 N- N+ W
05ou.php( _2 o5 D0 X- R. |
<php
( Z _, Q" d' G5 l+ d# hnamespoc_e Controller;3 }, }/ c6 d; P+ ~; A
# B- w, | q) g7 F4 _2 g- ^# f
clas_s AdminController{
" @0 `5 K9 `* _. B; S public functio_n __construct(){( s' X% D$ h( Z1 R9 W9 d6 L) `0 M2 ]: x
echo __METHOD__,'<br/>'; q3 G! B/ O. r- |- _" g
}
/ u; ]' s! T' N) O, x6 {}; G2 Q8 S9 e$ J, q
----------------------------------------------------------------------------" W( K8 o; V- ]! w* M6 |
+ w# v$ n d1 \; {( d0 {, f
4.引入空间成员:; j/ K) w" R! P
- A' }2 H! a7 R+ d" p5 f3 i
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。* {% q. x+ \3 g8 e; E
$ e5 Q' F7 j( M: I+ p& G
----------------------------------------------------------------------------4 o9 K& g8 o2 w. S3 r4 G0 a* g
- K8 {) E, B6 l% g0 ~. Q! A04inc.php
5 b$ `: c! \- P* G<php
/ ~, I' h/ J4 B; @' b8 q, @5 wnamespoc_e Core;
2 z& f* B, B juse Admin\Controller as con;
8 y% h! `( X( i4 I( F8 H( y$ U- V9 m
include '05ou.php';
" c( H$ G: l( {: @! R
# [+ y" H% \* U# Unew con\AdminController();
( x) e0 m( F* C' x----------------------------------------------------------------------------
% N1 q/ T- {3 @3 [05ou.php
6 k; ?2 E: Q* a& P# f5 Z<php
- e5 u! |1 o; Y- M: a' G; q" onamespoc_e Admin\Controller;
4 A8 y/ o6 Y4 z, S( M( m6 M3 `- ?! a8 l# I: g& ~- s* J+ [
clas_s AdminController{
; @- C3 N+ ]* `8 u7 M1 ^& T public functio_n __construct(){
& [9 `% `- X' g- d& q# m7 g9 c echo __METHOD__,'<br/>';( K# Y4 H* v% f. U
}
1 g. E2 L$ h% ?- z4 y* D; B}
) o2 I6 [' w8 L$ N8 q' Z& Z; ?8 H----------------------------------------------------------------------------
+ X) }$ W- Z, X# c) ]4 k2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 u/ r& y9 q }% S" G, _+ t/ w# B- I/ a: _* r- m" U1 _
----------------------------------------------------------------------------' O. q9 s" O- Z) f7 J
6 c: X: K/ {! D8 M8 W
04inc.php! D& }: K% r% _( k, f' o n
<php
; e: `0 M' b/ J! ]& y4 e//引入空间成员类
% t b! S8 B3 j" ?* C/ U' t) U$ \; P r+ R) l) \* t
namespoc_e Core;
8 u* @( ^ z0 \* Ouse Admin\Controller\AdminController;7 I6 ~& m; ?( k/ M- N, T
include '05ou.php';4 H2 I+ n) J: E" o7 u' @
. E6 M" j; o) v3 P1 L8 f& |* q, |
new AdminController();
6 p: u% }, t7 r$ {# |- a: B* |! E3 k, e----------------------------------------------------------------------------; E# O: g- v9 r' O
05ou.php
6 z# k |, P2 }7 l' K: I<php
5 }- T! q$ Y7 X2 wnamespoc_e Admin\Controller;
% i* f3 p! W- N. W; ], O4 p2 b0 m, D/ X$ X3 N7 X" B8 N
clas_s AdminController{0 w: R/ P4 z5 x0 S
public functio_n __construct(){/ o/ H$ @: g# ^: r
echo __METHOD__,'<br/>';. J! ?6 a9 b! }& W& n ]( M2 S
}
; a8 j* v/ Z: f0 G}6 i& b* i1 j* V4 X2 M+ p
----------------------------------------------------------------------------9 N& C' B A! I; e
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
* Y# d8 s1 z. Z% L$ T4 C; O1 w( z6 u9 I
. v: c. y( r& I. {5 } ~" h Q* s这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
1 v6 E2 V. O p; G' {
( G5 [, o' j, W1 t# F. r! }4 j* \* W+ q- ]5 T
' n4 O: J$ A! R- E) i" O9 k
1 G. x0 t9 o5 h# m# G7 f5 z7 S
7 Z$ g3 A& i+ ]1 b3 X9 n
. @/ Q* B& O" v" z$ R" E! l |