1.命名空间的作用:" I5 K6 _' s* e( O! ~, \/ E, p
! p4 r# b z! T' }. \1 w3 E4 x在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
) Y L6 S+ z; |& {# q2 }, J0 m7 V/ g0 p- T% `: l" f
2 z. k/ T o% x N# r6 w
+ p3 O! f3 I: @2 g我们来详细的讲解一下PHP中的命名空间:
. T( j. d5 {- S7 h3 P+ V) L Q# o
8 T$ t8 Q/ [3 R0 g% U语法:namespac_e 空间名\空间名;- X; O5 h! h( t: i0 z) B- H
( ]- H$ y+ Y$ n3 c说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:2 l$ U9 y) T+ y$ i/ ?% F9 b; r
" P- b3 F( r5 b$ I/ [
----------------------------------------------------------------------------
5 j/ ^! \) t( a! `! z7 h# _
+ A) s |4 q0 J3 d: S<php
; @! B6 a6 p! V8 S# d$ p
4 O: ^3 |7 x0 u* ~( t' onamespoc_e AA;
2 O0 k% `: n q/ U3 V- c/ h- Zfunctio_n showInfo(){5 E: R5 |1 w9 T1 K1 M" W
echo __METHOD__,'<br/>';
3 a3 T8 V8 ?8 m- j9 ~}/ i% o9 D0 x. ~
showinfo();7 O' U) k7 K' o Q. F
0 P1 Y: _( f' U; Bnamespoc_e AA\BB;
! Y( u! a5 J+ ?. H! I
% V* l5 V$ \; [5 D ~7 Z Qfunctio_n showInfo(){3 S$ r* |( z$ w: g# b0 t
echo __METHOD__,'<br/>';8 x, E! M9 G6 a$ z
}( B! T' [2 J4 ]& Y; H
//showInfo();8 L" M$ P! J. S4 \1 O u2 [6 k. e
----------------------------------------------------------------------------
- f6 u# y5 y& l9 J- x3 e2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& j+ y. Q" T7 W7 d" e
' a$ P# K' R% d g }
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
2 h, Y( U, Q/ W& m" \/ o" s! l. v3 E
9 W/ ~* O% E a2 S* E8 @----------------------------------------------------------------------------) }; S# X' f, p
& f! n/ w% V1 B6 I$ Y4 ]' g2 v
<php
3 c: L/ T- e I% X ?4 g+ E+ Cnamespoc_e AA\BB;
, d% s& r* b' d1 [: l8 x( S& u, Efunctio_n showInfo(){# k9 s5 W5 }7 m8 A, P9 u
echo __METHOD__,'<br/>';
9 d8 Y% D% P/ ~0 u# G& d}
+ [4 A# T) r, X4 anamespoc_e CC;
; {' t/ O5 K% A! _5 C' |$ [functio_n showInfo(){+ i1 X- w$ Z |( N
echo __METHOD__,'<br/>';3 a" U2 A" H( H9 L2 @
}& j' {9 S1 Q6 X) c; K9 w
namespoc_e AA;& a9 ~! b: Q3 g/ k
functio_n showInfo(){1 V4 ~. m& N e
echo __METHOD__,'<br/>';
7 u& f8 Y$ G8 C& t}; A; b0 c% Z' i) Z/ s. v
//非限定访问:用于访问当前空间中的成员
6 U- F& n* R0 [6 nshowInfo();
2 k4 b% {! u1 ]9 E( m0 o3 E5 S& s; z& T0 L//限定访问:只能访问当前所在的空间的子空间中的成员9 _, w6 F6 q9 b _
BB\showInfo();& N( ~% v: X8 w. b4 m
//完全限定:可以访问其它所有的空间的成员4 z% k9 K+ z' g: ]3 w. Y
\CC\showInfo();0 @+ O* k/ n1 I' g8 v1 Y
↑根空间标识符2 d' S, g) B3 J2 c8 g1 ^7 I0 _
---------------------------------------------------------------------------- Z0 v" G' U* g. Q+ I) p
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
: a6 ]5 n* n( Y/ D) z. |. I1 i/ t8 h/ G
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)2 i: j3 Q9 a; y+ r+ v( k8 [
: ~6 h2 a1 Y: K% k: V
代码示例如下:
6 P$ N8 l% p" z6 n9 g: X- I& e0 R' @& ?+ X
----------------------------------------------------------------------------' T' K3 z7 B; m
3 X; e* e. m/ n* n! I( `0 J& L0 |9 [; j3 ?6 H- }
04inc.php
& z$ G! I" o) h) u; F+ C* D1 U* z<php
: }* z; z# }, T4 q8 A x$ Z2 i( N; h E. x' o4 x
namespoc_e Core;2 |" c, q1 I! |
include '05ou.php';% N3 o# d( l' T7 ?, @4 `
new \AdminController();: b9 {! q( D- E9 L! [
showInfo();# \# } F' i( l
6 l6 D3 G2 d5 K' j5 @
echo P;
; ~2 \# f) |: y//根空间中的成员,只要类的访问必须加‘/’
+ h B5 }/ _( _, A U----------------------------------------------------------------------------
) @4 o1 B3 _6 ?6 V; q) d) k1 R: O+ }' Z8 j
05ou.php$ z6 p5 m/ S) w1 T+ C
<php. l P$ b! K* F( m2 o1 F; U
const P=5;% w. {3 _) t W5 m' O1 @2 e
. t$ J3 a7 I* r. N$ Nfunctio_n showinfo(){5 y2 y8 v7 @. f& d1 G
echo __METHOD__,'<br/>';
3 H1 J& e8 P( f! t5 R& c}9 N- Y5 A s4 }+ ^
: h$ E3 k; Z* H$ W9 Jclas_s AdminController{
& K/ [2 D. P+ q# P! g8 F) L3 Y public functio_n __construct(){
" P- ^% l$ M0 W- h4 { echo __METHOD__,'<br/>';
2 \2 `9 `% L- X }
& w3 n- ^% q+ V2 v' M}
1 b" d! s; F4 d" a q/ K# X9 K1 n" |+ G U
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& p7 O; h1 t( f: H
----------------------------------------------------------------------------
, h) j0 P& \7 c5 H1 J* g. e04inc.php
* `: o I: W1 B' b0 |<php3 A, P' H1 u' H1 \! E' y6 v
: O6 o7 f% d: ~ L+ j+ ^namespoc_e Core;- f' ~$ M$ r1 r0 Z! [2 m
include '05ou.php';
0 T8 `+ k/ y! A) Qfunctio_n showinfo(){( \/ r. t! f1 c
echo __METHOD__,'<br/>';5 _3 C$ s! P4 T( {0 C
}
- a. j0 |2 |6 Y; f0 H5 ?! M# w' G' X0 ]3 v2 o! s! Z/ `
new \Controller\AdminController;" | t9 e% Z: l' t
----------------------------------------------------------------------------3 L; w' U. F7 W/ b6 V* D
05ou.php
! J5 ]# f) Z- }. w4 R<php/ }5 C7 o) J5 D+ q/ [! {
namespoc_e Controller;
5 ^* E6 J" c# t6 q; V4 w) o( H+ v6 Q' ]7 A" V5 k! p3 J. K
clas_s AdminController{- n3 ~. r( f+ k5 X+ I
public functio_n __construct(){ ~. _" S" k6 x! K% S
echo __METHOD__,'<br/>';
- D7 @9 }4 q7 Q4 t7 @; |$ i% Y, s }; }2 K; g; n) i6 Y, g
}
& W ]% w( U* v6 n3 v----------------------------------------------------------------------------1 v# l p! h) W4 j
6 Z5 X6 q. B( N. @* ]4 D4.引入空间成员: d9 O1 M5 h2 j# m
7 U' n) T. e9 F" S1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
- z& O( H$ Z5 p D4 b o; C9 m! \( G0 x" q% O9 X
----------------------------------------------------------------------------
* r! I; {% }/ Q: t0 E/ [; Z/ `' I
4 o; Y1 g9 E) Q i04inc.php
. U" J9 y( j4 D+ E% e7 f7 ^9 v7 h<php' N; l& S8 }4 ^% j+ U2 u" q$ P- w
namespoc_e Core;
! O; F1 M, }2 v% K; n0 Yuse Admin\Controller as con;; \/ s2 F; |2 |5 l' o/ k# i
- S9 O) f# X' C4 w
include '05ou.php';
/ j! x" D2 H3 u' O
0 O- p4 o$ W+ Jnew con\AdminController();+ y9 h7 V) P/ V
----------------------------------------------------------------------------
! I( A+ _( Q9 V( C7 T/ X7 x05ou.php
* M5 k# Z( ~; A+ U<php
6 Y) _1 \5 m3 `1 Rnamespoc_e Admin\Controller;! G. l- {& M. L- b0 o: W
; v$ K8 q6 F% O) i' K9 `5 F
clas_s AdminController{
% _. F$ Q3 }/ M% D8 P; s public functio_n __construct(){
6 p2 T8 j! I. f7 c+ s( J echo __METHOD__,'<br/>';9 T+ |' O$ ]! |5 f, d
}
% ~# J5 p0 N8 }+ m; x/ K}
1 ^! V4 w4 ?: W+ J, ?----------------------------------------------------------------------------
2 H/ }! m9 A: y9 X4 L2 g% f, S2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: N/ z' w" o3 n) [" ?
' f/ Z! o9 V! y1 c) U* w! \7 a----------------------------------------------------------------------------
, H& t0 k& d$ n% b% F% [6 a/ c3 ?& I: v# L
04inc.php
, Z3 R2 K$ J% D* |" e- G! T# \<php2 T$ H( o5 i; `! u% b. @0 J
//引入空间成员类
: K" e! _1 q( j- ?9 r8 k
5 H9 U- e/ D) {# u) V; g5 snamespoc_e Core;
% N6 o. ? J) D' Guse Admin\Controller\AdminController;4 ~$ D x- H) v/ V6 V9 A8 |
include '05ou.php';
) [$ k" c8 k* w6 l3 @0 i, V. Q
6 r7 s5 ~' s- R( B; mnew AdminController();$ o8 o* x3 E* J3 J$ N9 B) V
----------------------------------------------------------------------------8 s( ~! W. b% n: w* L, D
05ou.php+ B( ~6 b1 ^" R
<php9 m2 f9 }9 y% L- E1 I. k
namespoc_e Admin\Controller;
" U( k+ |' C& K. q& i6 T& w: K. g) G( ^; U+ m
clas_s AdminController{
# P) u) D8 w- o7 g+ c' N) u public functio_n __construct(){
' V# y6 y) f: z echo __METHOD__,'<br/>';! I# ?, q1 ^' p, u. a; R
}
6 W, V/ T5 h3 _) F" r+ t2 Q}' t1 X8 {/ S+ L0 _& Q
---------------------------------------------------------------------------- p8 S, j3 O, i) l9 j) X7 y; o
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。0 y5 u- z1 g, q, h+ c) V R1 a. b" T
) G3 s, n7 z5 ^; O
6 j- D+ k e8 B, H
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 e6 G! k& X/ v0 u9 ]1 v# d
3 H# S: p: g* F5 i6 n2 N2 `4 t
, g3 H* P3 j& p" p/ a
6 P; {0 {4 B, e3 Z7 |9 C9 f
/ ^6 R0 R! r+ V9 y# X$ G) N. Z0 z
3 b* S/ _5 N$ I- t- O4 m& V$ t' d |