1.命名空间的作用:
4 [6 n" L5 }! a! ]1 H" U/ |1 L% G# s: ~9 h2 @% |, M4 t
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 k7 K! ~& X' K X( u3 c
7 {' J+ ~$ E" [
( B% b4 t7 L+ u' o( e9 G( X3 Z$ b; q# G* F# } s- d: w p
我们来详细的讲解一下PHP中的命名空间:6 q+ y3 @0 H- p2 U! L
, R5 L. A( X: ?语法:namespac_e 空间名\空间名;% k; U# B3 X, _5 u4 d! Y: I# a
2 d4 w- {0 @: U6 ^+ k+ `
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:# R3 y: @, N, b6 h2 I4 E8 Z
4 v$ B4 y5 ~" p- M8 s0 n" t----------------------------------------------------------------------------# ~) q( s& S! k* E. E
( C0 z' ^6 q( f* C Y: M<php
* c1 G" f( c. X7 g- j
, |* f& O0 F" x. h( E3 J6 `& snamespoc_e AA;
" k3 K( f% _: t6 Q8 L" yfunctio_n showInfo(){+ n9 z/ `3 v) N6 f# P
echo __METHOD__,'<br/>';6 n6 U- Y* A& H$ i9 _2 g
}9 B. {% z5 W4 t% o6 Q
showinfo();' e( o# U, P( u* c5 X/ n/ _
8 @- G( Y+ i) |" o: ~namespoc_e AA\BB;: C1 D; y x" F) S8 J6 u
" F# ^3 \) N; O+ k& E
functio_n showInfo(){
, K0 M$ d: X$ N7 n4 Q( a9 _ echo __METHOD__,'<br/>';
1 K! S3 d$ h' C3 p}/ f0 O. x* t+ E8 B
//showInfo();
5 L( t9 k! J3 X, D4 e0 c' W----------------------------------------------------------------------------) L. }* \$ \- O! t# B$ W+ m. h
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const). M4 N1 V) U6 e3 Y+ B) w# E) z
5 G, r' Z0 p( ~( ~: S! X7 G
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。 {& @% S) q' r: C# H. a9 j
2 ^$ F1 O9 Z a- `, p" w* }3 E---------------------------------------------------------------------------- @3 }* P* j9 I: V& `% h/ q3 v
) I# h* T8 s6 d5 w
<php
8 G+ J+ u" A% I. z6 Xnamespoc_e AA\BB;5 c: F' c- P) g: I
functio_n showInfo(){
$ q+ [: w% G9 K' I! N& H echo __METHOD__,'<br/>';) U. s$ @3 m5 E# b) F; a5 b% K
}
# [3 x6 V7 o' h. U+ W7 R& Cnamespoc_e CC;6 x2 Y, e6 {. p9 u9 k: J3 a$ l( K
functio_n showInfo(){0 W! s) ^+ ~* o6 M( a
echo __METHOD__,'<br/>';
* Y1 Y! n9 C/ V. j" L}
5 A5 y- r" T# N2 A1 E* Y1 ?namespoc_e AA;" P! a* J* |& j' @2 s8 k4 z
functio_n showInfo(){
, V( c; G+ j" i! F6 f! i9 B echo __METHOD__,'<br/>';9 C/ |' p' |4 [. I) W, X4 A
}+ [8 F' ~ t. }! ?* W ]
//非限定访问:用于访问当前空间中的成员
! U* d% j7 p n! IshowInfo();& ?- ?6 u* n, i) N! w
//限定访问:只能访问当前所在的空间的子空间中的成员. f0 U# H5 E9 \6 q7 b$ Z; \
BB\showInfo();( J* x, j1 a+ k& W
//完全限定:可以访问其它所有的空间的成员
* d! e9 U* T1 |\CC\showInfo();0 T" s! r7 e' A+ s2 N! m3 h
↑根空间标识符6 e a$ x0 r6 a4 b$ H1 V
----------------------------------------------------------------------------5 _0 H0 g! ^: W3 Z" c5 w; I
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:7 I( E! Y2 X5 z; _& E6 x
/ h7 A+ I! O7 Y! p, e' Q当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)7 k J5 r6 A3 Y/ a
$ l2 E9 w! z3 `4 U) P
代码示例如下:
1 K) _3 _) D' K
8 z/ R8 I* t( W7 g7 t" j----------------------------------------------------------------------------+ H1 X/ V0 v6 m, T# G
+ ?! ~# h$ P% x
; t1 b- W0 w! n8 \5 W% @04inc.php4 s7 g$ E, ^2 u& W" k% }
<php
+ h- @4 B( v; T
- t6 ~6 ~# D5 I6 c4 U5 T8 Y$ Unamespoc_e Core;
) z& s2 z1 U/ n/ c- J: g# ~include '05ou.php';
5 R0 G- {1 T5 N/ Ynew \AdminController();$ \8 [7 g/ V& U& _8 Z5 o
showInfo();
0 n3 D0 l' r7 m+ _- D( n5 p' x% P1 T, {3 S
echo P;! @/ _" K% X$ ~0 w( ?* p
//根空间中的成员,只要类的访问必须加‘/’3 p- }6 U6 ^0 P( Y! j" }7 |$ V
---------------------------------------------------------------------------- W2 ]; b( s+ w$ ~* K# h, g9 M
+ s# k6 T9 h4 t) I$ Y/ k
05ou.php0 F) Y: P# R* J& t* u& I
<php$ W9 w) Y o) D: d7 a
const P=5;
: i6 k0 q# E' }6 \ M4 I( G! o0 H% a
functio_n showinfo(){
- O0 \1 J0 y0 o0 u% `& y: i echo __METHOD__,'<br/>';7 n! P/ ^2 M$ U( ] G) V
}
/ x3 k' M& m: {$ E! E
: [- l+ r! v, \: Nclas_s AdminController{
) r( s3 g u9 d8 _2 D2 X public functio_n __construct(){* T. ?1 u. g" M1 I2 M
echo __METHOD__,'<br/>';. m) H) }7 Y8 ]: T. I+ z4 J
}
, S. |1 j R. w9 h}
; |8 D7 I: ]4 l; e% u6 t% q m
/ j4 Q$ [7 G1 k: _+ Z第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。( J: o; o+ M2 T; [. Y" U3 t
----------------------------------------------------------------------------1 E$ R1 X7 D: R7 G# j
04inc.php
7 F0 _9 a, V v+ j) N<php
9 k2 r4 a0 r; A" u- I6 S5 j2 A+ R- w' @: q; Q3 b0 D% l
namespoc_e Core;
! M4 O+ |. A/ [) X$ |" _. Ninclude '05ou.php';
' ?9 f- j, t$ P/ O$ W% wfunctio_n showinfo(){
! y, K9 H5 n& w# Z$ m' C echo __METHOD__,'<br/>';! k7 \* Q$ G3 }8 q/ n
}
4 z* t$ p$ X- W" w5 n& T6 G: W' N5 A& W' N! o0 i* Z
new \Controller\AdminController;& y5 s* d$ V; w( ]6 Y7 d1 {
----------------------------------------------------------------------------
/ X" F9 D( ^3 Z% m$ P7 w# n05ou.php' C! Z; S Z. T7 O7 D' v$ J
<php/ z. f! j5 u8 b! d" V4 O
namespoc_e Controller;
6 ~: U- ?5 {: |7 O$ D/ X& Z r
clas_s AdminController{9 O8 l) p: |% r# W# Z3 J. c
public functio_n __construct(){
1 i8 T" H% }7 C$ ? echo __METHOD__,'<br/>';
& y! s% E3 ~# m q }
- T- H4 `+ I2 m9 R' a; X3 B- c+ J}
7 B) O: w$ |- p/ j* ]" V. V. {----------------------------------------------------------------------------
3 b( g# d# E [& b% x
0 t9 [/ a/ y' Z3 M4.引入空间成员:/ s+ B" m _1 }5 X* d
. y, Q$ S. C7 S9 q
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
3 ^2 H9 P1 Y6 q+ O( O
# H6 i' @2 \3 W: ^1 G---------------------------------------------------------------------------- \7 F1 ~: q" w i5 j5 E/ ?. T
# s, B% F9 O- S8 h04inc.php& g" A/ F, v5 a
<php
* i) @9 H0 M3 E7 ynamespoc_e Core;
* w F- m6 M9 z# b5 y! S) ^use Admin\Controller as con;* q m, D- K: ^( q" m2 a. b9 o
3 p: K) @6 C1 R3 N$ Q; Cinclude '05ou.php';
3 u2 U. R% x! q% N# X) O( ^! ?2 h4 y0 U/ Q" {! s
new con\AdminController();
' k$ s; e A' m3 ?0 m' Y----------------------------------------------------------------------------
6 }8 z' q9 Z& D+ }05ou.php
) [7 l, D! C# m<php
9 R' T5 s& ]% W/ Hnamespoc_e Admin\Controller;
& c1 r! o$ c: ]' a
. M; c; `; o3 ?9 f1 @# w2 V0 }clas_s AdminController{" Z/ c; I, J9 u" D# b
public functio_n __construct(){
8 |: i2 J' y$ ]0 U8 }/ Y& D- z echo __METHOD__,'<br/>';" w3 s2 J5 Y& X- q* ]9 [! f
}( Y7 P$ D- s! G4 m3 l
}6 `3 q0 H3 N& \) K
----------------------------------------------------------------------------1 D$ p2 h3 Y% J8 d' r0 ~3 t
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
% G5 C; }3 ~- }/ J! p- H. U0 [* P0 P' h% d& T
----------------------------------------------------------------------------
, c; a; |- k. k+ Y* }$ }3 |+ |5 U2 x( w0 O; d7 z# a
04inc.php; i! b) Y& R+ v- b
<php, K$ }$ C) e. E1 z
//引入空间成员类" K, k" W) T; g6 E' M
% A4 F. z$ D/ l5 \% x
namespoc_e Core;
4 K! `- l. y+ K6 vuse Admin\Controller\AdminController;2 t6 q( O+ R* i
include '05ou.php';
. `7 S% K1 T1 I3 Y/ f7 p5 c& n7 I
0 }$ r: m5 Q1 M* B- n/ nnew AdminController();7 p& n1 ]1 `0 N- d2 `
----------------------------------------------------------------------------/ ~0 s1 u2 t# r1 G" K
05ou.php W# N, {, w5 r; X+ K+ X
<php
7 j4 c) k2 G4 x6 gnamespoc_e Admin\Controller;$ t2 I: c3 G, H, V: _% \" U
. ]" e6 e( P( W2 {* i4 H3 U
clas_s AdminController{- I; S, p, Q" R5 Y( t2 S% y
public functio_n __construct(){
, q; `' Z# g# R9 _1 q! t! Z) A echo __METHOD__,'<br/>';
; l `5 B# F" O2 P0 G! {( e3 ~ }
, E8 [: s. Q8 ^6 n3 c}! u7 f6 p' v$ J- c2 d8 W D! ~
----------------------------------------------------------------------------
9 Z* y T% i$ q. C* Q1 T9 m5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。: N" V3 T9 A6 l
# |1 z) j5 Q7 h9 q( X, k
$ r; ^! e; ]) z/ K i这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
$ T% J3 h0 P9 J# Q# E6 _
/ }& m7 {6 c1 g/ A1 Y: L- A& O6 z7 s% X. Y$ ~+ P( h1 a) C
1 P, k. m$ `8 k4 |5 K+ d- q' A1 z/ c) l
, q) m# e W0 B% a, X" b1 Q+ s2 w( P ]) z7 d" ]
|