1.命名空间的作用:8 ]1 T6 h; T9 |( K! a! i2 }
8 X) i/ S% l$ F1 _在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
. L. A( e+ b0 m2 J" s. n- [$ R& a+ b$ V& q; a! j. U
' m- u4 k* H1 v3 v& K$ H" o' w5 S; c* x
我们来详细的讲解一下PHP中的命名空间:
: b5 f+ i0 L% |: C/ _
. d, q+ o$ o9 _3 j( Y& U语法:namespac_e 空间名\空间名;+ n" C8 ~+ b. y( C, P
- U- l+ o4 x2 _* c3 s5 ~: N3 h说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下: R3 ?$ D7 ?! U$ I+ ~- f' o
/ c5 v& M4 i' F" C1 Z( \% w" C----------------------------------------------------------------------------1 Z4 `; q# x+ a9 G
$ V: a0 n9 Z# t3 m: m" p<php
c& V ?+ ]. `
3 g$ B! ^3 ]1 t/ e# U/ Onamespoc_e AA;( T4 u; r# ?: W. _& E) M- c
functio_n showInfo(){% ~ A* G0 q" F: @
echo __METHOD__,'<br/>';
2 @6 A; m3 g3 W0 y}6 B( i+ Y; o6 h5 s2 }2 O2 {, Q
showinfo();% s( Y( l" ^' }* O& T
8 y7 l. Q6 C8 V4 F4 T5 c! mnamespoc_e AA\BB;0 A: X7 ]. n7 n3 s4 g
9 A6 l+ Q2 i B1 R4 k
functio_n showInfo(){
6 s- a' S1 a7 ^% y$ K9 U. I4 m4 V echo __METHOD__,'<br/>';
! ]6 j0 s, j8 p6 F* y8 v: z! Z}; |$ T$ o* z( A9 w r
//showInfo();
y' }0 W; c4 `) @! l( w----------------------------------------------------------------------------
7 Q" n0 N6 c3 w4 L M, g# S) Y2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
8 m" e$ H% [! n: Q' B
' v- d s/ b' s; E3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& V6 G" }/ q1 u4 |$ e7 i' B" _5 n4 B( [: e9 T8 q% Z* Q
----------------------------------------------------------------------------
! a4 [' G5 w% ], d" t# y. s* R, t7 t% O& G
<php
2 o, A7 C2 ~; R9 h Snamespoc_e AA\BB;- B7 c/ Q) N l! p7 q' r
functio_n showInfo(){
; X5 d, w0 w V* v, O" m5 _ echo __METHOD__,'<br/>';" m' b z" @2 g5 f; `
}
3 S, L3 I, P, u6 |( Cnamespoc_e CC;
% h* \' R/ i( h+ v x6 p/ M0 tfunctio_n showInfo(){
+ k, f& T% m! y6 M echo __METHOD__,'<br/>';
$ C$ h$ F( F* o' V}; U7 G3 J0 n. m- W" M* y' f
namespoc_e AA;1 v1 B" M- D* n' f- ]4 m9 f
functio_n showInfo(){
5 \3 I3 y- |6 @- n1 E$ i echo __METHOD__,'<br/>';
7 E) j8 H0 f' S) v) ~; d- o) M}
1 z7 o7 P3 G7 k# n) S/ Y//非限定访问:用于访问当前空间中的成员1 z; @1 Q7 f" V
showInfo();
6 u' j0 S( D j8 K//限定访问:只能访问当前所在的空间的子空间中的成员
1 z J+ ^8 |: zBB\showInfo();1 c- v+ K& F4 l6 Y% g( v
//完全限定:可以访问其它所有的空间的成员
2 d1 e9 ~ G& O" x6 h8 v6 c\CC\showInfo();
' S& r& g% N, B↑根空间标识符
- c [6 d. \% g! R, x8 m----------------------------------------------------------------------------
" d, ^7 @7 l$ [- c/ i/ x# _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* F8 r5 x* g2 g' e
8 a; {- f( v2 }; P, o# e" Y当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)" ~$ r) ]+ O7 |* [: t9 R2 ~. f7 Y( B
' Z; [' S" W% x" W; L& M# j# x
代码示例如下:/ K$ w( ^3 \: Z
5 L0 K O% L& O+ T0 m
----------------------------------------------------------------------------9 y. l M/ ~. P. ]3 ]
3 H; N0 d0 B6 g
+ `8 m. V( Q; g2 S6 P04inc.php
4 A6 m7 h5 g. R; L<php
2 b N' T* _0 o* q
( g+ M% |& @& bnamespoc_e Core;
! u6 t$ t' C- C& \1 x# V: z0 `; _! J yinclude '05ou.php';$ f' [) N3 e1 V" W' B
new \AdminController(); S5 y7 j5 H3 Y+ e
showInfo();
. o8 q5 ^7 [5 A, K& ]" x3 K3 @! B( g
echo P;
* S/ j8 W+ [( X//根空间中的成员,只要类的访问必须加‘/’
) a0 E: d# d" v+ t----------------------------------------------------------------------------
) e, v1 |$ _' d# A8 I6 ^3 l, J% j5 I3 @
05ou.php
" q$ V* m* X3 c7 t5 N<php
9 x7 s. Y9 Z: J+ Y2 c6 b/ t$ f5 nconst P=5;
! S$ D9 B5 e$ j" l6 H
% q2 w/ S* ~ G2 K bfunctio_n showinfo(){
4 o4 O8 `* G9 e echo __METHOD__,'<br/>';" I0 W& J" H0 j) `$ k! T5 I7 u% c
}
2 ?4 }' w e( l
* M; w1 O1 q) q! M' Sclas_s AdminController{) Y3 _9 x, R0 d, J3 H
public functio_n __construct(){
+ `3 D6 @; q- p8 d$ X echo __METHOD__,'<br/>';: E* [9 O9 O$ z* q& s E$ m; z2 C
}. T4 K( q1 x v4 z) ~( M1 ]3 a8 b
}& J8 G& J. G( }
4 F0 \6 |* Z* h( n第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& L& r- w$ X) g7 K, \6 g8 V
----------------------------------------------------------------------------) o ^' R* l9 v5 B( Q
04inc.php6 Q7 J, `8 j0 @& h9 z
<php
" f% C5 M2 T* G0 J8 p3 Y/ D( p0 m- H. q6 k: j6 C! P
namespoc_e Core;
5 m" H0 w) Z- U& h/ m' \, Tinclude '05ou.php';
, P5 e' |! k4 l l$ |6 R* q% t* vfunctio_n showinfo(){
a; n5 e1 C+ k4 A6 H echo __METHOD__,'<br/>';
: [& w1 j6 D6 l/ O4 \}
& \- z6 Q3 a5 E2 t
' K5 N, s. o8 W% Z0 A$ F' \new \Controller\AdminController;. X9 e# K X, F0 K/ W/ ?
----------------------------------------------------------------------------- E& x- w5 c; |" i- Z
05ou.php+ `5 O) |! F2 x6 u- M
<php
) ]+ s. c" I, t9 j1 m, M) Nnamespoc_e Controller;( ]% B" J- Q8 z
! G' k. u" `8 U1 M& R9 [- k1 P
clas_s AdminController{
" o% G0 U2 S* l5 Z. X& f/ G2 M public functio_n __construct(){9 U* I. {7 I: |5 U4 G( J* I
echo __METHOD__,'<br/>';1 G- t4 K6 B$ r( j' V
}
; B$ _4 P% M( \, `}
# I* a' o/ h; X4 q6 e----------------------------------------------------------------------------! _6 y; O6 O9 ?
2 c5 O0 K V: J5 O, ]8 G! }
4.引入空间成员:
) D4 y9 M9 Z* I2 C% c2 L4 p8 A
, ?3 I! i: g: Y' M: z1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。+ i8 B# g7 `2 l; Z2 _
: R% V& U" F+ N( [4 q0 q$ a
----------------------------------------------------------------------------" P g0 T" X! y- T4 a8 w5 w: s3 T
$ e! h- F5 B& g5 {+ {% N9 s
04inc.php
, n# ]/ ^0 T. \+ o7 b0 t" J* g<php
" \/ B* B$ \5 r6 q$ M gnamespoc_e Core;/ K6 c/ h L2 ` k! N1 V* S5 \8 ~6 j' Y$ c
use Admin\Controller as con;0 N. V- A- Q+ ~) h0 G7 @' M- P
/ l& c* O% C" g" j) R$ ]# a& s* E6 `include '05ou.php';
. A% S2 a2 @6 b( p: o) _5 l/ V) C$ |9 H Z$ O; F( ]$ Y7 l
new con\AdminController();6 ?- n, x* S3 G$ X8 Q
----------------------------------------------------------------------------
5 P( l7 {3 S h1 u9 q3 z0 q05ou.php9 {2 f# k( V9 y( P" s0 X8 }
<php ?# p1 g& x. K+ N
namespoc_e Admin\Controller;
7 A' t N6 v4 E* e; z5 U. |3 i% e/ i0 e
clas_s AdminController{! B& l& `* Q# i* ]5 d/ d
public functio_n __construct(){+ b* f0 m1 ^0 A" U1 s
echo __METHOD__,'<br/>';( X, H8 f: f: K) `4 @- h
}
& q& X) x& ~: A0 \}8 m2 f7 [; u2 `! B+ {) P
----------------------------------------------------------------------------2 D- z7 w) L/ J! F% U( h
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 p" g$ {* ~* B9 h
: L+ R" H' ?5 G$ R" O z----------------------------------------------------------------------------
. k/ E( J( z: M( ~% D3 W, a6 v" G+ C7 N% v6 r6 p# b
04inc.php
( F) C8 t) P% f; N- Y<php
q* g/ P2 |& r* }//引入空间成员类0 m" u7 }0 u/ K# f1 j# B0 @
# K2 b2 C% {# ^. R# Dnamespoc_e Core; T# W7 `: z- B/ v
use Admin\Controller\AdminController;
B4 Y# C3 _- h3 T$ H1 Pinclude '05ou.php';- L, T6 ~( M2 p: I: x
! N8 Z3 v( J1 c/ t2 W2 D
new AdminController();
% z# J$ S- a0 ^8 z$ [----------------------------------------------------------------------------
& ^1 O7 l+ T x9 D0 q: H0 O3 x05ou.php6 W2 D& G; v2 i) l
<php
0 c, A1 W) ~& D3 I( ?- d" {namespoc_e Admin\Controller;
% B/ u7 Y- A9 R$ u% g
# K; G$ U m, h q! S1 z( Lclas_s AdminController{7 V8 U0 I& f5 Q
public functio_n __construct(){; P% E4 S2 a. l" p- K' }4 Q
echo __METHOD__,'<br/>';
/ Q) w" Y2 f+ c5 \ }; K. A- w; y4 D/ E
}, b2 d9 G$ g1 u5 |
----------------------------------------------------------------------------
6 ^+ y/ c8 A1 K" G; |. R4 H# Z5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
! k/ q- T+ S: U6 r: H4 Z7 q, d; @6 A8 H- u* q& ^; a' e
* P# v- v8 k0 n这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" K9 |. ^0 q5 z) Q& }/ ^ `2 U, A4 F& Z; I# B
! G" T) _* d+ A
0 U# B9 x4 {: K1 o9 W: n0 d4 k' u* b" c$ p0 H. l
/ G. g C8 K$ Q- E- ~* ]5 E) L) L
* ^7 i$ r8 H$ Z7 X( I3 p" C; o |