管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:' c( c. r" }. V l3 K7 L; E
4 j- D1 q/ u) R+ K在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:2 ]+ U5 Q! ]4 w8 g' z
0 t5 a, i! G) e2 h% X
1 |9 d3 Y8 h# y/ N) U0 \
7 D7 \& J8 e+ G我们来详细的讲解一下PHP中的命名空间:
: A; ?: S/ E" Z( c8 U
% {! Q ~7 Z. Q3 |( A语法:namespac_e 空间名\空间名;
# v9 {6 a( \7 ~
+ ~; ^* h. s; O! Y9 n! Z7 ?8 T; n说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) [5 c! G/ l6 M) n6 ^* f5 Q
; b$ s- |( T/ c7 E" { @----------------------------------------------------------------------------" I: {) [4 l. i
0 Q8 V% z, q1 [! w2 B<php" O* B/ }7 y: k! K$ O# E8 L2 ]* Z
4 J$ l( B! Q1 X* x4 X
namespoc_e AA;/ b' T6 M" \; J
functio_n showInfo(){
/ `; U! k. v4 p echo __METHOD__,'<br/>';
6 A" U I' H# u. p. K4 ^}# L8 J9 l7 d/ u$ Y
showinfo();
9 C3 j- S7 B# R( y' l( @5 V( L" N" a5 e, C6 P) _
namespoc_e AA\BB;% i! r6 _; V0 a0 q/ a) w: E
, [0 T2 N% z( v. E+ C
functio_n showInfo(){$ ^/ |' f8 d& Z% x: c2 T6 n
echo __METHOD__,'<br/>'; Q7 {/ X0 F( w4 M, l3 U
}- {9 B/ m# }& S, j
//showInfo();/ M4 K' F( x* m3 a. B, L+ e
----------------------------------------------------------------------------
0 V$ |5 X" l. T0 O$ H2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)3 M! z# f( {7 X1 C1 _1 q
& Z9 ~/ ~# I1 @1 m6 y3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。" L/ U! T( u& S9 ]. H* V0 o$ y
. \" ]# R; ^, k* }7 f& F
----------------------------------------------------------------------------; _2 s. a0 t9 W$ O, G" W t
& A: \9 E7 Q4 n6 a) o
<php6 s: t; e# _/ W6 ]; [6 o
namespoc_e AA\BB;
8 }6 d6 a K3 Qfunctio_n showInfo(){
2 J0 d( B# ~) A3 _ echo __METHOD__,'<br/>';4 i0 I' b! G2 O3 [9 g N. V
}0 Q( E, R9 }/ L* _' E4 H
namespoc_e CC;# y# B' F @3 p0 N
functio_n showInfo(){ c$ ]/ K( q& ?5 G, o8 ^$ Z& ]. w
echo __METHOD__,'<br/>';6 H; U7 h: R" z- r9 ?8 U
}; ^$ \; f, i# z7 u6 T
namespoc_e AA;
N0 J6 q# \1 g6 Vfunctio_n showInfo(){# B/ w) t: W" j4 w3 [3 B% F
echo __METHOD__,'<br/>';3 ~! A0 Y. _! [! N1 f
}
6 n7 A4 I. Q+ ]6 r& ^; f9 C- ~//非限定访问:用于访问当前空间中的成员
9 o- K+ M7 O" R3 x5 TshowInfo();
! X T9 x! l$ A+ \& q9 B! l//限定访问:只能访问当前所在的空间的子空间中的成员' l7 U2 m) T0 Q' m
BB\showInfo();- ?" _9 z3 o; h- P) ?! E
//完全限定:可以访问其它所有的空间的成员3 H* n& E1 o' G3 {+ J
\CC\showInfo();& v# T/ K9 E7 i5 A3 a
↑根空间标识符
9 [0 ?. u1 N7 v- W. ~% P0 n j: d7 ]----------------------------------------------------------------------------" W0 l! G- }1 J* X! i
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:/ d, V5 D7 o) m T/ g2 t. Y) I
# X9 l' H8 u2 y2 O0 i" n/ G" o
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)% ?; U9 E8 M% e2 n: D L* E7 K
- F6 ~. V4 m2 L5 ?! x+ x代码示例如下:, ^, x. ^# w& Y, J9 G* o
) I/ Q3 F0 X" K/ H
----------------------------------------------------------------------------
% [7 l! K" G) M/ G: I+ Y0 w+ V4 H% `+ R& x- J
, J7 h! k+ `1 i! m+ J* r" c/ t0 w04inc.php
% K9 e3 H5 q. K' Z! ?<php
/ Q: h$ D. n$ e" K, Q6 ^# N; J( x$ _& l) b8 z
namespoc_e Core;& N+ @7 H: h5 g* Z0 Q- \6 n7 E
include '05ou.php';" h8 {4 o( H- y" ?
new \AdminController();& T1 l5 M. m2 m+ ~: O( `
showInfo();
+ P8 q, Y' P; B. l+ F8 A$ ^. a- P1 _, ~5 k( T: ]
echo P;
% ?3 i& U( q9 Q3 }+ s ]8 V//根空间中的成员,只要类的访问必须加‘/’$ ^7 l/ t" M. n- ]4 O8 q
----------------------------------------------------------------------------
2 P5 q3 A- b1 f& ^& n" w, E
8 D, U/ E% w3 Y! K C05ou.php! U! }( Z* j S. O2 \
<php+ Y* t" y: Y; Q# W% d
const P=5;
; ?& d! A! l( H% S- ~
: f2 i4 b& n6 _functio_n showinfo(){
( N6 u1 o* |( i% p1 ^2 A: L( A/ O5 x echo __METHOD__,'<br/>';
" l( ~, Y- q8 C5 u' K" C3 }& W" ]$ m}; O! u% v+ z8 V/ {: \) ?+ ?
: `" b! c' _% c% L0 c
clas_s AdminController{
3 h. o, D6 M4 E8 G public functio_n __construct(){6 _; T Q! I' R* a( f* g/ C! o. s
echo __METHOD__,'<br/>';# l2 l( M) W, h% S& D% F; L
}
& B2 X* a/ f% G8 J" F" F/ W# @' f}
( W+ S8 _# a+ i$ a9 D, L! @
! C, v) Q+ n _! a第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 x9 i) z* ?# X4 N, F
----------------------------------------------------------------------------, `, U: a9 \% { [# ^! @- p
04inc.php
T3 E- b" `. @<php! U. {. u2 ~9 @4 d) C; I
7 k( K7 c, s6 y) nnamespoc_e Core;+ q$ y; @0 r) h5 E$ R
include '05ou.php';. J8 R. l/ O8 u7 g7 `2 |
functio_n showinfo(){: V+ V, c9 G( j7 m+ }
echo __METHOD__,'<br/>';2 Q. r: w3 C1 d. [2 ?2 G$ {. s5 q
}
% C" `* j* D- N# K9 n" P5 e. \# D# X) E$ {; Q- m/ e& `# D2 l
new \Controller\AdminController;
8 l# M2 f" Q9 n+ s----------------------------------------------------------------------------2 N7 d0 Z8 p# o6 P9 h; T' t
05ou.php
1 {, a. l) b& P V& j<php" t) x- t, G3 V6 p
namespoc_e Controller;
: ^1 ]6 A& J. {. y9 _
) s/ J) d% C4 x* |$ V) Yclas_s AdminController{
2 S2 i6 o+ _! y. K7 W& w( ? public functio_n __construct(){
: M/ I z. g' {- g( ^6 X echo __METHOD__,'<br/>';
: q {8 t$ o" l" a4 I5 H8 Z }
- x7 G( t( g1 e" [}! m! s/ Z/ P6 I$ b8 S; K: T, W
----------------------------------------------------------------------------
5 U+ `# e. U( C* l" k$ q
9 L. w- U% \, l' A: G4.引入空间成员:
0 j" y6 Z6 w# f/ a9 I. P, y! o5 ]3 c8 i
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。7 v" j" S9 q# p( H9 W
7 F* h; a4 m8 b) X
----------------------------------------------------------------------------
3 t9 P' B Z8 q. Y) s
# f- m4 x) O$ z% f04inc.php% h% E( l5 _4 ~0 K0 p
<php! L' T2 D3 ~7 r6 S/ [7 R4 N, G2 L
namespoc_e Core;% e. A# c* i( C7 ?, B9 ?
use Admin\Controller as con;5 ~/ r m3 e/ y! v0 {
/ N& c- x8 O( ^5 k' ?
include '05ou.php';
( c3 Q z/ t& Q6 S) L& ^+ O! m6 v# B
new con\AdminController();
* P9 k+ x8 [3 ?7 X----------------------------------------------------------------------------
$ I$ L8 B3 L3 p* g7 i05ou.php
; ]$ f6 f4 J) L1 E) p6 q<php
5 g) ^9 o. s( U/ H8 C! Rnamespoc_e Admin\Controller;
1 L, J1 l* Y, ?5 R9 }$ |$ R5 [" s2 a8 ^+ b+ S6 A' Q" W/ I) w+ N
clas_s AdminController{6 g. D7 `* h' i
public functio_n __construct(){' G% S' Z# f; F/ ?) K7 [
echo __METHOD__,'<br/>';
* x9 V# ]( n1 u" l0 A3 h* i4 F/ g }$ f9 Y. j( L% _( h6 c
}
9 C$ o S. T7 m. o+ l$ Y----------------------------------------------------------------------------
3 G! ^0 |- l0 u2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。, g4 ?+ }) r- w/ |0 B, ^5 u6 x( O0 r
/ {! u2 ~. A, o: T) y2 C0 ~1 Y( W( N----------------------------------------------------------------------------+ z% `7 X3 Y C6 j1 f, l& h
5 W3 C B9 Y8 J! r3 X% s04inc.php
. I* v; K; m6 k4 N<php, N8 m- N, h# L) d: A4 T2 J6 B
//引入空间成员类
# y8 o1 A) k1 ?1 L
1 M i- P" l" f2 b0 Hnamespoc_e Core;* d5 u/ }3 }6 |8 q1 ~
use Admin\Controller\AdminController;
* U+ h& L: j7 x8 Q# z, }- Hinclude '05ou.php'; W3 k8 \+ n, [0 K, |( M3 t
/ T8 V% R8 O2 ~4 ^7 e0 T
new AdminController();
' y8 H' W. k2 i$ u3 [----------------------------------------------------------------------------0 e% L/ @& b7 L8 L+ o
05ou.php& ?3 ~9 T! P7 ]4 k" \, \. h4 T
<php
3 a2 R' ]1 @' I1 Gnamespoc_e Admin\Controller;
, w9 T: O2 z1 F$ Z% Z6 U) u6 e1 A. x( z) g/ L' P, u( b
clas_s AdminController{
" h* n( l1 @& u4 {7 G public functio_n __construct(){" G2 r6 R- }5 l2 t/ x
echo __METHOD__,'<br/>';2 B9 N0 O! H* l2 D( I, d
}& h2 A% ]& O) K9 \& R
}
. ^/ p4 u- h7 d2 D n----------------------------------------------------------------------------
: s, b. A$ ~" f& j2 d5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
% n; w# v% z5 v4 ~9 H! ?, V' Z, |3 |& ]7 q0 o
. t! Q M5 v: f1 r" t这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
& I; X' n9 p0 g, M* E9 r5 z$ I* d
/ X" u% Z* v$ G8 j N$ ^
6 J2 W0 j+ {; ]& R: M3 _. n$ a! ~! \( W' V o0 R8 ]( f
5 k3 ]6 }! ~& u6 p. v
/ A: R, T/ v6 }. Z |
|