管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:5 z9 P, m$ {, `! ^
x& T! ? R. A+ n在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
- V' [# k5 ]( c5 u' g! A# o3 d5 T5 ~. p! c+ T5 c+ I
! j. h% X' R& R8 [5 H
, Y, |7 y6 ^' o4 v; y5 Z' f3 X; b我们来详细的讲解一下PHP中的命名空间:
0 U$ w( \- q2 W7 n9 y0 N+ g @6 c+ H) A: l& X k
语法:namespac_e 空间名\空间名;* b4 d" ~* I5 E+ C
- N q% K3 h5 \2 n) E说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) X& O; p0 W$ z
8 {% u8 B% A2 `* A( l$ C----------------------------------------------------------------------------# h' K& r/ N Z( `
* P2 p9 _1 L. r6 h' h8 [' u
<php
1 j+ F, c) x8 h5 u: h7 F
/ O; a1 s6 y1 [0 j* unamespoc_e AA;
# y; R( S, {7 Nfunctio_n showInfo(){
4 W/ C" Q& F) h2 z! k echo __METHOD__,'<br/>';
3 E7 ?' V/ ^5 v8 P* b1 b7 u}6 Y8 l6 ?# K$ t* w, w
showinfo();
3 Y+ Y. f+ `& O2 n
, J: v4 r$ g# y5 o o+ ?7 m1 N/ mnamespoc_e AA\BB;* C5 l- s8 ]8 d2 {
/ v9 q* i3 E6 Q9 J6 V9 }
functio_n showInfo(){6 b+ V5 v4 \' X% }- n" `- H+ i
echo __METHOD__,'<br/>';
/ u* Q. | c* h# n& z}
, H* P+ V$ G0 B3 R& q' r0 f//showInfo();1 {& M# E8 \) F( X9 z1 f
----------------------------------------------------------------------------
7 D( B1 m) Q/ E [5 b0 z- J) F& P2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
- Y( d- @5 H# M0 d) u9 n9 {& }; S4 K# D3 O- a3 K
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。4 Q% A |2 q1 K+ ^, U- P
- Z) \4 }! O, x( P) g( e6 @
----------------------------------------------------------------------------# `* F, N4 ^( Q+ {% a
) t0 Z, {2 Y# R6 L$ ^; e
<php
4 K, \" _( K3 e4 D$ w' C/ gnamespoc_e AA\BB;/ ]! ?. G7 u* I: F. X
functio_n showInfo(){$ I6 u4 P) d* N% o* N$ v
echo __METHOD__,'<br/>';
* w- N$ V9 C% k7 T1 R, L/ \}+ p+ a4 H& W0 w/ e1 R. P: O( y$ {
namespoc_e CC;
( f+ Z ^" q! A, [functio_n showInfo(){
- |3 b+ f) l8 {/ X. I echo __METHOD__,'<br/>';5 V* T$ _ j& s1 _" Z9 G& j
}5 }) @ q4 S' ~) g. P. v
namespoc_e AA;
' m7 @. Z' a% a3 B- f9 z; mfunctio_n showInfo(){4 K. k9 o% K3 ~; S, \& F
echo __METHOD__,'<br/>';/ g. v2 U. \$ j& h8 b5 F8 e( F3 @
}% ]' S0 C# n5 P7 j6 [( e
//非限定访问:用于访问当前空间中的成员
4 E& w% u- ~0 Y4 L6 }showInfo();. e; M4 `7 E3 p& C9 n
//限定访问:只能访问当前所在的空间的子空间中的成员4 a, U, W2 Q; S$ d( _. u$ k
BB\showInfo();* d( E: F8 k7 I( H0 K4 O4 G" Z
//完全限定:可以访问其它所有的空间的成员4 O. [+ @6 @8 P/ [& m6 ~
\CC\showInfo();. j/ T2 w, m4 M6 e1 V. e* }
↑根空间标识符1 _2 `, ~' Y" M# ^) m( P% Y! {3 K' \
----------------------------------------------------------------------------
3 K5 H: o" k0 Q" P# s1 M但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
% F8 i0 a% A$ s. I8 x- v8 ?
2 p) @/ y4 B# ?) `9 o. i% P9 y0 _当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 W0 m7 H. D: U! Q5 b7 @$ \+ H+ Q6 z- }5 b7 n1 j& [' p& s+ `1 d) H
代码示例如下:
; R9 N1 I9 c% z9 T9 S% k3 ~" T& K' K/ \
----------------------------------------------------------------------------$ h( A* m' }* N% M6 Y
; x P9 }- K, z+ H/ a% _0 Y# ^8 ]$ D/ r1 x, q
04inc.php
' I& C& X9 ] L: b<php
; O) u3 h0 x5 B1 N+ O6 f8 [' y
: S6 d: z" o' F+ Bnamespoc_e Core;
/ P- Y: X, d( M1 Hinclude '05ou.php';
& F( q, }3 N8 H1 u6 A; hnew \AdminController();
2 J" F; Y+ w. h! C+ p. RshowInfo();
# n% J9 x$ s% \# v3 R4 V' g9 H9 o2 g( p: u! H
echo P;
: G0 K' q3 f1 Y3 X+ _4 D//根空间中的成员,只要类的访问必须加‘/’
( q7 g& I9 D! g1 K5 c; E3 m' f----------------------------------------------------------------------------
0 g+ u! H2 s; h* [$ d" M8 C) S- m, q/ p, Q
05ou.php
" K8 s$ s3 N' B2 v0 }<php
3 H& \3 N2 v& J6 u7 Gconst P=5;! {6 c' E% w4 S- G7 p* ` M/ W
) b1 }# a2 q( Q- Hfunctio_n showinfo(){& d( C2 c' o0 L4 i2 k3 k) \
echo __METHOD__,'<br/>';
% h: c& ^ M7 d) ~: c}" p& ?9 {, G& z& Q! Z
( x4 \( r: V1 s q4 v
clas_s AdminController{
6 t( l. u/ f+ F& z# x/ a, `1 M public functio_n __construct(){
7 k: ?! b) L" ` echo __METHOD__,'<br/>';" W. v' v& C: ?
}' ^9 \* H U0 p: O
}0 y) `+ t* M2 U; A# V
3 X- E1 c( Z+ I# F
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
% W* J/ ]/ [! M6 A5 [: F0 c: ?- X' O----------------------------------------------------------------------------& c9 j5 r$ [" t% ]% z7 B
04inc.php
. ~% v; K# p, T<php" q1 L( o% \. u
/ T1 [; c+ x- o* L( v3 qnamespoc_e Core;1 h! x, H4 F8 h# I. T( b; @
include '05ou.php';6 ?0 K' S3 c3 h
functio_n showinfo(){, b! D4 [8 s9 _& O9 f# y7 }! ^
echo __METHOD__,'<br/>';
/ Z& ^9 R# p+ ]$ Z}
0 }* d( D* _+ q4 Y" R+ ^; w% x
5 U1 E* e7 E. @! fnew \Controller\AdminController;0 M& e3 r4 L$ E$ C: k
----------------------------------------------------------------------------
* g* p5 X) ?. a d05ou.php4 s0 a; {9 [+ k2 _% o
<php
/ g, @3 \% l: tnamespoc_e Controller;
. w) }0 P7 z5 f9 z6 ]8 ~( e& P, ^, S" V
clas_s AdminController{0 e$ o0 w4 S3 a+ N9 U$ e+ u* r/ i' {
public functio_n __construct(){
) ?# @& R( f7 T7 ^# l S+ A% k echo __METHOD__,'<br/>';
1 a. N6 u3 k3 I9 a. K! N7 s0 n: b4 b }
! X, u. K4 h& r1 o) a}
; c& t/ I+ S4 D8 J----------------------------------------------------------------------------9 R# u6 r" D: ]8 p$ v& p
* z' }4 K) o' w; r
4.引入空间成员:
9 ] V) c4 H! j4 k/ _6 c8 x; ^9 b0 k/ X) \/ s" H+ P
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
+ |2 d: {: C' {+ b0 i* a
& Y* l0 _! r4 \. e* [; u----------------------------------------------------------------------------5 \- l1 H0 S' d
$ l' x, T, s! [: |
04inc.php
, k' V% E- Y2 y6 w<php
d' _! u1 q! U* v+ anamespoc_e Core;
y ]/ V0 j: j2 O3 }6 Xuse Admin\Controller as con;# U4 S; u8 J. @: l, f. v5 F
. Q4 H; s* u3 L" X: B% n( P& ~include '05ou.php';5 C4 G- Z* g1 G
. y+ ^) T. D# J( j; n$ H- b1 @new con\AdminController();
) ~: T" I& V2 m& N G. ]----------------------------------------------------------------------------* N; {* Y g: d* H
05ou.php* f# m; ~5 [) ~
<php
1 J/ O/ w* C- i8 [, u! rnamespoc_e Admin\Controller;
" z' o' q/ _! o1 J) i# }, ]0 N9 f
clas_s AdminController{+ b$ s* M1 W# q1 T, _9 L' K% H, A. Y
public functio_n __construct(){
+ ~) ?0 R1 X- ?& d echo __METHOD__,'<br/>';
0 S8 t" p- z7 d1 f }
( Z ?, S: ?' Z9 A4 w3 t8 d/ K}7 _( K: N8 |" X \- E7 |# C
----------------------------------------------------------------------------& V" G9 ]; T) |4 A- S7 k/ D- S% [& @
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。% U3 ~* t# w8 L8 Q( W1 Y
! ^$ }, X% J4 E) M% h. g----------------------------------------------------------------------------
( a v) S9 G% m: r5 t Q& x, s9 V4 h) H+ U) c1 c4 K6 ^
04inc.php. F. I: P d o* O! g
<php
/ Y8 a( [, F9 Z//引入空间成员类8 M; W" u8 _6 P5 V7 K7 J& H
; M l4 R& j$ j u# ?namespoc_e Core;. R1 r4 I# P" Q3 Q& V
use Admin\Controller\AdminController;: p8 r: B0 ]6 x7 s0 p
include '05ou.php';! _: R4 l q: X' Q+ m9 _, J
0 u D! `/ }' n# S7 \& z0 Fnew AdminController();
8 m" |. C' O! X$ s' K" b----------------------------------------------------------------------------% h( _8 s6 F8 O) b# D0 Q
05ou.php; j, j3 E1 M. a# C: y; ]
<php5 y! L: [: V' t# N \- i
namespoc_e Admin\Controller;, g0 [) k% M# [0 ~
" \' a3 I# ]: P4 L4 b; G& q
clas_s AdminController{
4 k$ z) f( d' a3 V1 K public functio_n __construct(){
9 X+ T$ i# s9 ~6 k# c5 t; O echo __METHOD__,'<br/>';* Y8 T" {3 c" V) w8 e- G$ P
}
. K F+ O9 r+ g9 k}
6 v( Z8 h5 H. _& ^6 B----------------------------------------------------------------------------, c% Z$ ~: c1 x/ m3 @9 n o
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。: Q8 h1 _+ r" Y& X
7 S) V; E5 b! I L
" R# {# ]2 f. p: b; g- h这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
$ `: O. G8 w" b( r+ m; w6 j1 f+ D
0 e" J4 J5 w6 o4 e2 Q% c2 L8 q! h2 s K! C( v+ a$ `! o
; t1 I/ X& k0 s5 `# v F
# Y) U# m2 G, {
) n; I, y5 n# ?* {: T: u/ T6 M |
|