1.命名空间的作用:
8 \$ i( ]( M$ d7 S
: S2 [6 A8 B, s, P ~; s* O在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:3 {0 u$ {! B U4 S
0 P9 r ^$ N7 g/ J& W1 x( L& k# Q9 ]
4 A6 R& K! E& {7 X2 l5 v, Y2 U
! ^( O9 a- T1 y5 e我们来详细的讲解一下PHP中的命名空间:' f& \4 @' i1 [% h2 x2 z
& T1 p1 I, {% [) F" \6 c
语法:namespac_e 空间名\空间名;
/ f. N. J# t$ Q/ S$ h3 ^: f' R3 l7 m- f. B% V. }. @
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
8 a/ C) r" \# Z0 ?& K/ v" c2 \) z' t* u
4 n/ U' N0 P: K/ @; D2 X----------------------------------------------------------------------------
5 X. s8 t* V+ L: ?2 e; M- Z7 q4 a
' z& i" p+ q7 E* a f8 e<php
% Z( s6 U* X. x- E- ^8 d
5 r8 }- V, e( H' Anamespoc_e AA;
" H3 l; G( W% J1 cfunctio_n showInfo(){! C. E |- ?3 b& G( C
echo __METHOD__,'<br/>';
" g3 q' M, N o4 [% k$ J7 y}+ r# ^7 u* G; `
showinfo(); u' E) f d9 a
! S" j- ~8 d/ w* v& R# v
namespoc_e AA\BB;
4 S( ^% b7 X% |9 D5 N1 j x" B, D2 d1 P; z
functio_n showInfo(){# y4 W# i6 @; G/ \
echo __METHOD__,'<br/>';5 v9 Z$ `1 _) B* K. ]2 B, q
}
8 [5 B8 `. O8 L8 ?/ M' e2 R//showInfo();/ B1 v; ^3 v; t. b. U! S/ T
----------------------------------------------------------------------------, T9 n, X4 }" s/ k. p* h- q
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
8 @0 [9 x8 I3 ]% V% j3 u9 F! ] h$ l4 w/ B/ I
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 V% `, E( ~7 ]& \8 |: H2 n: }
- u- a# N! ?: o2 J
----------------------------------------------------------------------------# s' L' G$ _ a' Z+ r; Y0 \( w
( K, j- r5 m) [2 B. F<php
_- l `$ R8 [namespoc_e AA\BB;* k3 ^7 N. C9 O- T/ \2 t
functio_n showInfo(){
$ u; u# S$ H0 m6 C1 P9 `! S echo __METHOD__,'<br/>';
0 d6 F! J( K' h0 F9 P. i' Z# B2 u# t& S}: k6 B; ~/ f' J+ g9 {
namespoc_e CC;+ X, J0 {+ V7 r. n9 u2 Z
functio_n showInfo(){$ h& c' j9 X- U
echo __METHOD__,'<br/>';
6 r |3 R+ u3 |. @4 H}! p0 f. X% g) ]% t- v: m3 t
namespoc_e AA;
6 q7 v. U" A7 Q" t) t- Rfunctio_n showInfo(){
% \; G& E F$ K" o; p* p echo __METHOD__,'<br/>';
w x" D! R' g4 Q3 u0 m z8 n' a}7 c/ a2 E) m! }1 A6 z3 w3 m/ Z
//非限定访问:用于访问当前空间中的成员3 o/ l- a; I6 G c0 \
showInfo();8 T+ S3 O1 H* V$ J
//限定访问:只能访问当前所在的空间的子空间中的成员7 ?, R5 h' _- \" y( \3 s, H: I( s) \1 P
BB\showInfo();0 n( {( | F& o" m0 M
//完全限定:可以访问其它所有的空间的成员+ z: a3 O, a' x
\CC\showInfo();
& D F% ~4 [- t7 M3 L1 ]↑根空间标识符5 A& p6 I& U& y( Q, J( `& G
----------------------------------------------------------------------------
0 i0 t% i3 M1 [2 N但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:. M4 h& a2 n5 s6 a8 q
% }: ?8 a- M* H) }; |/ t5 j* e( R
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)/ E& P8 y% \( c# p# { f* v1 y
; |9 N& i* \) \ D$ {
代码示例如下:& U* [1 C/ z5 E+ z! S- F
2 t! I0 {6 V( d4 O----------------------------------------------------------------------------
9 n$ f; @# ]0 g9 g. J4 @! c2 V# [
7 Q l: T9 t) T" ? {6 u+ E( x! Q! c+ Y$ y8 x3 g4 ^, n9 ?5 f
04inc.php7 v3 V' ]9 f }* L5 \' ?- i
<php2 Z& ^; ?& P8 ]7 {5 l a0 k
. y7 Z/ Y8 b: \+ i( E. I
namespoc_e Core;8 k. j; `6 W8 L& { H6 v
include '05ou.php';
* P" ?5 ~1 |# ]6 H2 Snew \AdminController();
: O/ U5 e: o" }( o! E. yshowInfo();+ l2 X$ L2 _8 D: ?( y" z
% y5 \: O) ~8 X$ M0 _7 f/ {
echo P;* D, I5 \0 b: i0 J% ^, S# Z) P
//根空间中的成员,只要类的访问必须加‘/’
) K6 u. x4 D) a' U----------------------------------------------------------------------------
8 v! k( W7 k- m2 o8 V, u6 A4 q& d2 o, _2 a; ?; l; h
05ou.php5 |) s! K3 b. S$ g+ E
<php
$ r) k N' ^) @8 s% econst P=5;
; B3 Y3 a7 o9 v/ ?$ M* ]. f
5 s# a" p, @5 K& w' m! Mfunctio_n showinfo(){
/ K) T R" z9 V# Z3 u- M! B echo __METHOD__,'<br/>';
5 y( ^5 B" i2 ~% e0 b- r# e}
# K7 X* U- X7 A1 B" y1 K2 J* R. z/ S9 O. e
clas_s AdminController{- z: u4 @ Q: o# J# m1 i e
public functio_n __construct(){/ {# w* B& n# g1 q! g+ K
echo __METHOD__,'<br/>';1 x6 F6 [0 ]0 W0 X
}
F" L* v& {* Q}
* t: p( |: B+ z5 h/ L. a+ p' W4 @' j" H$ `; G- w2 }- o; g
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: x+ s) x, ?# d9 b
----------------------------------------------------------------------------
# d5 Z( N/ z- g1 v) b+ k04inc.php1 ?0 m; N- o @' q0 r3 [5 O5 I
<php
1 d: ]" t& A/ d) q& l
) ^8 C: o4 [* y* a& I+ Anamespoc_e Core;2 V0 u/ r$ ?. e: g& Z) V! Q u
include '05ou.php';
- s: p I& `% q" d8 nfunctio_n showinfo(){" U Y; m1 E' W3 }* s
echo __METHOD__,'<br/>';+ F, E7 i/ h/ I! Z6 r* V
}8 i6 t: l8 v( |; v. \+ ? R& |) s
1 B/ i( O4 u7 N& M% \new \Controller\AdminController;9 v3 ?5 B2 ]+ k+ A/ z; u3 \6 n
----------------------------------------------------------------------------) u: i2 x- j- O) H. W/ Y( U
05ou.php2 S; H; o0 J' \) X# M2 G
<php
8 E$ a$ b `3 M z5 f7 enamespoc_e Controller;0 c. J; p" G' _" o; x0 E) [( ^
3 u/ j1 d9 U3 z! i. T- M8 W! oclas_s AdminController{
`, S2 B0 \6 k6 V+ T) v public functio_n __construct(){. C3 N( K b5 V# w6 K' j2 g
echo __METHOD__,'<br/>';! p8 ^5 d, J. L
}
% c- [1 l% ^, }9 g6 l7 k8 T& ^}& S) r% [3 q) a. D6 M6 {! V0 ^6 |6 O
----------------------------------------------------------------------------
" X6 E' R, @5 r; F& b K
7 R1 ]& w' e# D" p& y% D4.引入空间成员:
, j" Q' v& h& [' n U
+ i; U4 s; E& t }1 M3 C/ X1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% u+ ~" `2 f; W% g- Q$ _( K& ?2 {$ O1 x& k, i+ n+ x
----------------------------------------------------------------------------
2 R# T& g& s8 |- f# q" @ J7 |1 m# q: y1 T7 c
04inc.php0 f, c3 _# b% |" }1 C* p- b( x
<php n* Q( U% a4 l
namespoc_e Core;) {2 n0 w5 {9 \: v7 v3 i
use Admin\Controller as con;
2 W' |% j5 ^% q! r( ]: S. s5 }7 K* Q3 E% W; {
include '05ou.php';
( E/ K$ p# ]% U+ l5 `' F+ v
( Y; O/ f' C$ J {1 a4 {new con\AdminController();
5 N; A8 Q5 H- M( S----------------------------------------------------------------------------
8 p _ C9 `* G8 R" _05ou.php
$ o6 a; F; q4 C' }; ?- x" G; c<php
( L0 U* B2 k5 s/ s6 x1 Dnamespoc_e Admin\Controller;
4 i: r# S- K. O. Z0 m# @& L1 U/ I+ t
clas_s AdminController{) [: R) u% o4 _( b5 s
public functio_n __construct(){0 ?% B# I7 L5 ~7 Q$ T
echo __METHOD__,'<br/>';: j3 p- |" {4 W( m# N! j3 Q
}
3 ]1 L2 I5 j, s8 o6 g8 q5 v: v}) l7 Q% C' N& t# u3 {6 M i
----------------------------------------------------------------------------$ G0 d; ?1 v" M
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。' T7 t8 H, W C+ t2 _
$ e: H6 p* R7 r9 N" [: T' v4 ]- _----------------------------------------------------------------------------. g7 l, x" s) m. }; [
8 ]+ E$ i; |2 R3 s6 D5 @
04inc.php
4 _# l: O' Z- o: o<php: b" f9 h$ E9 b2 e$ u/ ], m
//引入空间成员类% V; j9 v3 I( ^7 u3 i! T. ?
- Q* r) N' ~5 M3 z7 D0 e+ b
namespoc_e Core;3 i, h9 H1 Y' f6 T5 N/ d- L
use Admin\Controller\AdminController;
4 P) m4 x( z" J) b$ P' @$ G3 v8 X" Jinclude '05ou.php';- p" v2 B* A# ~9 x
' d0 [% ?: k5 |! `
new AdminController();
% t1 G1 |( O9 [0 K! I----------------------------------------------------------------------------
4 ]. A9 l% t0 X+ s* q% O05ou.php& D! S) J! ^( r# V7 C) W
<php5 o6 N0 T3 j# a$ H: E
namespoc_e Admin\Controller;
" T0 p6 F' L9 G
. Z) `* T! l# w! Y1 u4 xclas_s AdminController{7 R) L: g" X/ J$ S1 p# o# ?8 ~
public functio_n __construct(){1 F1 D2 i9 a! {# l! J4 B9 J
echo __METHOD__,'<br/>';( ] o, b; t: K J" Q) `% W
}& r% D8 I. T w _- q( F
}
: h) w' Q z: h( y5 I9 o6 P----------------------------------------------------------------------------; S% O7 ?4 X0 p, a: J9 j0 ?: U$ O
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。( |* \& M! k$ M7 t; y8 J' ?
( c( k6 T0 {1 V) ~) E
, f. s( T: |3 C; X) P
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。; h' [# k' r5 u) b& V
7 j( ^* |2 @! b) F: K+ [* Z
' r5 F8 p' C4 P1 Y. B" w( G
8 j* @1 o% m) \' n7 e% T2 j1 ]
! z) k5 W& ?+ i# M6 G# U
; v( V: w: l/ q9 C+ d
) D' z6 V) |! ~! T2 e |