管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
: ^; c/ O: J7 B. I
. @8 i( Z) w3 p# b/ m在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
5 H( ~+ H' f# e8 o' l+ @! u
' T8 ]) C0 | O, ^
- N5 ?: [! C/ r5 Z" E
& \6 D- r/ a& H# v; C h9 z我们来详细的讲解一下PHP中的命名空间:
$ ]5 r2 }- Q5 z7 _ i
^& D' w% t6 C% C& y8 t语法:namespac_e 空间名\空间名;2 b, I1 {7 l% D% Y+ Z
! N8 W9 _- R# j' i. E说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
0 K' I9 }& d# F
: G# z7 {6 w- I2 _) j----------------------------------------------------------------------------- E' P, U/ M: T) b5 P! L7 |* J0 ]
9 e& X3 A D+ q* w8 C8 v8 o<php. [4 Q, @' J, A0 q, D
8 k7 P# c8 o s8 S' d; Qnamespoc_e AA;
; k9 @' p2 f3 w9 v$ Y" Wfunctio_n showInfo(){
. T5 d* z! N0 W# L; [+ I. V echo __METHOD__,'<br/>';
! e F @! \4 B& s& N}
1 [: K: P) s" [$ [showinfo();8 @. l ?$ @$ f+ f+ G
+ X4 o) R# V+ h- Z. Inamespoc_e AA\BB;
) ^4 Q$ n: c5 M# e5 n, {$ p& q, J% ~7 y
functio_n showInfo(){
. q2 P/ }# E7 z, S8 ]: I1 A' s echo __METHOD__,'<br/>'; R: [" t0 Z4 T& P% ?; n* f, L) F4 q& N
}
) t7 w! Q6 I1 N//showInfo();2 T/ E: O- x9 @( w& o) u2 s$ U8 `
----------------------------------------------------------------------------$ n: f/ {: C% }
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)6 d# \+ I- }; H; ]: J% p5 L
) U: B; k7 _" ?
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" y: @* E) n, R6 M1 X) i
1 E/ O0 r6 K* h6 X----------------------------------------------------------------------------
9 e. r, b8 r+ Z. P' ]: O
; S6 W# k8 l' L6 }9 H<php
9 S6 Y9 z* Y9 ynamespoc_e AA\BB;
' B3 Q$ Z' m( o0 p8 i9 gfunctio_n showInfo(){
' N% o ]0 y/ ^1 d# F echo __METHOD__,'<br/>';" o. V# d' u$ O
}( `: N7 q R9 q. h% g' W
namespoc_e CC;/ w% q1 K$ o7 }( q- }6 }3 ?$ {+ q( y
functio_n showInfo(){
/ p* ^5 h/ c- C2 z- w1 [+ `* p echo __METHOD__,'<br/>';
# E W' a! a Y5 I$ i& V}
+ S2 @$ W7 E' W) M" M8 I9 Y5 \' R3 j8 Fnamespoc_e AA;
, D" W) g1 `, R+ pfunctio_n showInfo(){. w0 L$ L5 e; Y: `7 B% a. S. ^
echo __METHOD__,'<br/>';
0 C. o6 e% d" b}
, [8 V' K* Y7 s4 F3 o7 i, _$ c& Q//非限定访问:用于访问当前空间中的成员 `, h; v; S3 f) j& p# Z; @; V
showInfo();$ x! Z; u U4 `/ ?! Y7 ]% |* x" W+ o
//限定访问:只能访问当前所在的空间的子空间中的成员
1 G' Y5 {1 o2 h% U2 r; R" tBB\showInfo();& y/ U' E" O: i7 { T; x
//完全限定:可以访问其它所有的空间的成员
6 V3 \7 [0 o6 n+ {\CC\showInfo();
/ _8 B3 @: b* X7 B" k( d↑根空间标识符- U: C3 [; @3 h9 v2 n
----------------------------------------------------------------------------8 \6 r7 i6 o1 i- k
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
. [0 U! V6 ~3 K' g% b9 c: X) ^, X- K# z0 o$ u# O, x# N* B
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
5 P' @2 n5 N( e: u& l* X" S& G" W5 n7 r1 v
代码示例如下:6 l5 b8 g! \. a8 }8 P
9 _' n) B) B6 g----------------------------------------------------------------------------( @# m3 x; y$ j; ^/ F* s
1 y' \# F. m$ s4 J J% d* n! Q& l8 f \
04inc.php% }* B8 T; w9 \! t
<php- O% |$ X, f! D& ~# ^: \6 ?
4 L1 a& j* R- F. ^; r; Q/ g: S6 g" Fnamespoc_e Core;
+ S$ ^- u @; s8 D2 binclude '05ou.php';
# _5 ^( G' p. s" U1 dnew \AdminController();
0 {9 q6 a& t* N* {7 S4 I' yshowInfo();# c) l! F( W# V/ \
& y1 T2 M: k; kecho P;% E4 C" {9 ]( x. Q
//根空间中的成员,只要类的访问必须加‘/’
- s$ ]+ X' s( l: u; Z----------------------------------------------------------------------------* ^/ h+ k- v- T+ ~* r; f7 q
. Q* B3 r( y/ w) V6 v05ou.php
4 U- [: d8 N3 r<php& ?* W2 A4 u3 q" ] C
const P=5;
! f9 k! s, n4 z( }9 m# T
* L% r1 T+ J" ]3 T% h# i1 cfunctio_n showinfo(){& i; }6 D1 C8 F2 _' @
echo __METHOD__,'<br/>';6 G1 T, F0 P9 |3 S7 M* a) q# t
}
8 I0 x% q9 H0 }
! G% l1 D( l& N4 T1 b g: vclas_s AdminController{
9 S3 o* J/ D5 M2 H public functio_n __construct(){) v) M( t" d" I* B) n6 i" S6 J
echo __METHOD__,'<br/>';. A# X+ U- n. C/ @
}- i, c4 C( d8 M
}
2 Z4 E) o2 F# c4 r, \
8 `1 N" f2 P% A: K( z t: R: z第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
1 i1 N3 y- ]5 |$ V1 B/ U----------------------------------------------------------------------------
7 L1 i0 o6 V* {* d04inc.php
6 ^9 l3 w5 e2 E* ?! O- K4 U<php2 E3 r: y9 {+ P% s/ ]6 Y" b
+ ^" Q% t" J1 [4 ?6 { L" D" S- Vnamespoc_e Core;( T. Y. o! }1 N5 A) M* L. y
include '05ou.php';" M* Z+ \- H* H$ s8 O
functio_n showinfo(){
2 b2 W8 }: l2 \& k5 a* u n, C echo __METHOD__,'<br/>';' S& i2 i0 K- n3 Z
}, K( p8 |/ R- N0 j) d' C6 j
9 G3 V9 Y7 L( p5 Y$ Pnew \Controller\AdminController;
4 U2 {$ z& v' ~# p' G; Y0 z----------------------------------------------------------------------------
4 f% @) A$ \' F6 x" _1 D" u05ou.php5 V3 Z, P/ o5 t; @: A
<php
5 S+ o( h) ?- Knamespoc_e Controller;* s# D! D4 f" N8 Z# k/ k8 v
( k9 h; }4 b. e/ `3 @. pclas_s AdminController{
/ B- z2 i; _# o: O public functio_n __construct(){! n. {# B; s6 \
echo __METHOD__,'<br/>';
, c' Z2 k9 }- C( E& { }
% C& k! }' o7 G$ F7 S}
; ]. F1 v: a$ n5 V----------------------------------------------------------------------------3 M' X- X9 L6 L8 P) m* f/ ^; H
! x' `! m8 ?' _1 m4.引入空间成员:
J9 _0 ]2 Y2 A; K
2 f1 @& _7 j' {4 k' b! ?+ o0 \1 o; F1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。2 T2 E( c5 |+ M6 s7 v
5 G b$ W* S; e! P---------------------------------------------------------------------------- H# y; N6 n( K7 u* _, O
3 n/ g" L/ m9 G& v) O# A
04inc.php7 W2 h m9 W4 d) W
<php {3 L# K( J5 t1 G
namespoc_e Core;
q* o4 p( ?# d: q8 {2 z1 Puse Admin\Controller as con;
) k7 t3 }" K/ d4 w4 v: M, {+ v h0 T# H, W L* m. E. [
include '05ou.php';
7 E6 a" i4 X6 G" E4 y5 U/ b5 m" M( @' g& x) i0 X* O
new con\AdminController();" N% `4 i+ w. q: a3 v8 C
----------------------------------------------------------------------------
8 Y9 M- V1 x( X, Y; x q2 T0 c05ou.php
* S, K7 a8 }$ {6 i) I5 [( m$ e! Y! A$ K<php$ g$ t Z" l, M1 E Q9 w2 v/ f
namespoc_e Admin\Controller;4 x4 f3 {9 Q3 l
2 @# K: `+ K4 o ~5 B. \ g2 r
clas_s AdminController{
" k4 b1 o- o( ^* J' F4 x- R9 K8 L' B public functio_n __construct(){
/ r6 ?; M- S3 m# M. G echo __METHOD__,'<br/>';
; |" O' A0 v4 F7 v0 R }! v0 }5 J, m, c# Z' d
}
! w( ]3 K. @% J% _# b----------------------------------------------------------------------------! a( H) D" |- @( d4 y$ O
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。: ]) ^ q! m, m8 l5 B
2 G) {$ k L3 d ~- k! Q
----------------------------------------------------------------------------* r# D- g, d9 S# z: F
6 h8 k- S/ x; o04inc.php/ k/ Q, f$ F6 f7 k3 j: ?2 y( _5 z) J
<php! u! c$ N8 L! }* c$ X
//引入空间成员类, O! R- @# N; \4 o5 ^) B
" P; E: Q# d& t7 R( O5 E9 ^namespoc_e Core;4 D& ?7 e0 |( X) X; }
use Admin\Controller\AdminController;1 Z7 F7 ^5 V: g) Q
include '05ou.php';" C2 P$ A* L. ]+ W7 g6 j1 r
. E! F1 A! H7 Y
new AdminController();' A# W! C, ?& K% Z% D( p. K7 e
----------------------------------------------------------------------------
% j1 Y' u* N- j& {& H; Z05ou.php
7 ~' W6 z+ W( _5 P<php
: M4 [9 F! P6 H* j Vnamespoc_e Admin\Controller;
6 ~' D: L/ e* F! ^, [ Q6 H! w; f
% w! L1 H. v6 t* ~- L6 Y5 lclas_s AdminController{
- R2 \7 {2 k* s2 H: N9 U+ {7 e8 c public functio_n __construct(){
8 i" `. @* Z; ~ \ echo __METHOD__,'<br/>';2 c/ Q) {. N" j V- C6 S
}
$ W" W I# I( X- |4 w. H}7 h% J' u+ \4 y4 H, f7 M) ^8 p
----------------------------------------------------------------------------1 e- n# u, V% p# c# U; [9 v+ T
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。4 [: c+ r2 m! E! E) j4 w
* `- L; Y; c: {, F
4 F/ X; f" u! c这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。0 S" L/ n( w' u% V, N
( m+ I! ^- p1 F" P
' K( i: D6 [0 R3 x6 |( t _
- k; h/ Q4 Z8 V
4 K& I0 X) @1 |5 X2 e( Z, ^1 E2 `8 [
% Z4 c: n# L5 F) A6 T9 X% M$ L5 _ L( \: f
|
|