管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:7 O4 a$ }3 ~$ Y: x2 v+ b9 R8 G
; Q& E0 |; F4 y9 @' [
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
! b8 G" V% D. |" Z2 _! F# T9 W" [0 W- f1 k, d- k! w
: @3 g3 [4 m4 u; D0 G2 |
- c" U- q9 E1 R* ]2 J7 E2 }8 x我们来详细的讲解一下PHP中的命名空间:
5 z& r7 o" l/ P6 Z4 @
) k( M: R5 n6 X/ S1 |* j) q语法:namespac_e 空间名\空间名;
& {8 C/ d$ `; h3 |4 H y) t( b* L# x k( a& _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:0 c2 c. m) D. }4 g. i! Q6 L8 e
, e) p+ H7 ?: r; u----------------------------------------------------------------------------) w. V' I6 M: N
9 G( Y& K7 d/ L: s3 |1 U) v3 Y* T<php5 W5 q# H& U9 Q5 G8 e* q; C
* }' {0 ~5 r/ M J+ W
namespoc_e AA;+ b" _2 |& e) o: l( l5 \0 e# f
functio_n showInfo(){# h3 {. N; l, j: S- ^8 }2 U3 ]
echo __METHOD__,'<br/>';% N# B8 a: H6 i9 M
}
% X J0 A }; |% R! }showinfo();
; O' E1 U: o( m) t- f% ~ _' q5 U: ]% G; L
namespoc_e AA\BB;, s! _3 {$ |5 C3 `; J3 E8 ^+ G$ `0 h
* O. B7 @8 t h
functio_n showInfo(){& T& }9 Q8 O; k0 r$ ~$ n0 _8 ^
echo __METHOD__,'<br/>';
3 H g7 [' K0 J; f}
; w, [9 l4 d) T% B//showInfo();7 E7 U1 O8 G' T R7 G4 R
----------------------------------------------------------------------------, i$ r. ?5 }: [4 K5 ^; S' R% I& Q
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const); [" l6 R- R0 q+ A7 H) R% o6 _- p7 v
! |6 G d) A4 L$ U! e, p# e
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) b6 ?9 N; w" `9 g7 H$ N E! c& n9 A$ f3 m/ X1 W1 Q
----------------------------------------------------------------------------, Q1 m4 `+ w- `! }
/ P: P6 H, b7 X- \" o( X
<php& e$ h- E4 F1 w- b1 O
namespoc_e AA\BB;1 k, Q! _ Y4 I2 I! |+ I
functio_n showInfo(){
1 d7 Z: A; t+ S# p0 S, S echo __METHOD__,'<br/>';
! g; e1 e7 W3 O5 q; b+ \}. C* v$ o7 _8 m4 s8 _+ l; ]
namespoc_e CC; S4 f D' ~6 ^2 M; U- C. h% W: o+ G* b5 d
functio_n showInfo(){
- B, g( z/ n5 z& x1 U echo __METHOD__,'<br/>';) \3 @1 s% Z/ F3 k ^
}
0 {2 [6 P0 M3 F4 R8 tnamespoc_e AA;$ G3 b* y3 c3 Z# F" R/ T; S* X5 ?" S
functio_n showInfo(){
9 V' B; c/ R$ a- {! v echo __METHOD__,'<br/>';
% c* v; h6 u3 S8 t. r# ?}$ O- U- @" \8 ^4 H+ e5 X
//非限定访问:用于访问当前空间中的成员6 R+ ?4 t2 x( k
showInfo();
9 e: ], m& h& @: w; |//限定访问:只能访问当前所在的空间的子空间中的成员6 U0 _& h& c. \/ w) R$ y8 D
BB\showInfo();
. P; I3 Y; ^$ e% M//完全限定:可以访问其它所有的空间的成员
7 R7 k5 K) o9 U6 J\CC\showInfo();
/ C i4 F+ K$ u- ^0 ]& v4 I; g) i↑根空间标识符
; M+ v" d" K2 D3 p: q7 G* A7 a----------------------------------------------------------------------------- m, C0 A; O" a8 O" B* v
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
8 `: Y7 h1 K$ ]( H8 r0 U2 [6 I
6 n/ G- }3 j" p: N) I6 F: b. N8 F8 A当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
( X) s T, K+ Y" B, |) U6 x
& n5 [, ]4 p9 R9 o代码示例如下:
) \- _; O7 I' e1 T- G
9 `! \4 _+ a6 T6 R+ y: j* Y2 Q----------------------------------------------------------------------------5 C1 i% e' k' M/ \ `6 r
% \: w( I* o" L& r: w( P0 m% k) K* H. A$ j- w: F O+ [
04inc.php
. Y2 X2 j3 ?* t) Y4 p7 u2 m' I<php
+ E: B; S0 z, l1 i2 g! L" F6 p3 _- X- e2 K
namespoc_e Core;7 B% t" {+ I" ` a+ L
include '05ou.php';
' H. V- S0 a' c" D! ~% Nnew \AdminController();
7 V$ q7 i' M: ?3 F) EshowInfo();6 h8 |3 G4 H7 d8 p( Q4 _8 K
9 ~* y J l* W- i3 u* k
echo P;8 r' g: v7 p+ v- x; @- ?& ?; X- f
//根空间中的成员,只要类的访问必须加‘/’* \' M Z$ a+ l# X
----------------------------------------------------------------------------0 J; K3 C; p, p! ~5 j$ a5 X1 h
2 i- y6 O: _4 P; c( A/ B9 [8 d
05ou.php
N2 Z# {! B: ?- _+ p4 b5 \6 ~<php
- r+ y- z2 B8 c+ Oconst P=5;4 u# l# c5 X% A' z% F
: ]7 X; ~- o* z8 afunctio_n showinfo(){5 h v8 _# K3 M% B6 c D' o
echo __METHOD__,'<br/>';7 o `, d. d, l+ ]' `. P) n2 _
}' j8 s, y, G7 h& |3 I: O7 m: p
1 g+ j8 g7 r/ x. @! Kclas_s AdminController{2 t/ |% A* g+ K- G/ P* Z5 y
public functio_n __construct(){
' |/ h% L2 C& ^: N8 l1 l$ U echo __METHOD__,'<br/>';) Z4 [2 \; z0 n+ f G8 u
}- ~# C; V6 K3 @5 V3 o: v
}
, m( i$ v ]" r
! ~: ~1 i5 k9 c# G- D第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* Q5 [$ w9 k% G5 x+ B% y* O2 D
----------------------------------------------------------------------------" Y v; g7 _/ V! P+ Y0 C
04inc.php
- J# B8 K \; } e$ v5 q4 x6 k<php& A7 H! x N! u2 Y4 d3 b1 v
+ h6 X6 U* e) G9 a3 Z( x7 Inamespoc_e Core;
: g$ i0 M3 Q( L+ I' U% v( B" K- ~include '05ou.php';
. ]! O9 g( r! t# H& B3 [, efunctio_n showinfo(){
7 N9 g) ?0 W4 @& E9 m0 F' B: A( k; Z echo __METHOD__,'<br/>';- ]9 W1 I4 T" J8 z9 ~9 k
} r5 D- ~+ Z I& l
' ` o; M R8 }1 gnew \Controller\AdminController;
/ R. {" P6 i) g& Z) Q! z----------------------------------------------------------------------------
! @% ?: ]$ k& Q; s) I s% k: S05ou.php
! S1 F7 Z# ^0 d) ]+ v* u<php
' K/ ]/ K w* }, g" g& Tnamespoc_e Controller;
3 W2 H- Z( l' ^0 i3 M
& y3 W4 m3 }$ kclas_s AdminController{' Q* N' K1 B3 ? h, i
public functio_n __construct(){1 N( ^" v7 D( E
echo __METHOD__,'<br/>';
4 a7 w0 u# A- @8 G- r. E( z4 m6 Q }
% c* t# i+ O3 g}
5 @' g% g" o# j S4 Y----------------------------------------------------------------------------
$ r- L) j/ ~. B8 F4 B: M. C
( j* ^4 n' ~: ^+ o$ H4.引入空间成员:% A" }+ h$ Z( H7 y0 ` a3 g
# S# [5 d4 D. |: x1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。% [: P- O, [0 D9 J
+ K' e# }$ T) A+ s7 ^8 f$ r----------------------------------------------------------------------------. u3 f: K- I& x; q
0 @, I0 ]& L0 }4 R5 `( R04inc.php: q0 F O2 o: }( W: k
<php0 V* q8 r, G* ~+ w! }
namespoc_e Core;& c U& y6 c: K6 x
use Admin\Controller as con;
: V) o, \1 P6 h9 s8 L: L9 \% R3 P% w" X7 n# ?
include '05ou.php';
: O7 \$ q. d: j# ?
3 Q, ~3 g9 h+ g4 H/ i, a ^" Hnew con\AdminController();
: k" Y- j7 V! Z% d----------------------------------------------------------------------------
4 e8 Z5 w1 `! o% z% s05ou.php$ J. Z% i. @" P5 X7 T, Y
<php* E0 r* ~8 I X" d: ?* m
namespoc_e Admin\Controller;
. M- d/ D2 t/ ?+ R2 I2 J- W( Z& P9 z) _9 K$ M
clas_s AdminController{/ d- Z4 n' ?0 i, Q( c- _" n
public functio_n __construct(){+ K2 J# ^' }- x( f% L |: e- S
echo __METHOD__,'<br/>';, ~/ X d Z- [) s5 i* K
}5 @ E8 y8 m& G" B# K
}/ _/ V# T* l$ ?& U- v
----------------------------------------------------------------------------
% c5 F7 ]# \ F$ u7 i2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
, m! ^1 C% i( Y5 I$ T+ i# j* e9 e6 C7 ?7 h$ S5 X. W+ b4 a1 C
----------------------------------------------------------------------------/ U1 B2 p8 v! L" y* b5 e' r
8 F6 B' v) G' K# U04inc.php
* Z" `0 u! @ l, G/ b5 h<php
* L/ P/ q; S! c3 i c& i) `3 s$ k5 h# s//引入空间成员类2 f# v5 i& ^4 z- H
: A( R. R' ?9 V& d* v/ Inamespoc_e Core;
& T. K/ S; P$ X1 C8 p% X! G" H6 Nuse Admin\Controller\AdminController;5 o5 H$ N* x1 ]% I* M; F
include '05ou.php';9 M2 z: w9 U: O( z" \1 r2 Z0 c
1 ?1 F" J7 b7 a# N' C' G' M% G: anew AdminController();
9 E9 j# o# v! K) P% Z----------------------------------------------------------------------------1 p- \3 j: c b' c5 x
05ou.php+ v+ a0 @/ B+ }
<php2 u- }+ A8 N" A- }3 Y
namespoc_e Admin\Controller;3 Q3 m' `: {& x) l- W1 ]; P2 J
2 P; V9 H# q" R# I, M% M( Kclas_s AdminController{
% g. z5 u( `) ~+ E; {( }+ M public functio_n __construct(){
4 x7 f) I" x2 J( J echo __METHOD__,'<br/>';% L) p8 T6 Q. _0 v3 G+ c6 p" Q
}. k4 U. B C" Q/ `9 ]2 D# m4 a
}3 [$ [2 D/ z4 u* ^+ m4 L, `
----------------------------------------------------------------------------0 v1 P [) s( g8 [: }0 }
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( I1 l% n% @9 w0 V% X: N. _0 p8 z, m8 @6 V2 L2 f9 ^
: a+ y$ K# j+ R
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ e4 m( U* L% }( _( w7 u
! F3 i0 D% z& B# y+ N
v* h" b4 i, Y
0 P- S4 {) f$ y
9 _- o( X' d6 D' }; k$ w- b
% {: d+ ?5 V& g2 z) @# B; x# f# J9 h" ]" ^. d9 S
|
|