管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
1 f5 Z- `& q" C+ m1 a* i: c8 p' N% K9 c8 C$ |( g, ?4 w9 X; L
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! p. ?4 w9 a. v7 T7 t a& ~ I
; s- `# C. X2 f- V- C# A) w
7 A l: d, u8 m' s% K5 M/ c9 j& P8 U+ @9 V, ^
我们来详细的讲解一下PHP中的命名空间:
3 e( `. J" v3 e/ f! b
2 h, U2 S6 |' ?& w; |8 }语法:namespac_e 空间名\空间名; ^7 w% [! `" x
7 @8 v5 _. J. y" @说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" T1 c( h9 A& s! y
- j% T5 X) q; F! O$ X! q. ]& W----------------------------------------------------------------------------
3 i& r8 e6 C, B9 i3 Z, n, w2 U$ R+ u* }- ]2 d, t* @- t1 [- f
<php, _' r3 e* \ Q: x4 S
?* X$ f7 E( }7 o. Q$ Fnamespoc_e AA;: \6 G1 @ R; R2 t3 \6 @. @
functio_n showInfo(){
& [$ p3 k4 Y3 o5 M echo __METHOD__,'<br/>';
- C8 f& D" y( t( |8 c [& n}/ J( Q( L7 w6 K0 K
showinfo();) B* S' U5 ^/ k
' t6 Q+ ^6 H! h P$ B; ^( V
namespoc_e AA\BB;
* b/ h" s c* x& m
9 x6 L' U0 ^" S# Q3 g* pfunctio_n showInfo(){' x- d/ C8 t/ w: K& D0 A% A
echo __METHOD__,'<br/>';5 I. t# Y% u0 I( e7 L9 [3 Z+ ?
}
L7 k6 T* F. ?* K: V% H q" X//showInfo();2 o, w% ~8 @! }2 X! n# }8 N
----------------------------------------------------------------------------
* P. P8 w w M" E2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const), L, h- L$ I/ x: S; b6 T' [
6 \' e- q- R7 P% b7 h5 Q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 f( I) l w; ?, X6 x5 V T7 x3 r- C, l% R5 G- D3 l) a
----------------------------------------------------------------------------
; T4 }4 W; c9 q; y0 H; E% \9 M& ]
<php+ w+ A5 D) e; V+ }2 Z
namespoc_e AA\BB;
& ?7 e s! }$ A# z/ Y0 Afunctio_n showInfo(){
% Q% o9 E- L, t e echo __METHOD__,'<br/>';2 S! [: G9 [ A2 N5 Z* i& k
} o. j: g, d& |" p9 n" t# R3 ^
namespoc_e CC;
# Y! O' f! y0 W c/ ffunctio_n showInfo(){
1 U- T4 W' y* U! t5 V+ k echo __METHOD__,'<br/>';. K. I9 b& b! v7 ~2 ?" c* _, _
}) a% ]# G# h; r
namespoc_e AA;
' ^- R. p+ _4 c, w' G5 F, kfunctio_n showInfo(){9 h* R+ [. Q. ?1 l
echo __METHOD__,'<br/>';/ x0 z+ ?/ q. f. U/ ?! \& ^
}
2 W5 p9 Z4 T9 K' Q9 e5 Z4 m//非限定访问:用于访问当前空间中的成员
2 O. a" [! ^( d& g. u; @, WshowInfo();& ` z2 I, s/ [; c+ B) E% H: w
//限定访问:只能访问当前所在的空间的子空间中的成员
4 n# f' S; ^# d" D' F1 j7 x+ rBB\showInfo();
, s B; c R: k* j) a9 V//完全限定:可以访问其它所有的空间的成员
) q; D$ S# H* _( u\CC\showInfo();0 G/ N3 n8 J y4 h
↑根空间标识符( J) M q" K% `) T
----------------------------------------------------------------------------
1 r9 v/ {* s# G* v$ P2 J但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
9 w& |0 P$ Z1 O; p- N6 m# P
- R2 j& q U8 X( j9 N* z当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)8 j2 {* {6 \; j6 E% C2 G, R4 n
. M5 S' q) @ ^% \2 T) @: N
代码示例如下:# p" [6 x: j1 O% f# c
K$ |1 G% x' e: y* n3 o
----------------------------------------------------------------------------# G3 T0 k- o1 s& Y8 G! u
7 h+ d' ]# D' k% Y, n, B# m& H7 ~# p% w! u
04inc.php0 L7 O# v: {% a
<php* H% k. \" O! z
: ?# R f$ l' ~/ L/ z
namespoc_e Core;
8 u1 A* P; x( y( {* Iinclude '05ou.php';8 \$ e5 C5 ^! T
new \AdminController();
+ L6 G: ?3 E: ?% \% fshowInfo();/ L7 r: e( D- R R& b% K8 S
# d, n1 f( G8 d. |: Y# V4 Becho P;* s7 S! K% R' g3 f
//根空间中的成员,只要类的访问必须加‘/’! R1 V8 h. ?9 W/ X
----------------------------------------------------------------------------
: u$ S5 D+ Y, y9 ~
: h0 J2 H- K, U' p8 e: I5 d05ou.php
3 } X) f* o- e* U. a' g/ {1 _<php
% L5 P& o+ z* J. v# H6 T6 N- ^+ lconst P=5;. Q% K( J1 f2 q, O9 F
! f! }# {! j+ q& D; H, Ifunctio_n showinfo(){: @: `* w8 z7 g; a5 e( ?/ {
echo __METHOD__,'<br/>';
6 c& i* {8 }% u0 z}3 W" v. _4 s; d2 H! `9 I" |7 \
( D" S; H; N, o0 d! u b4 Q! }
clas_s AdminController{9 g4 s0 X8 Z* `1 k. W; i1 l/ L4 C% u
public functio_n __construct(){! ?0 T' f! P$ r" R' r4 l
echo __METHOD__,'<br/>';. ?8 y7 |6 t* b* L6 W; l5 L3 x9 ]
}9 K. t w. C& A* P- R; u3 p
}
, g+ p- j% j6 X5 @- A$ v0 q
7 C! S! ]5 U9 O* R$ {9 |第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
7 t: \! @7 K$ K. T----------------------------------------------------------------------------
1 }& ^% E7 w: P& |' R$ M04inc.php
' q" i R4 `/ Y6 u6 X4 |<php
s( _( A' H$ C" w- m' a e0 c+ U2 d! m) }: f, P
namespoc_e Core;* y p7 x6 k$ {6 I5 l1 C
include '05ou.php';) p. d* m* L* P" ^$ Z6 ]$ {
functio_n showinfo(){
' I% y' W' t9 E" c2 a2 a echo __METHOD__,'<br/>';
% X/ u9 H4 x- n}4 C& f1 X5 ~7 }$ w. c( v
( @- P4 q! i" {/ e: W; u* _new \Controller\AdminController;" z: n, ~4 l2 d, C3 y
----------------------------------------------------------------------------+ w7 h8 ?: p2 \0 I; q
05ou.php( E, f" \3 Z* B1 d$ J/ |- N1 h
<php Q7 e' t( x: l& W3 s
namespoc_e Controller;' N; U1 [- e9 n
8 K2 r' Y# Z3 v: O* A) F/ E
clas_s AdminController{
0 j* n7 ?- K% _9 ]- P public functio_n __construct(){
6 S8 j2 |/ Z" v$ V1 p3 n. p: b echo __METHOD__,'<br/>';+ M7 [: J7 I4 [
}
4 x0 }2 |& ]4 r2 S9 F4 v8 B}
9 R1 A7 }5 m O7 C----------------------------------------------------------------------------6 o% g* V# S7 W z6 \$ l) R. d
4 K) u9 o' P* g; A9 _4.引入空间成员:1 _2 z6 {) Z q! U5 ^0 t# d% d: u: x
+ d7 l, {6 d/ p- Z* a! o1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。) x) {! p* o8 a8 q4 P3 ] o, o: n
5 ~; P: T7 q0 c8 K( U2 |2 |----------------------------------------------------------------------------) A P7 R% x3 m/ J) r. Y6 y
* j0 l% d6 b( m& B3 l" g; e9 P04inc.php
9 @" e: F& P6 s! I<php
& k: e2 P2 E1 @: jnamespoc_e Core;( H( d3 a2 K& k. ^
use Admin\Controller as con;
" R, k, V, n; [3 z) [& n8 }; x! J$ d0 T0 q7 h$ }% q
include '05ou.php';
1 i. E8 I- \, X4 {+ J% k
5 O1 a1 M$ l3 P% c7 o4 e4 Anew con\AdminController();
+ T; E; v7 o# m/ q" m- S0 C----------------------------------------------------------------------------
! g ]3 H6 q% y05ou.php
+ S" o$ ^, e2 B9 C<php& R+ J2 Y7 r& ~3 L$ |! P# |8 e, |) N
namespoc_e Admin\Controller;
. t3 o2 P, v+ r5 U4 x" [* S$ M v; K3 J/ P, D5 S% y- @0 {
clas_s AdminController{* ^$ v! G" E/ ?; ^) }( Y
public functio_n __construct(){
. K+ v0 c; L3 l) Q echo __METHOD__,'<br/>';3 k* |0 a! F- H# c8 W. l
}
1 z% r5 d( I' o% g}
# e/ K/ d( {( K" U7 n----------------------------------------------------------------------------
" S5 C3 p- g' {5 t( g; ?2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
& V* U6 o) K& b. [
" X8 X3 l' }0 b8 u----------------------------------------------------------------------------. f# R/ P' |$ f: H
5 I( x' {* {0 B4 g
04inc.php* I3 H1 w& ~* A
<php7 q7 Q- U7 t4 O$ i
//引入空间成员类/ x9 d# n! ] d5 a1 W
% W7 k; q/ _8 A9 N9 @5 `7 Onamespoc_e Core;
1 Y4 x; {( {, ~2 Iuse Admin\Controller\AdminController;, L+ u' }2 o# p3 J" m
include '05ou.php';
% {8 I! p$ j8 v- o c1 p& l% Z2 ~" a2 ~) k; f- O+ x
new AdminController();
" ~# Q; N; J! R& l' l9 o- d----------------------------------------------------------------------------% R7 Y# A' H3 s+ M$ \$ {: O
05ou.php
& O; r6 c9 d# f4 V) R<php
& N! Y1 U+ @* T0 {0 Rnamespoc_e Admin\Controller;
5 F$ W4 g. V/ \1 _4 G5 h- r# [* F1 B! B: f
clas_s AdminController{
7 j7 h; c; |& A public functio_n __construct(){
2 B6 c6 { [# ^7 m1 g echo __METHOD__,'<br/>';
' N* z3 r' b3 T# y* ?$ j0 [! F }8 p% f" n2 d3 ^* I; S" C; n
} [7 `) o5 X0 a9 k
----------------------------------------------------------------------------5 f* j4 X% w' s) b( X2 F3 p4 w% B
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 F/ `4 b. |6 @ Y R0 O7 S
$ i5 m8 M6 M: O- b: x8 k; G/ }3 t+ J, r* p8 a) I3 Z1 f
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
7 L& ~% ]; l. U9 I) ^( ~
+ U2 M6 ]/ n# m2 {4 w8 \4 X
Q- _! }0 a* i& Q
0 B k. |. _# }8 `% r, q8 {
$ g! s' @! T+ E5 b! ]; Z4 V! G! ^" ?5 L7 u% t" E# c# H
# w- O4 {0 u/ `" q |
|