管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
9 F8 y2 f6 @8 D7 @1 B* X/ v8 @ c
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:) L/ ]/ p: E& I* @" R1 |
% ], f3 J: C/ G9 L% X$ R( W$ z5 D
! q4 E' O/ [$ `6 g$ P# B
! E5 _9 b1 P! a/ y0 ~& K
我们来详细的讲解一下PHP中的命名空间:% ]/ \( P: U6 S% m# I
3 T3 f5 I: Z7 l3 [
语法:namespac_e 空间名\空间名;: `4 p: G0 a$ J# r" Z+ u& |5 a
0 M$ j! f* L- t6 L; A! l9 s
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
. T- @4 M0 N" F
6 e# E4 _7 m7 |, j9 r, R----------------------------------------------------------------------------
. k/ g3 Q0 H0 C, `( f7 z1 m0 S, E/ n1 _
<php
8 _; p! @3 V1 @6 O8 c
* }1 M [: l8 j* \- d' b( G9 H0 X2 Y: rnamespoc_e AA;
5 h2 d5 \ B( J5 k" Z* ofunctio_n showInfo(){
8 ]8 _& F7 m0 n7 d& N echo __METHOD__,'<br/>';4 p) z- t# K9 W! k
}! h" }% ]$ o0 b5 D# l& d+ D2 o
showinfo();
! P8 a' M, v6 i. \3 L9 z# W; C7 g1 B/ i' M; q& p6 T
namespoc_e AA\BB;+ }, l* A. m$ [5 T& e1 J, d4 b
" V* B, Y! J5 E/ |
functio_n showInfo(){) h$ c# w; V7 I6 C0 T1 b
echo __METHOD__,'<br/>';
( C- |. S' \9 G$ C}) \ a. D% T J
//showInfo();( a3 `, H2 \, L: K4 R
----------------------------------------------------------------------------. [- F/ Q; S( c# {+ y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 H; @0 R# ~2 x, Q u8 |
" j# ^% I( C i6 {3 Y" d/ V3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 g% I8 b' K5 O( g! D e- [# s+ A9 M) ]: o
----------------------------------------------------------------------------9 n: L6 ]% J, X9 M
2 E' _+ I6 U) n" S4 ]$ d
<php
7 l' T* K! }; c9 ^. onamespoc_e AA\BB;
/ }+ ?! Y, q- [ Cfunctio_n showInfo(){
* }+ |% a# ~9 f2 i( G) z1 V( x echo __METHOD__,'<br/>';# C9 I5 T1 }2 q/ V, J l
}( y5 K' q% }. ~5 v8 a& ]! f" }
namespoc_e CC;9 I$ Q+ a* t& J) ~0 ~& Q( {( u
functio_n showInfo(){
& p* f, d( X& z1 N' r; R echo __METHOD__,'<br/>';
- V9 d$ y* D) ]- h4 l}
# H/ x6 `: G2 @) x. E0 fnamespoc_e AA;. |7 @2 M1 X6 M# R7 d# U
functio_n showInfo(){$ P2 i6 |1 f h$ K
echo __METHOD__,'<br/>';
) @* _& E% D. D+ o' I) _# ^}
# x: x$ Y+ D# Q5 w4 u9 M+ N//非限定访问:用于访问当前空间中的成员& {1 X% ~& @" ~3 ^8 a% Q3 t4 R8 D
showInfo();( k$ g+ O" D2 `8 |& c' L g9 l( A# w
//限定访问:只能访问当前所在的空间的子空间中的成员+ |# @8 Z+ N+ E4 _' P8 D2 s9 \
BB\showInfo();
$ v. P: w* W; i' X: ^! L; a& Z//完全限定:可以访问其它所有的空间的成员3 g4 a; u2 v* R% K7 r3 F+ Y
\CC\showInfo();; K R, e. {' o4 ?7 l
↑根空间标识符. f; z/ T4 f. w, Q j
----------------------------------------------------------------------------
7 K: a7 ]( i. i* c3 g但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:0 q: d# P5 r8 v- C7 h# L, r% }
, w/ Q' y" D. A p Y
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)2 r1 Z( O; q, d2 ^4 `* x; u5 W
: j" i3 C4 z V! B$ \/ ?$ w代码示例如下:
4 [5 n: o$ c) N2 n2 s6 f' |# a; K: U" p. q3 u+ S6 t0 \* g6 \
----------------------------------------------------------------------------
1 N% ], K1 i; U# w3 A x
: p* C! g1 j$ |8 N1 h- R+ d% t9 I; V& W. v1 E. i0 C
04inc.php
w9 j/ R- G* f, v<php* _1 j2 E+ Z- c1 W4 \: \6 I: V
9 H( p* l9 ]1 L; m7 G& v5 v: p
namespoc_e Core;
" A4 q, I1 Z- E3 w! X3 ?2 binclude '05ou.php';0 N- u! a+ e4 b) r" U- Q
new \AdminController();9 m E% e) s! Z W
showInfo();
/ g A1 @! O8 `+ Q; ^3 C
1 G# `+ e% o1 Q; x/ {: hecho P;
8 J3 Q( r* ]! B6 s% j) p/ L//根空间中的成员,只要类的访问必须加‘/’' j9 `! r7 k5 K3 N
----------------------------------------------------------------------------
' U8 e( _& k, v% }( v& S9 A+ E$ g. A* i
05ou.php! f* s$ ^; g# ^* I
<php
- T1 s# G) V) gconst P=5;
2 p1 a7 z( k& [
3 E0 [8 k* G( h5 o+ A8 lfunctio_n showinfo(){
% \: ^: a+ ~+ b* f& d echo __METHOD__,'<br/>';
5 U- b% P& P: Z- o* h" L4 a}
' A: V; o* @8 r: x6 Z9 s
- w& g& J2 b1 ?$ Z) z! X4 Jclas_s AdminController{' u5 N5 n# o' p& G3 o. f" C6 X% g5 L
public functio_n __construct(){
. x; T6 n8 P4 T echo __METHOD__,'<br/>';
; }' C l1 {- e' l* V/ h' l1 g }
' R: r$ `# A ^. ]" _, I} I- t! m% o5 J( q2 T1 `: m
% v* G* T& [% X/ [8 J' n第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
/ S$ Q1 `/ ?% E' w4 F----------------------------------------------------------------------------
8 k0 G$ A% a4 V: j04inc.php
/ U. Y9 g+ h1 `" Z$ s) T<php V7 v0 Z3 k* P P
* F7 [1 z% t6 ]7 J* B
namespoc_e Core;
}) V3 G/ K8 a* s [ K- Ainclude '05ou.php';4 L R( J7 k. D" ?5 w, ?
functio_n showinfo(){
7 v8 ]" O* }( ]) A2 k, P echo __METHOD__,'<br/>';3 w9 k0 P4 V+ \0 L# s& t' H" R E
}6 B5 C5 ^6 e5 P" z# P
$ z* Z" Q: c+ X' Y snew \Controller\AdminController;3 ]( W* {. Y f/ C+ u8 A; ?
----------------------------------------------------------------------------4 P* v' T6 i4 @: ?
05ou.php
0 {1 U8 ~7 _+ B: {, u<php% F- W. K: j- h
namespoc_e Controller;- h2 ?* y3 @& g3 ~6 W3 n
+ C+ k+ z) C: N( G5 o* ]( nclas_s AdminController{
( D5 h' j3 O+ {6 r# k! P' q public functio_n __construct(){8 Q" y7 x- i6 T4 ^+ n# ?9 B
echo __METHOD__,'<br/>';
3 `* ^, w @7 _3 A9 l! D* i }
- ^: Y: a$ G: x8 Y9 S j}
3 g" i' [) D. R1 a' {, N----------------------------------------------------------------------------
- n' |8 s: A) f0 L/ ~0 P& U2 l7 k8 N B
4.引入空间成员:
( Y! r4 z; Q! M2 ~ j7 {$ m W! n3 w! f7 x
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% P$ A9 z% o6 n/ \+ \4 a5 L8 u H7 F8 Q. {) m0 [; W( p
----------------------------------------------------------------------------" g* f* V, ^7 j) Q* P+ n, j
0 g7 m( `1 i6 d4 W9 W" F7 n04inc.php F5 q# C3 K% R2 q: }9 [
<php4 [. i( ]( U; r% z8 f
namespoc_e Core;3 r+ M6 K P9 e }8 Q1 |* O
use Admin\Controller as con;: y& |' U" I+ S/ z x( I
5 u# A) s! I) M O3 b
include '05ou.php';* x5 k" E2 }* g& r
5 \3 [ p/ o+ M4 ^7 |
new con\AdminController(); F5 M7 C- \# x X* D1 T
----------------------------------------------------------------------------
/ m- v U; a) R1 Y/ ~7 V6 r05ou.php: X! ]/ K, ^: m0 k$ {% n! z. d
<php
" C. Z& k# q! v% a# ]namespoc_e Admin\Controller;" }" j; z3 t9 d# K e" C1 m
) L8 S8 [* P+ {' R
clas_s AdminController{
) B; J# s+ c5 K$ D- x public functio_n __construct(){+ |2 ?* G9 x% R) e$ k
echo __METHOD__,'<br/>';
, \, D( }% U7 _8 G' Q& k5 ] }
a: M( F( V. b3 j; }}
/ {0 q( ], M& i* y B----------------------------------------------------------------------------' Y9 b) ]$ d6 H: f
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。3 c' A. \6 U( B* \' e: }9 y! O
6 W6 s D; s' x& K1 I----------------------------------------------------------------------------4 |$ ]$ C$ E: n u' E
- i, u* p" C+ h# n+ O' I5 W3 I5 A
04inc.php1 m5 L/ K; v1 ^. r4 k: p8 N1 ~
<php
2 v. k ~' W; K! o//引入空间成员类3 K% S& A2 V& l* j, \6 |- h
! ^/ I% [( P5 T! G. s5 S/ W
namespoc_e Core;' B3 q B2 d1 Z$ N; ]8 Y9 X9 c( ]3 Q1 G
use Admin\Controller\AdminController;
7 M# m. Z9 o9 b" N( y; }include '05ou.php';9 D* U; W6 v' J3 t3 T7 v* i$ j
' U; m ^0 q# ]new AdminController();0 j, U0 m( Q8 ]% _% ~" t
----------------------------------------------------------------------------
: `, n* w3 S+ |05ou.php2 b: I3 z8 U0 c$ c7 F
<php
3 L. O. w+ I1 C$ G" s: J$ D! Knamespoc_e Admin\Controller;
k9 P# u4 n) ~* ^( g3 X. @; m6 ~' B4 K' [/ Z
clas_s AdminController{8 \; x: q* r _8 N: Q
public functio_n __construct(){: X" C& T# v/ }2 H1 z- n
echo __METHOD__,'<br/>';
+ h* u' u- U" M' Y6 d# J( Y }; K0 I0 d! L' o# f& b; ?+ }/ p% K
}
& q% Z) x4 K( ]% a. X: J, n; M9 _----------------------------------------------------------------------------
6 Q# v# t; k% Y0 `5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 A' d) w5 v- D8 X; c
+ V, S5 k8 U+ s7 m$ R( o! L. f% {. Z
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
; V: X7 E4 i3 D1 x' ?4 k( l3 T# U. y/ h: L- G! @% X% t
3 N7 F6 S5 k1 ?: H. Y0 T
1 i- v1 J$ [) u5 e+ I: `& g2 \' o: ~
$ K& w6 C4 t0 s' i
3 z! {2 c+ f8 f) N: _
. N5 r* L/ y0 ?. B |
|