管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
* r9 w0 a$ Q" F' `5 l
9 A6 F& {; }& q9 C, w在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 y0 r& T! A9 O n0 @9 F2 @
& O8 u( v/ h9 Z( A9 ^2 v
8 ~! Z6 L! E1 @$ l1 u! ^; @0 e7 ?& W* M
我们来详细的讲解一下PHP中的命名空间:/ ?3 p+ { N& i% p& n
4 Y( y S3 ^: W
语法:namespac_e 空间名\空间名;
0 e5 b8 @4 o! z! L* I5 Y2 | x- `$ i$ F5 U
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 \; Q! R* G' `% o
2 y! y3 F f0 P, }% T# Z# K% B
----------------------------------------------------------------------------; b" j& ~" j& K' Z8 O
/ \. y3 q# e. R( w# |) k7 X
<php
$ L1 V V; V' K0 n6 w7 ?* t" |, f
% N% i2 F; q0 Y# K3 \; [6 J4 \5 anamespoc_e AA;
# M" d) Q2 z! A6 ]9 Y3 Z5 c0 @functio_n showInfo(){
2 f8 g; a# _4 U; l3 d echo __METHOD__,'<br/>';1 l' F( k5 P6 z9 Z# |. d1 G
}
# ~& \' q% ]0 |7 T* Rshowinfo();0 H: R3 V6 y" r. e2 Z% m2 w
/ E" a l- y* q" S/ onamespoc_e AA\BB;+ J2 }( I( I9 U. l4 V. T
h* V4 N' F( w" P3 d+ E" q. Nfunctio_n showInfo(){
! i- }" n I& ]1 S7 L echo __METHOD__,'<br/>';+ ~ \" I0 R! h. }) Q+ J k0 r% l
}4 P; M7 A/ @: Y/ ]/ E5 F9 N }
//showInfo();. r/ g! A0 L/ J. K* l5 R
----------------------------------------------------------------------------" \( T' n3 y4 G2 d
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( {- Y; q* H+ W, O, ~5 R
( a" |0 q5 C, W4 M3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。0 w9 K# t! u& |; g W* G
5 T' B* C5 `+ e$ w' g* w----------------------------------------------------------------------------
$ P+ y9 J1 E* G, s% K8 u) S. b E' b: n8 |: }2 u! m
<php6 V$ y* v6 p" u4 n0 A: I
namespoc_e AA\BB;
- }$ R! ^+ m0 `functio_n showInfo(){6 l( n8 J f, {, T
echo __METHOD__,'<br/>';3 z' _$ q. a7 h8 a
}
8 A9 c) Y4 s7 i9 ?namespoc_e CC;
) I! j7 z a1 Y3 g. Pfunctio_n showInfo(){' Z1 g9 J/ f8 u; d- r. A! q
echo __METHOD__,'<br/>';4 N% {$ Z7 t8 g& i8 F4 p
}
0 y7 @6 v* w+ E% Pnamespoc_e AA;! Y4 |3 F- f' r$ r# I+ d- ] S3 s
functio_n showInfo(){% p& a) T% P6 `1 K. J/ L
echo __METHOD__,'<br/>';
% S/ |- g0 l/ W% F/ A$ o4 g1 H4 b}
( w2 b1 h( \. o" y0 N1 `1 M//非限定访问:用于访问当前空间中的成员9 K J& g Q5 d& ~ ]+ q/ I) i
showInfo();) s& U3 X3 j+ u C9 O* h
//限定访问:只能访问当前所在的空间的子空间中的成员! b$ C6 M2 d# \7 ?. _
BB\showInfo();
& |" R* b1 z5 ^& b: W9 _7 c//完全限定:可以访问其它所有的空间的成员
- f- P, ^7 j7 t\CC\showInfo();
) {; V* v5 V( v# K; e* {↑根空间标识符. P0 m' W3 I( g
----------------------------------------------------------------------------
8 K0 a8 L6 B5 z: W' B但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
6 c) F# B0 i' P7 r
& ~ T& V2 y8 ^5 w( @: m/ t" g当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
6 R# U2 v, f& R; S s: S: i, p" f9 n
$ l% J B9 }% N) L代码示例如下:6 `' K2 b9 t) ?* p
) Z8 |5 o& m& ?7 ?( Z. ~1 W
----------------------------------------------------------------------------
3 R' u& Q4 A9 f+ f U0 H8 h) S" t! M) A# q. b9 N) d
% r0 G1 F* g5 I* a- u9 g* t! V
04inc.php6 L0 H' ]$ d( Q4 Q) H. Y
<php' @* @( G& l+ I) {. o) ^
8 ]; W2 _2 Q% r Z8 w& a8 N) w+ c
namespoc_e Core;8 x% {; d; G5 N8 `/ k* X8 F' ~. i/ \
include '05ou.php';
" ]% m& p% y6 c2 Nnew \AdminController();
' C L9 h* s; B: D. a$ \: BshowInfo();% u9 ?/ t, @! m" I z& ?6 q7 U
s* F% L' w7 Pecho P;
3 q$ D" y% q% F& l% V3 C# O9 a//根空间中的成员,只要类的访问必须加‘/’
4 S' w4 v8 M7 P----------------------------------------------------------------------------
+ m3 o; D2 C s+ ~4 o
) g' w6 v( {& J8 C' R7 e1 ]/ C05ou.php- e9 v9 q6 w% M
<php$ x, X3 o) I2 E. e. o
const P=5;' u: P- D* `# {. X) o1 z- O
2 c, P, v# x" s- A, m( |+ h p. q
functio_n showinfo(){
( F- e2 R! p7 M$ A$ M# E E echo __METHOD__,'<br/>';. Q- B0 L; x% ^/ _" L# V
}
) \' N* o$ C) K$ a. G& u% d: c& R9 t6 }( S C2 h* _( \
clas_s AdminController{
/ s' E9 V. B; C% ~* ^ public functio_n __construct(){) U7 I Z8 F2 H- Y# ]2 a+ A2 F3 C4 ]
echo __METHOD__,'<br/>';
2 B$ c! G. q4 R+ Q; m }
: Z4 S: Q& w* H}
3 {: h$ B W; C% c' t8 v0 u* D p+ W* M) c, J- L/ ^9 H. i
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。 Q! t6 ^# z1 w
----------------------------------------------------------------------------9 h. X: q: d" `7 o9 k- B
04inc.php
b2 c, N6 M5 ~- K& |' ]<php
2 P1 E# L% m- M, ^; V1 ?
8 h/ m" b% G7 r$ k% R, cnamespoc_e Core;
7 Y- A& g v X' \include '05ou.php';
1 ~8 O% W" {! n" e% Gfunctio_n showinfo(){
5 ]7 F, U4 X9 v6 r3 H! Y echo __METHOD__,'<br/>';. V, _, Q( h" p9 }& Y. c4 b
}
0 A( q* h( l5 Y
1 E2 c, h1 t+ fnew \Controller\AdminController;7 U- B+ D$ {; h! o' T: N) m
----------------------------------------------------------------------------
1 ~0 k$ X {+ D" H% H9 U# y2 e05ou.php3 T" b: h7 p: h
<php
1 J! o6 N! @% m4 q) nnamespoc_e Controller;
" [3 `) x8 k; a2 `( u+ _& x1 o( s6 @+ [; @" Q
clas_s AdminController{; a/ ~0 d2 W1 \( o
public functio_n __construct(){
5 W8 u0 K! n/ c4 C$ O% q& A echo __METHOD__,'<br/>';
( i- W+ O1 c4 |/ R3 Z3 g Q }
( u9 ?. B% W5 U* H9 \& {& k}
8 g) S" n. O" o1 N----------------------------------------------------------------------------
b0 N9 |( v( q( }% A5 v( A3 p' R" d8 g0 N
4.引入空间成员:
8 w3 z2 p' d3 T* {- y2 s
4 _% t6 {. {) y, r2 {! { J1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
+ `' j4 g$ I/ t( ?; V2 N
* D& ^) x) Q. v4 O' ~8 ^4 i, d----------------------------------------------------------------------------6 ?2 v& c8 O+ e% u/ k2 p
F/ N$ D0 [, j: x& I2 n
04inc.php/ s. W" S( L& Q) h4 y
<php
+ E6 z7 L% q7 W' cnamespoc_e Core;
1 D& O, u4 w3 D1 B. ~* r; Y$ ause Admin\Controller as con;, l- [$ \. H5 w# a& w4 u
) M8 I( y- T. ] r7 F" Vinclude '05ou.php';
' g" R8 o' `$ i5 {: }* U% ?# x% C$ y" F
new con\AdminController();' s# n8 {6 H! Y% M0 y
----------------------------------------------------------------------------
& _9 N+ _3 E7 O1 e; Q05ou.php9 @' o4 w3 Z g3 C8 A' t: H( j
<php
4 {# d+ @) j; J, S* a3 b! ~7 D `namespoc_e Admin\Controller;
6 O: s. z' o% c5 ^( ?0 _8 n) H
t& d9 i# E: C$ c: a. l4 [clas_s AdminController{# ?) R9 @5 Q! e3 k8 @8 _
public functio_n __construct(){ [7 j& @( [ `9 X
echo __METHOD__,'<br/>';* A* H; b, o0 K& W& _& y( N
}( i3 E& \9 x @- v
}; j, S' I* j' x* d: V' z. F- K, }; P
----------------------------------------------------------------------------
s) I; H4 T5 P" f2 `2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。& t+ r- F( J' _, N
- @0 @4 ^* v- f0 t: V
----------------------------------------------------------------------------+ v. w- m. ~5 h$ i& A/ Q4 f4 v
6 z h3 m4 S! Y9 @# p/ `# z# V
04inc.php; J0 A0 w% p" A# Q& c
<php
0 ]# p+ k! z3 R# ~: v" Y g. {//引入空间成员类& p: F7 J3 e& Y8 I/ g
7 z+ F/ _/ }1 Y8 w, u! o! g! P
namespoc_e Core;
' {' ?, U* p$ s4 n* m3 Y( wuse Admin\Controller\AdminController;
0 O i- {2 r t6 t0 i# Kinclude '05ou.php';
5 X6 a: `2 B. ?7 x# Y7 x* t ^, ]6 ~* H$ ], _8 P$ z, t: D4 y
new AdminController();; j5 V& A) `7 f L8 m0 g
----------------------------------------------------------------------------0 z' f5 c+ ^% B, u8 d' V
05ou.php
- N: G: }) [6 F2 K) h4 M<php
$ U# R. d, A) e6 b$ h1 T+ I; `namespoc_e Admin\Controller;9 H" j) U7 u+ v5 j" h
6 G! y0 Z' e4 u
clas_s AdminController{; x! e$ P- Y+ H+ V
public functio_n __construct(){1 _0 ?4 C+ s$ N8 N
echo __METHOD__,'<br/>';4 T5 J' A1 o) N; e9 r& ]
}; j# Z4 V' F3 w
}* W& }7 l' G: p6 m8 T5 j0 I; S
----------------------------------------------------------------------------
. d; S% W& A, j f5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
& i3 U, p6 E, `4 y3 A. V) [# ~ I$ Y+ J2 f+ \( g" x: S
/ H3 c+ h: Y7 F$ d, w( P) `/ w这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
+ T5 t1 D9 T/ V" X5 L; w
6 C I8 l4 e7 f* F9 ?- M' ]7 k; |2 O7 D5 k& @6 L
- c! e. p3 m5 T p+ U! f4 X$ v# V
* K! w z. ~6 S' W* b9 _0 H9 \0 u0 O( R- q6 f& \9 e
! P, K; T n% i! _+ x- @) K5 p
|
|