管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
8 K$ o- G2 A d
; \! B* P$ }6 ]; M4 A4 k在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:' ?/ D% k% E' |2 ]9 J2 W
3 ]5 a$ r i$ ?8 y* K+ F* K
, f5 M5 h1 x6 ~, \
0 T3 \, h3 @' n# n' O: F
我们来详细的讲解一下PHP中的命名空间:/ R* g0 R" \+ O2 G9 Y; {
& u% z8 E) e' e& P* `语法:namespac_e 空间名\空间名;$ v) p* ?8 f& I6 V
' o9 d+ l# I9 J4 C
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" u0 D* k8 t) h2 b3 y- G: F& [6 e, ^3 P
----------------------------------------------------------------------------0 E$ x _* ~; K) _4 |5 l" p: n
( P* x. j7 _' h0 A! ]' i3 d3 k% y
<php) c3 @7 ]7 a5 I) \8 {3 N2 o
1 d; @* o1 r7 u) xnamespoc_e AA;/ G- j8 p. w9 B+ ]( K7 a6 m
functio_n showInfo(){
3 `+ \3 [& t; { echo __METHOD__,'<br/>';
8 f' j! W. y- F, e8 O}( D4 \1 G5 \7 H; \5 p' A
showinfo();( m6 y/ c' q* \$ ]& `% `9 X
+ V7 ^% [! p4 G' L. L
namespoc_e AA\BB;0 E2 i3 E; B9 N6 V- {( H& q3 k
[5 F D) ~" N. L' b1 e- K
functio_n showInfo(){
. z, s) m1 K/ x. L$ ? echo __METHOD__,'<br/>';
. l. A- {) F% v0 f7 z- I, r}$ b9 N/ T- Q, h5 Y: x! c& u% Z
//showInfo();
7 r7 \# [4 a3 v& H/ w# ~4 Q----------------------------------------------------------------------------+ ~9 b1 y3 W4 R
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
! G& i( R0 w$ Q+ c3 E$ Y5 T# K5 K' q( J7 u
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。3 w" `. R0 ^5 T/ J
5 A P, Z/ p9 `- ?+ D9 U( |' z----------------------------------------------------------------------------# m; V* |& ?9 W
/ p1 m* @' s2 f. Z" \0 K
<php) p5 \- C; K0 k c
namespoc_e AA\BB;! q6 F! V" t+ q j) ^
functio_n showInfo(){8 J1 G) G3 r0 P( o( \1 e
echo __METHOD__,'<br/>';; U2 _; f5 Z( o6 s# G4 B
}/ D1 a2 c5 x3 I# m4 f( g2 O
namespoc_e CC;
) I" f/ [% F2 ifunctio_n showInfo(){0 B* k! V! c; P- U4 @) Z4 N
echo __METHOD__,'<br/>';
3 ]8 v( g$ c8 c}
2 Q* a- s9 l$ \2 s9 znamespoc_e AA;
# U9 C* P9 O3 R4 A8 V: g( w* Tfunctio_n showInfo(){5 S0 R% s& R3 S, F0 i* W2 `
echo __METHOD__,'<br/>';
: w! X0 r6 ], U/ U% y" [} O) T5 b, \( C) h3 ^
//非限定访问:用于访问当前空间中的成员
# @, S% N9 @2 E" c. f5 j% `showInfo();: |0 S; `0 h5 f0 L7 s }6 I- c) C: f
//限定访问:只能访问当前所在的空间的子空间中的成员% D6 P- j" D: ^+ a) o$ n# K
BB\showInfo();1 f4 V2 n0 j. J' Z6 x# o
//完全限定:可以访问其它所有的空间的成员: J! T$ ]; X1 |/ n3 N9 C. `
\CC\showInfo();
2 B: A$ y' M" E↑根空间标识符9 T2 W/ Z" z& n+ g
----------------------------------------------------------------------------& \$ q C" F W; G1 A% l4 S
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:0 w0 o6 O0 U: H; z) Q Z! ~
1 {$ o! K: a& A5 k, D* g当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间); }4 V, A+ \9 W: M) T
) w# l5 T& N2 o1 V; J0 g7 P代码示例如下:% u" f7 @. }) ~' B) B9 W) g% k, g
, Y( s) z# y, ]----------------------------------------------------------------------------
! j2 ]6 b1 i% p! h& h" F, B1 Y
! W: r- w% L6 W4 _+ R% B. D. z& O2 k h- h
04inc.php
. r9 Q' [" a9 D% x' w1 D* P<php
* J4 U) x3 j+ U5 W7 H! U# S! q. M8 J1 w
namespoc_e Core;
/ g$ ?9 y$ p4 J" A& Binclude '05ou.php';6 |4 e: i! Z) G+ h
new \AdminController();. t! M: {+ k+ l+ u! a$ e; Q. |
showInfo();
. V5 j6 j4 H0 }8 b% C, W# {" b2 f: _& \- q
echo P;
4 y* C! ?% q2 G( c4 f//根空间中的成员,只要类的访问必须加‘/’" n: c. @; k1 r7 i+ N5 X
----------------------------------------------------------------------------
6 p) S8 k' H& K) U& @) v; @! M, K
05ou.php' n- w& ~+ v/ s" s8 N7 Z% g
<php
4 }. O7 q* O6 N* `const P=5;
0 I5 a' ~7 x9 P0 j7 K. X' x9 v7 d/ `* a; n
functio_n showinfo(){
* T4 H' |2 W# Y1 P( g. b; N echo __METHOD__,'<br/>';
/ v! d8 R2 n* d/ U# {# G}' R0 R" L3 @2 K2 J/ v: [+ ?% w
, b9 h3 ~- O7 h
clas_s AdminController{% k# O' l& { n
public functio_n __construct(){
; Q% D, m. j5 C) j( r echo __METHOD__,'<br/>';- x" D* O9 E7 W$ Y7 s8 `' W
}: H- m; _% O. S3 p( Y0 ^
}1 q% l& O* x9 m; o Q; H
; T- z" ]8 [) d0 P4 n$ T3 o
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* k N( K2 A$ `( D- h7 k) G/ n+ S----------------------------------------------------------------------------
; i" {4 i( C# ^ [6 |7 F04inc.php6 s% M: G! T' D4 Y
<php
: `6 c6 h6 \: y$ m' o+ d. X" X" w: d! E$ c, y; }
namespoc_e Core;3 `0 s/ R6 i1 y1 Q8 e& T
include '05ou.php';. u2 U# O5 m5 b. t" e
functio_n showinfo(){
2 F ]& ]# Y+ m# u echo __METHOD__,'<br/>';
$ g( l8 O1 @! x% t$ _% b}) G+ W6 H& a s
& p0 |' k3 x* `; c
new \Controller\AdminController;
; t# q* N) \" u; N" m! Z$ Q5 G----------------------------------------------------------------------------
/ V# W9 a$ u: |. T05ou.php
8 i+ X" _/ U. B, ?9 V<php) ?4 y) E! b; O: [! p L
namespoc_e Controller;: ]" d. q5 s2 D9 A+ t
8 b* X% e# f+ P
clas_s AdminController{. L9 c) c, Q5 M& U, \
public functio_n __construct(){
! Z, K! Q3 ]' x- v. B# N( p+ U echo __METHOD__,'<br/>';9 M8 y3 K0 f# C, E3 N. c
}9 K8 A, e; }0 J- U% \8 ^
}
/ t- H, A- {% q----------------------------------------------------------------------------$ C9 O+ ], V5 N8 B) k" c
# J: Q# H& E2 h' K8 x$ ?
4.引入空间成员:+ g& Q* P% e# l1 J
! R* C+ C* H$ u0 E% m& ]4 R" K3 L1 [, ?& b1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。/ Q/ m5 @& S) S/ n- f3 V( i" M
3 O8 ?' y3 } b* T
----------------------------------------------------------------------------% r# w7 s, ?% b
# H* |% n$ Q3 H5 u. _04inc.php8 s* _9 T/ J0 t, V5 |
<php
% `- X$ M B& g; z7 |6 Pnamespoc_e Core;
8 V Q* _1 Z8 K) b# Fuse Admin\Controller as con;, X( U7 A' W' W
: p9 c7 V2 Y# H8 \% y: G0 e
include '05ou.php';
# J2 f* ~$ W/ k: F1 t, ^# ]' h; ~* K( }
new con\AdminController();+ V. q6 o6 v9 H; J8 e( }0 t
----------------------------------------------------------------------------2 u* }3 H# v; C" v4 S D1 e
05ou.php2 g# [9 o) x# C, L9 S' ?1 a
<php" ~+ k3 z1 Y$ L8 d5 J1 B: D" W
namespoc_e Admin\Controller;/ N0 I$ s& ? U% _0 C/ q+ r S
' \7 {" l/ K& b4 e6 I ~
clas_s AdminController{: e" @' I6 q0 {2 b* F! i
public functio_n __construct(){! Z9 h0 h" r+ o+ m. G1 H
echo __METHOD__,'<br/>';: u- p7 A2 W$ l3 l& m* ^: J
}
2 `# D- ?# ~2 {4 \& s4 J/ S2 d}
. R& c' s( e. }, T; x/ Y8 D0 `----------------------------------------------------------------------------! z3 Q( [- |; k
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。" \0 e: }7 B& h" K+ \
8 R; A ?+ d y. I----------------------------------------------------------------------------4 _7 }) @$ L. [
( r4 T G. _3 ^! L8 E
04inc.php8 n7 r& }4 M$ K1 ]
<php
6 m7 s! u# l7 h+ Q1 ]# ] ^3 X//引入空间成员类6 t1 @# C, K" e
' w4 x; Y) F$ \3 P6 W
namespoc_e Core;7 u$ P! j( Z, k( w/ q" l
use Admin\Controller\AdminController;
1 |" L: R2 b% _; `% ninclude '05ou.php';8 k* n0 j, F$ |# t& P/ M6 C( Z+ \
$ R: ~% \ N5 fnew AdminController();" H, N. J9 f. H0 T& k1 |8 p6 X
----------------------------------------------------------------------------
) C; ?. Z' A7 A" }% D- {05ou.php
5 V0 ^ C `0 Q. l( {, v% n<php
7 I7 x7 ]6 g) V7 e( C8 B2 Tnamespoc_e Admin\Controller;
9 P" R: Q+ \$ [# e- h. Z, H8 S! C4 Z; @3 E$ o
clas_s AdminController{
4 N' V! v6 h: {" d! t& _. s' [ public functio_n __construct(){
; j Z8 h1 L H/ r) u0 C echo __METHOD__,'<br/>';* N2 R1 \+ `" W; N9 G
}) L- f% u0 R: v6 v
}: W6 d- r$ c" e9 P7 i7 i3 U
----------------------------------------------------------------------------
( p& ^- l6 P6 b- r2 A: M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
' w0 A9 X1 ?9 Q+ ?/ w5 d. J& F6 p, U( X
" |8 `8 N$ j0 g) n
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
& S3 U' l7 `% o5 w/ [$ q: ?* X7 \/ F9 {" m6 N) b
+ e. a$ f! M Q/ S& Y
$ x( s% C: w) c3 p6 f
2 C# b1 Y$ h: P* a* Y3 M% y4 Z' Z# q s. Q* L
( Y$ ]/ O3 ?# j7 N
|
|