管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
. q! ?' Q' `2 c: F! R* s( T. g! u9 n6 n/ a
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 D1 `6 i& `& I9 o3 E
( M" _ l; b! a6 U8 @3 P) R/ I
" @* v3 p8 ^( o8 Y) c* P) f9 b
& V* [. Q& D& i; ] d" s/ g- ~我们来详细的讲解一下PHP中的命名空间:; Q, @, G& f5 a1 [
+ I$ i: z8 V. I' H3 o
语法:namespac_e 空间名\空间名;
( d! `) m5 F- X: f# p- ?. A! V
+ w. K/ N# g3 e说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 j( [% W" s% j1 I2 h- f" ]; E, F
+ m3 E8 G; |0 `' G3 Y----------------------------------------------------------------------------
: r9 ` c6 d6 _! N4 h$ z' d" r: s
) N% r9 \4 y, H; ]- j/ n( l9 \<php
2 d D) d) ?+ I! I5 m8 G( ?4 Y8 N0 y7 R% G
namespoc_e AA; k! @4 e. q9 x& Z( Q
functio_n showInfo(){
" d0 w' [3 I8 A; `4 Q+ s3 T echo __METHOD__,'<br/>';
1 @, V a, S3 f& ?1 H}8 m% R2 P' N9 @
showinfo();1 K9 C$ J' V, L" `/ V* c$ F! v
% f6 C! ^* c: ~; l8 M1 o' m
namespoc_e AA\BB;. A6 a8 q, i0 f
0 v( ]7 T+ x( k7 yfunctio_n showInfo(){) q' x( T: d, |/ `! K2 P* \" }& ]
echo __METHOD__,'<br/>';" E p" b4 m$ U/ F: S" [9 h# O
}3 a* I8 `2 y; \0 e2 B7 k
//showInfo();9 m% n# i% l ^ q7 q
----------------------------------------------------------------------------: L8 m5 g* A. t, O' q# }7 ~6 b9 i% z
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
; g7 w) h/ H, I- x! `; J t0 \. I4 g9 I: i! Q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
8 }3 ]& O6 F5 w# R. }: ]5 }/ ~1 i3 Q9 q; P9 Q
----------------------------------------------------------------------------
8 J$ y4 w9 t- o( v! }( G
0 @+ m! E) s3 v% ?% o, ^<php
2 j0 Y- V$ A* G2 f' tnamespoc_e AA\BB;. r( N/ B6 G: g
functio_n showInfo(){+ n3 Q7 I+ Z+ |# b: V3 J% J- X0 y; q2 r
echo __METHOD__,'<br/>';/ f, N3 D. q S$ c0 P+ ]
}
# C1 i, `. S J$ W& t' @% C) znamespoc_e CC;! C- G; h% F" L
functio_n showInfo(){
5 c# C1 v. G. C, |8 A% ^ echo __METHOD__,'<br/>';
+ [5 `1 g" @3 ]( i" \$ N) x1 a) {1 |}
/ [' V) G: n. I$ O* `, B/ u, bnamespoc_e AA;
" i3 ~: ?, o6 jfunctio_n showInfo(){
2 d* W3 `1 s+ M6 x echo __METHOD__,'<br/>';; _0 p. C. r! k2 E: R# z- ?3 r
}
; }. H* p0 ]) k+ H//非限定访问:用于访问当前空间中的成员7 b6 R- c8 F( C
showInfo();7 a- }. [. F0 a& T! H1 W! z
//限定访问:只能访问当前所在的空间的子空间中的成员
' `- {2 C% [: n! u4 T) o5 @* EBB\showInfo();, B: P: k/ Z: P; v% r3 k& l$ [' j8 N
//完全限定:可以访问其它所有的空间的成员
. {7 ^ m( @; D) V\CC\showInfo();" q' e. X# T) m) q8 }3 f
↑根空间标识符+ p3 ^; T2 z1 e
----------------------------------------------------------------------------; u$ T% W: M( [. d; h
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
; C( I! w' `8 ?; W
+ w* m/ u- _9 ?6 b当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间); ]8 M% g3 B4 x% ^2 a3 I9 S
% u* @( G8 g7 d6 q代码示例如下:; X4 e' @3 f! T2 C" F
% K' ?: S2 A7 g# V3 |0 t% t% C5 z+ ~
----------------------------------------------------------------------------, f9 i# @, \* K+ x: B8 k
+ ?" S+ ?) m1 k* ?! ?' c- H( V: L# C
5 t) c3 m" \4 \9 P+ A- Q04inc.php) P+ P0 L# o* f% o/ w4 m& Q
<php. p; o4 |: O" \
# l' T$ k* i6 o# S
namespoc_e Core;6 i) M' l# L6 J
include '05ou.php';) A! t! f' F, G! ~# a. U7 p
new \AdminController();
6 L) C# i ^( ]( x. f3 b& YshowInfo();
) [ [* @" ~ ? l6 T% m9 }+ R8 _2 P" [- h& j1 n
echo P;/ ]2 E5 C, A0 i8 u
//根空间中的成员,只要类的访问必须加‘/’
5 m9 e/ N1 u0 Y" U9 N9 ]- Y+ g----------------------------------------------------------------------------8 F, v( |) [. N- u% I6 x/ ?+ u4 [
! z; w- K/ @0 Y6 f9 Q3 p05ou.php$ y. M2 z$ G- L, O2 Q
<php
% j* Z) Q" h2 P3 ?8 tconst P=5;9 m! ^% D, \- s1 `
3 H) t. |4 O9 a) R: E5 }& C2 V8 A+ Pfunctio_n showinfo(){9 V4 g: C" E& E+ b1 W. D
echo __METHOD__,'<br/>';/ j# F* H4 @) |5 x6 E
}6 M8 {0 o, |" Z7 m- l
) Y; z& }( A( B" {& C7 s0 K4 T
clas_s AdminController{, Q" i8 B2 t& T# ]1 d0 O* Z% J
public functio_n __construct(){
& o4 S5 R- I% p5 g echo __METHOD__,'<br/>';2 `; X% j: i1 Z3 L
}5 o( ?" J) B6 {" b' v) T
}% F3 m s0 G: k6 `
* m; h) K% T# ?5 w第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
, q! \7 F% k( ?8 F+ ?5 Q+ X----------------------------------------------------------------------------- u0 q9 J, R+ F7 I4 V* a, }1 ~ G
04inc.php
% p2 g& B- E1 B' j( {<php/ ]' Q8 d7 c! }" Y* ]* J
6 [% O- B" G8 V- z" B: G
namespoc_e Core;% N4 ]8 C# v) R' f z$ }2 o8 g/ ]9 c/ |
include '05ou.php';
1 E9 [% l7 U$ B7 Q5 W- Bfunctio_n showinfo(){
+ F7 B0 l1 @! x! A1 w8 b7 ^ echo __METHOD__,'<br/>';6 h& R* p: z8 x0 U9 h0 @
}
l/ a6 g, w1 a% _( P; N: j( N7 s8 c) E
new \Controller\AdminController;
4 N' Y: b7 c5 V7 B4 L* j----------------------------------------------------------------------------
6 f% T1 _8 Q: R3 r2 g6 F, @05ou.php4 \& h1 N4 d# m: X
<php5 i m; _7 N1 ?( L+ r1 L4 N
namespoc_e Controller;. a2 I9 e( s3 o% L- `7 |
/ X4 L+ p, m/ U
clas_s AdminController{7 D- H% C. A" e; _2 A, f
public functio_n __construct(){
" v+ L- t% D/ t6 r$ }0 L echo __METHOD__,'<br/>'; W% N+ q, m4 D% q! }) v3 K
}
7 b# \9 ]6 S* t4 a! f}
v4 \& e! y" l& X" R----------------------------------------------------------------------------
& n" e0 `$ A! h. m' t/ `& d/ z$ X5 C! y, v( N+ g
4.引入空间成员:; U5 g* W& Y2 Y4 y
- l" T% i, q/ e
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。: X' q8 E9 \3 N# o/ M* ?+ m E
4 D X- R7 V- I: t/ ?: }" `----------------------------------------------------------------------------- }( n5 u2 x. v/ G
5 K# _# L* ?. L0 E( o04inc.php6 g5 D; k4 }) Q$ v
<php( ~- }0 M8 U- G" f0 ?
namespoc_e Core;
: M/ x; D; `# I: U( u2 D0 euse Admin\Controller as con;2 Q z3 P) j2 O+ ]: g% ^
7 d4 e& r- [# l6 ginclude '05ou.php';
& [* E% d b% R0 B( }! d1 m! t h
. _6 h1 }* P; dnew con\AdminController();
6 H" t! g: F& ^3 d2 L----------------------------------------------------------------------------1 f0 X- P4 d, F
05ou.php. }& C; C4 S) w' {
<php% f; J4 o z; [+ [- q
namespoc_e Admin\Controller;) G. a5 E, t# W& e# }; L+ i
: r, i3 X9 x/ B% ]5 @$ Vclas_s AdminController{8 o3 F1 K, d. h) U1 j+ \& T. E7 y/ g
public functio_n __construct(){7 l: p. D/ P7 S, I t& v. Y% ]
echo __METHOD__,'<br/>';5 A" j& T$ p3 a) U7 j; ]
}* l6 K; }, X, U( G
}1 N6 b' A) O% {! ~+ P7 w% q3 q' d
----------------------------------------------------------------------------: X9 f; ~ o; `8 p2 n0 m
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
% Z# u/ i0 M+ x1 z) w! x! Z' B0 D) ^, q+ P; r2 K( }1 i# [
----------------------------------------------------------------------------
L5 R( Z% a ^3 ~
9 K$ T- {5 Q; |0 T- v04inc.php0 v' z' w2 n0 x/ e
<php; o6 [) e( _5 w* x" p- Q7 r; U
//引入空间成员类/ u2 ]1 ?+ y8 [, b
3 C' u2 m, r7 W, b6 j5 e& Q
namespoc_e Core;
- _/ c$ D+ C, B; Z0 S2 ^use Admin\Controller\AdminController;
& K/ t: C7 E5 |3 V1 B- }include '05ou.php';4 \0 {* N1 A! u4 v& y- W v ~/ |
% K; h$ \" l# P6 V# Hnew AdminController();
* V0 z6 e0 i" m- c7 i8 O----------------------------------------------------------------------------( L m( Z* N, D; y8 d# b% s
05ou.php
1 g( H3 d9 @9 {4 {5 e6 l4 u0 R* C j<php9 R' ?" {% h5 N4 o% r& J7 v
namespoc_e Admin\Controller;
# m4 e& F4 t! z; M. u* v# l3 E7 D" y( _6 k$ w( x
clas_s AdminController{
7 j P! n0 J* {9 i% E: p) j public functio_n __construct(){% Q8 N8 B/ N/ s( H9 m6 t. V0 x- K
echo __METHOD__,'<br/>';
# j' c' {6 A) Q }
* G( V E4 u& |$ Z0 T}: I" m- G4 I3 e* o
----------------------------------------------------------------------------/ z) |2 h' w X
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 k! o! S" y( v- f) R H8 K
4 @8 S# N6 `1 ~& L$ q. S2 E; A4 C' Q0 i
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
) I. \/ [" p- \$ [$ p+ T8 R
p C! w" K* S- S7 C' e4 S9 u" c2 k2 a
1 M$ q0 w& C+ F4 u2 V4 [
. _) K, _5 w0 G; Z8 k0 L7 O/ e
5 {) F% k, e1 S: p
/ P k$ Q: u. i! E _; d
|
|