管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
u) s# X; W; {. M/ s5 P" i$ D. c
, H* g. @ u; @/ p i2 g" ]在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
5 a" L# k( |( u3 R# ]' L: K' R1 t; Z! J2 b2 j
8 P4 |- F5 l3 h- @
8 m0 ~) C: v: Z( Z! j, [我们来详细的讲解一下PHP中的命名空间:
& M% E# V# k! _* H: U) v; r0 w2 u- U } w7 |/ G u
语法:namespac_e 空间名\空间名;
) l g/ [/ |7 c# q7 \' N5 N% l* c p9 ]% N1 `+ k: j. U! M5 n
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 [0 y. g- s; R4 g+ g
$ A# r J/ ?" ?+ T# I- z2 l9 q1 C
----------------------------------------------------------------------------# ]/ F g0 q4 \! F8 a* M
, I0 M, m' I: C
<php, V0 i8 r- ^3 u! y4 S* J4 t
( |9 j& d( d( P9 Y; w% N5 onamespoc_e AA;2 w! S+ L; f0 F7 n! I! z' X: z
functio_n showInfo(){0 V& Q, [+ A4 Q6 y
echo __METHOD__,'<br/>';
3 ]3 W- E$ `! F$ ~1 j) z0 L# ~}0 D3 M6 K$ E5 E& G, h6 R& v
showinfo();& F1 h- I8 m+ S' A( P9 R& ]
% }+ D. P+ d5 P7 Qnamespoc_e AA\BB;% t+ G7 K4 {: a0 x8 G. `! |. P' I
& i( U, }( {* L/ Efunctio_n showInfo(){
! Q' e- t) `- b echo __METHOD__,'<br/>';' N/ g& h2 V; k6 ~' W( a' x, O
}0 |' y! h' t& S' Q, d8 B
//showInfo();% j" }5 Z- a9 @7 _) ]* B
----------------------------------------------------------------------------
( ]6 b( |9 X+ Z# l8 i0 r7 F2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
# b) e$ M" Y0 s9 c; j1 t$ U' p6 Q: Z6 y1 L% `: ^6 @
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。3 @3 }. ~* N2 y
* U0 f! S6 }0 h1 z
----------------------------------------------------------------------------" ?( u2 r% M# _" [( X4 t
. @9 P6 ^1 D" {6 o+ l<php( ~9 I+ {6 U& U
namespoc_e AA\BB;
% G- V4 J" E( w9 ?8 efunctio_n showInfo(){/ F* y( h2 P+ N& {9 n- ~+ J) `$ t
echo __METHOD__,'<br/>';. P. v4 J* P; _# z) H, R- M' d/ W
}
4 G7 w% q; I6 b- w0 G C/ T4 x( f2 jnamespoc_e CC;
l0 m- Z& _7 i8 x4 ffunctio_n showInfo(){1 K. c7 J1 N' Y8 G1 k
echo __METHOD__,'<br/>';
6 s1 J: ^8 J9 l}8 d0 z3 S+ |+ N5 C1 W' }! ]
namespoc_e AA;
& a* i: t# q5 ?3 i, h3 V4 Ffunctio_n showInfo(){
3 y7 y* s5 z5 v. ~# Y# h echo __METHOD__,'<br/>';
( `& m7 V/ J, c2 Z& A( C}
2 m, W1 m% c, @0 \4 @ b//非限定访问:用于访问当前空间中的成员
; D. Q: @- b% s- h' xshowInfo();3 Z$ y0 R" P) }. c* y F3 ]
//限定访问:只能访问当前所在的空间的子空间中的成员6 W3 G/ T+ n0 _( q2 V" M5 X
BB\showInfo();
% W" X7 {5 M9 N8 G& e9 P//完全限定:可以访问其它所有的空间的成员# K1 q% x& s+ A' l$ V
\CC\showInfo();! T% x N1 l. d3 [0 x' _
↑根空间标识符
1 M8 L$ K# Z" U5 C----------------------------------------------------------------------------8 x) h& d) [5 k9 ]
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
( {; Z" X6 N: r: r/ T6 r
5 V) @; S" X" z当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)( d, T9 F( `. D
. H( s# e- o2 L; r代码示例如下:4 P2 N( s. f4 x0 V) s/ x$ e( B
2 ]7 D3 I8 r; F; N! _+ u* `
----------------------------------------------------------------------------# L) u- n5 D0 E; I! g- @0 C' s
: M; [$ \3 {0 E* f- q( ]
% @7 ~& |9 {' _
04inc.php* F& q" i' k) d3 y8 A
<php
7 u8 |) a; q; i4 z
( r7 J( K8 U, v0 Enamespoc_e Core;
9 f; m' h b; {include '05ou.php';& z& E) p& V, a2 j
new \AdminController();
$ {1 K% r) s0 G1 YshowInfo();
[0 e6 C3 w% w3 M/ r& C. V, W1 I7 ^. [: x( z* A8 e5 z! Z7 g
echo P;
5 s! }" X! S/ v" |' z( y//根空间中的成员,只要类的访问必须加‘/’* a- B! v9 _9 x! ~& O5 {
----------------------------------------------------------------------------: D9 H) e; t# j
- g$ M9 \; g+ E5 p' Q05ou.php
% i6 T0 s# N2 V. h9 `1 u$ o<php
- o) v+ [9 I: m7 K- dconst P=5;, g* O$ Y/ }) `% n- B) `
# s; M# `7 u0 R) |8 G
functio_n showinfo(){: ~7 N! A- j Y" V
echo __METHOD__,'<br/>';
2 m, S( S2 K) r}, q9 n3 x* W% l; S
! h; |6 h: W4 H3 A+ F5 P7 k' [0 z
clas_s AdminController{% a- a9 e+ A* ]/ y# s0 _3 B7 i6 e
public functio_n __construct(){
& v. S) V9 e7 j echo __METHOD__,'<br/>';( f2 f0 W# f/ `$ N0 r. d
}
$ @* A$ z# b8 U* A3 }0 p}% }9 S2 v8 P, D" O/ r# ~
$ G( ?# x, s7 m. t% D' q
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
9 j) e5 M) j( b: d; @! x6 T----------------------------------------------------------------------------& l4 u" V/ |: Q6 Q" ?/ n# n
04inc.php" K8 ]9 w6 T8 u! Z/ P
<php0 H; J+ c5 h6 B1 J& ^2 m. T0 r
( I0 s8 L" l% B" P( ~$ snamespoc_e Core;! O6 v$ p" o" A% D7 ?/ J5 Z
include '05ou.php';
; d) r% J& b3 I$ ^5 k" n& Hfunctio_n showinfo(){
4 l' d% l9 G: M) A0 I7 n5 b2 x0 ? echo __METHOD__,'<br/>';! Q! }2 N; K' L1 h
}- S3 n; N4 E7 y* ^9 a- M2 C8 I
& \. O7 z' ~9 K& A+ I" R/ s+ W
new \Controller\AdminController;
. R1 B, U3 F( \, }. r# ^$ y9 r) C----------------------------------------------------------------------------* v& r$ j# T( g; C# {+ _% o
05ou.php
, z2 j- Z: V* c! _6 ~- b) I# k<php
/ f" h) Z! L8 a9 s8 q* `1 I# lnamespoc_e Controller;
! O2 d, v/ _% E5 L9 {# n! I
# k& N2 C, x% t' cclas_s AdminController{* ^- `5 ]% G i
public functio_n __construct(){; X& V3 O, I. E; h
echo __METHOD__,'<br/>';
$ d M: s5 C2 C- |* {0 D' y }: a. Q9 L& W- L- w" M
}3 O8 E5 U8 e7 ]9 W2 k' H
----------------------------------------------------------------------------
# w& W* x# r. F
. ?4 N0 [) }; b2 V2 d6 b4.引入空间成员:- F" y) g% v) `! m
( @( H2 H- X" z* H0 `( M1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。' d( I. M% ~% J Z8 I
/ I/ z; t; c* r! [. o( E
----------------------------------------------------------------------------- `9 @, E* K# `$ l) V6 `7 q
2 @# d. U& }* o. e, @
04inc.php1 `. o# g& I. E0 I7 g2 \! P
<php
& L! V! a# L! e v5 b$ rnamespoc_e Core;+ n4 s2 Z, n- x
use Admin\Controller as con;" o A/ A: v8 a a
}0 Z, ~5 _2 T$ h
include '05ou.php';$ r7 V% j' X7 F; C* T' z
; q; A% V7 e8 x$ b$ n u) |' M1 r
new con\AdminController();4 W7 u* ~/ u" `( M( g9 C
----------------------------------------------------------------------------3 D* R5 C+ O7 W0 D) w# |! d7 \
05ou.php- S& W9 F$ p, ^* Q$ h+ U
<php
* q2 C; o2 B' F( n. ynamespoc_e Admin\Controller;
0 Y5 W! `1 s/ g9 N1 v; l% d; Q. r* S0 m
7 r( d5 v/ a6 |4 N n+ i" Y: cclas_s AdminController{) X1 G; b0 b) _1 P7 _ e
public functio_n __construct(){
5 p2 ?! X4 O, ]+ w9 j ~ echo __METHOD__,'<br/>';; F6 X8 u! n6 H) E1 o2 J
}1 Q8 G0 O8 h& [2 E/ N0 G4 q# h! m4 U
}
1 g0 t# ]1 V& D, u----------------------------------------------------------------------------5 l& o! ?# r3 X; V3 a5 Y4 @
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。5 x* X4 s ]" ]7 s! ^
. U( c3 g0 X6 x7 v# w0 C& l+ q----------------------------------------------------------------------------& r* y" a' {* N1 d. C5 F
2 ~1 k0 P! M' ^; o! h04inc.php$ _( n- q! L9 x5 p9 ]+ q" A- A
<php; D; g7 l! d1 o, J. n& M
//引入空间成员类
" u2 u0 P* s: e% J* z, F6 ?; @: ^) T6 U
namespoc_e Core;; E! V5 F/ b( S1 Z* e3 H3 r
use Admin\Controller\AdminController;$ c7 `/ ]- e8 w9 `
include '05ou.php';
; f6 B: A2 { C: }- _; ^% ?4 m4 }5 }( ^; p
new AdminController();
$ }% ^1 ~, z6 ?& }6 [; ?, v3 a----------------------------------------------------------------------------- t! A2 }# b, }' M0 X* v9 F
05ou.php9 j% m3 E2 Z5 n$ _. [* {( H
<php+ ]3 x+ [6 y! j. {& [" ^$ d6 S
namespoc_e Admin\Controller;* x w6 X: k" v% f5 Q
# c- \& B1 y4 ]2 G4 i x7 Yclas_s AdminController{3 ]4 E2 j: B0 P& \6 H
public functio_n __construct(){
! @$ D0 f* V$ P0 y# u Q echo __METHOD__,'<br/>';
9 w( P1 R% D f, _, I1 E }
2 m3 r8 t: A! `0 q+ {}4 h. G& D# N8 F/ L& t) n
----------------------------------------------------------------------------& \! ^7 ~( {, `8 N+ ~$ t
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
8 J. h0 f5 j' `9 G/ T& Z+ V
6 Y( E' v K4 }( v. g9 Z
0 r& v) o5 v: k/ U% I这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% ^6 g8 T5 G: O# ~+ t1 T1 z8 C: o+ I ^$ N+ Z: A& K& Q! I
" W0 t3 `: F$ o( ]0 S* |& a+ X. X8 F5 @& f
' ~" O6 t7 ~4 ~; E$ _; R
' M x* {0 R, C* v
# A8 h; B1 V/ M |
|