1.命名空间的作用:
3 v$ b6 A# H l( v8 J+ p) K8 N [2 n2 H& j0 h- ^- W' g
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:7 ^1 M' R; y. G7 `
" G, L& A. u+ O+ g) ?5 A
8 p+ |% [& {4 o4 ~8 O, t
% ^# e T, A5 q: m" V+ k我们来详细的讲解一下PHP中的命名空间:- ]4 `! z* i5 @: E. p( P5 d* w& e E
8 i& p: l! Q5 n$ k V9 l
语法:namespac_e 空间名\空间名;7 Q; j/ K' c: z: [' o; L( z
+ P* W. M; b! g1 r说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
7 e/ L& U' v1 L* U. m( K3 z+ a: s1 g9 `7 ~3 h/ J% x8 H
----------------------------------------------------------------------------
/ ]3 X$ s5 X! J* M( Q7 {% O7 q- t, R2 o! Y. C0 |
<php- J1 k) X& h5 j' _, ]: F" v! Y
6 ^& a9 u. l6 h0 M6 L: {- b" M
namespoc_e AA;8 `6 {% Y1 M2 h: A- w( w" v
functio_n showInfo(){( S: B0 \) A' m9 A* I: t
echo __METHOD__,'<br/>';2 m. |2 C% o. q! l8 s
}0 S" K: H# `9 V
showinfo();5 L5 t/ C( x$ n6 |0 b% M6 \) X
# v% Z+ }$ H0 T# u" Q3 D
namespoc_e AA\BB;
: w/ q& s; k, v) K, A- x, }) J5 g! E, I& O4 e, b
functio_n showInfo(){
/ N+ j8 q3 M! k. U- B echo __METHOD__,'<br/>';, I3 E$ |* H7 |1 A' T1 v1 S
}
2 t- _9 h5 Z( I6 U+ M. u//showInfo();6 e5 N9 o) v) K' y* y/ u
----------------------------------------------------------------------------2 o6 x8 @+ J/ [
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
! L3 Y9 i4 s7 P) P% |4 k% I' a' @+ Y9 o) U, q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。. K c6 z. n, V1 c- Y8 \8 M
( T- R$ w0 j6 }* M D# M----------------------------------------------------------------------------
" f: V5 d) }7 J. x/ l0 `9 o! t E: `' K& U
<php T7 P5 B0 a* b
namespoc_e AA\BB;; W7 c& s3 c I3 P. n2 D4 \
functio_n showInfo(){
8 T! d" g% V. `$ ?7 N9 n echo __METHOD__,'<br/>';
7 A+ `/ T7 f0 W/ `" y6 }, S5 I K2 ?}
- y: S& y: L, f$ K0 k; |namespoc_e CC;
* f: B4 `! D O8 pfunctio_n showInfo(){% n3 ?! d1 x4 b6 G/ z
echo __METHOD__,'<br/>';
+ F- d4 p5 f/ _, n}9 V, O! M! q I% M) ^: S- Q
namespoc_e AA;
6 }( }4 f/ F' B4 Dfunctio_n showInfo(){
+ [9 b: L+ G n% o# r$ ?' y echo __METHOD__,'<br/>';
& U1 Q6 w! q/ r% d$ t}; E$ c' }5 I+ f. s# W
//非限定访问:用于访问当前空间中的成员
2 z5 m" n. V* D; O/ F4 r6 qshowInfo();1 l+ G8 \ c/ d+ i' f. f
//限定访问:只能访问当前所在的空间的子空间中的成员8 a2 ?8 M) ?" \
BB\showInfo();9 g: \: G+ D6 i9 y. j
//完全限定:可以访问其它所有的空间的成员
0 C/ J& B' A$ c8 E\CC\showInfo();; k3 [9 C' m$ z* l, ]: o2 d
↑根空间标识符, A: ?& J0 \ H( @+ ^
----------------------------------------------------------------------------
" c& d0 C2 }/ C" X( G* k但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
5 F1 ^5 K6 }4 f4 v1 h7 z: f3 r! p3 c, N
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 ~& K2 X P6 P: h9 m4 q
: W) a b# m8 C5 V) |代码示例如下:
& _3 x! I. T& D* q; B2 \% f8 ?3 N% R- ~& q+ J6 i2 Y# I1 N
----------------------------------------------------------------------------
0 h) ?% q* l6 _. \* o, X3 }2 W. U$ {% I# d' _
5 p- G6 m2 L/ J( s! X4 j$ L& C04inc.php
3 ^( y% w, |" o) M9 X+ Q+ B' E<php8 r% y- M5 @& g* c! B
( M7 S0 V) z% @: ?namespoc_e Core;1 ~( q6 ^: u0 Q) w& W) ] r4 I
include '05ou.php';7 f) K9 B) j6 |! \, {/ Q5 C" n
new \AdminController();
/ r# `! P# X Z6 n SshowInfo();1 I& [6 _) ?! Z o" K1 \ R
6 P( C' P2 P6 p% u8 B% J- b
echo P;5 m, v' E1 y! {9 \- T7 J
//根空间中的成员,只要类的访问必须加‘/’
+ Z1 h3 A X4 i& Y8 }: \" G----------------------------------------------------------------------------
+ M- T, R1 b7 |
' E2 ^; h3 {' f. U8 y/ f) N05ou.php( S& K, o+ |+ D( b* V2 g% D# R; o
<php
/ r- V6 r& D$ S( V3 qconst P=5;
" U0 M k% Y; I% u4 D
- x S9 D6 W+ f7 ?functio_n showinfo(){6 A: w; i) A$ B, c! @
echo __METHOD__,'<br/>';7 o O& v2 K C! N, e
}
- ?& x6 n& _% P9 ~8 h( K+ \- { R
clas_s AdminController{3 Y; [. r0 n i6 V X2 A
public functio_n __construct(){& |' V. D8 b- ]) |# M
echo __METHOD__,'<br/>';% B, w' z1 h6 K2 c1 d. e" R
}
# O5 F' b" c% y}; n4 w# |$ c1 ?1 B; \
) S; z) s# x4 z) c) l第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: S! [; s' S: @4 Y----------------------------------------------------------------------------
& E3 L; n8 L3 I3 }& `04inc.php
+ U# O$ \+ F9 u<php
4 C7 w- }% p8 V2 F0 g' ~7 j
6 ?5 N8 ]7 Q% e8 Xnamespoc_e Core;( p) M$ i+ ^3 L
include '05ou.php';
4 r/ |# R- `( N* Dfunctio_n showinfo(){+ \! [" U! i1 j4 k9 a/ i& [5 h) S( s
echo __METHOD__,'<br/>';0 v( Q- g2 A; l+ ~4 N& p) h1 p6 s
}* ~8 q+ K/ f2 v6 `+ Y% g7 m
9 V* n @; S: A, V
new \Controller\AdminController;
4 ~) r3 h4 B& k i8 f& L----------------------------------------------------------------------------' U) P5 p A0 h, s4 I9 |
05ou.php
, l& T0 ~ p8 p& E8 O<php; u- w. s( L% ~0 s- \6 M
namespoc_e Controller;1 x/ S' b% x. n z
1 G8 R( f4 b9 L g0 S4 F" y0 Rclas_s AdminController{8 i) C v' a" \( C" q* o
public functio_n __construct(){
; ]9 L: o2 `9 _4 { echo __METHOD__,'<br/>';
. r( u; ~2 x! R2 {, d- G }
. P3 P! Y5 }) v7 f0 Y}
5 b* C2 T" H7 R5 l/ ~/ S6 O& m% }----------------------------------------------------------------------------
. r9 d3 F- N" R3 J- o- D7 i' T7 M- v+ z' ]
4.引入空间成员:: N6 I& [$ j% H! \7 B
6 \+ P4 }: F9 D; H1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。: Q3 j" B9 Y, u5 R# B
% ^, q$ E% b5 I$ y----------------------------------------------------------------------------
4 K& ~+ k) [" J+ i: H+ ?$ S3 M! ~* N8 R9 f. G
04inc.php- `1 z7 e8 H! H O
<php w. Z- O, j. Q7 i
namespoc_e Core;5 W% x0 d0 u5 a0 w9 n
use Admin\Controller as con;+ U2 m& P( i! k8 e) C) O
* y0 j- v" M% y: F1 g5 S @2 Zinclude '05ou.php';3 x7 {) G+ B0 @: W. V
# m' z0 e8 t W
new con\AdminController();
. |' p9 V4 ]) B9 C" B# J0 C----------------------------------------------------------------------------9 @* j( |3 d& Z
05ou.php
# @! @8 e0 D2 S- R+ f% m<php
- o; J) s/ Z5 d# h/ y2 r( L) inamespoc_e Admin\Controller;; L: e8 H" W; }) V1 M
7 L* C% S8 z' s/ W) L: Z% n: L7 ^clas_s AdminController{& `: D. ^1 P! y$ M2 H3 v0 B
public functio_n __construct(){' ] P( {+ Y4 O6 `" ^
echo __METHOD__,'<br/>';
9 N6 v: o5 e* o C }
2 F+ c/ O' X; j- X0 _9 j2 _}7 k& f8 z; H- v
----------------------------------------------------------------------------
2 t1 C4 Q7 t5 P2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。4 b" z% c n8 n1 ?9 N/ e2 k: h
- I6 G A3 i' T% N# z: _----------------------------------------------------------------------------8 S( {; Y% y, F" z! h! Y
9 G) D9 w3 O0 X- \0 G
04inc.php. Q1 f- M, v* F& q, c+ S
<php; T; a6 D* x3 N8 }5 F1 r
//引入空间成员类
: l9 y7 b6 f0 w; Q/ U+ z4 h" Q
2 t- o6 {# s% _( b8 e8 @namespoc_e Core;+ J5 ^7 O( V- q3 H
use Admin\Controller\AdminController;
: Q+ A0 u5 H0 s0 r# \include '05ou.php';
r9 u& [. w6 p. j8 z) A/ i+ D. J H5 `
new AdminController();
, s' B* X3 `- x2 ^' C3 n8 h----------------------------------------------------------------------------$ }( u; O: Y1 j3 z0 x
05ou.php
# W, q/ q7 ~% W! p) B<php$ c N, w6 p1 I6 g6 I
namespoc_e Admin\Controller;- H3 m& n W; B( ?) J; q
/ b7 x$ u6 G; F7 M/ @+ O: C! f) e0 {
clas_s AdminController{/ K0 w+ _; U- c
public functio_n __construct(){ `! x; c9 ?( i" n
echo __METHOD__,'<br/>';3 x I9 B7 J4 J _" B
}
8 d& M# K: g% I. U! ]}1 b$ `7 P) d8 y9 \
----------------------------------------------------------------------------
- i! x/ ?+ i9 h. K! @; F5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。% p f9 S, \/ f. F+ _: L* B
6 Y8 m; n2 c. n) A1 q
_" e- Z5 S: J0 A( d8 K7 D; _
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。4 |% K: A1 x+ d$ \2 i$ T
% B8 B k7 p$ `1 K1 K2 s
; N1 ^& U P% L# h
" R8 j/ d3 D) j3 y8 V9 E6 w) t6 ^& s
6 o6 W2 v9 Z# _' z. W7 L- N1 O6 C
! o0 w- J. k4 B, h$ g7 B+ m* ]& Y4 A# ~- A. ^7 ]7 u$ n
|
|