管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:6 |% Q* i( J6 q1 e8 W
1 f- K+ N3 o( j' _+ w' m在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
. h+ l$ a! t. ~% o( j
2 j/ J4 U* A' }! h
( L* K0 {2 V, O7 z( @, I) ]! I" \) E& C- Q5 x
我们来详细的讲解一下PHP中的命名空间:
% x5 w3 b' D: g6 ^& F
& p+ ]7 b- f0 @* I语法:namespac_e 空间名\空间名;
% @! |) ?# Y+ @( U4 {& {8 g3 r8 U; x' i. d) y- o5 z+ ?( y8 s
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
. M) U# S7 Z" D) J+ Z1 e# [" E( [
. _ C: z0 }) w----------------------------------------------------------------------------
& c$ F6 G; f0 k# l
8 V: S7 a3 w" U4 C4 o2 o<php
0 l. J+ E( a3 c% s4 D$ q2 p9 N4 W" v4 r
namespoc_e AA;; K, k7 A0 [! D
functio_n showInfo(){
& u) V/ y: u2 c% G1 b+ l echo __METHOD__,'<br/>';
% c% R- \: `0 E2 \/ T" [5 l0 t}6 o& _) Y0 n; y0 j5 i R' T
showinfo();
% p* a' T) w, ]( C# M; o+ z8 H4 `9 }" J$ F0 x! m* g7 q- Y, X
namespoc_e AA\BB;
" d- h& g7 g" V( x3 R! a- _6 Z* F
; q; V% H; v! m; w+ M, \; Nfunctio_n showInfo(){- _9 ]: a X3 ^. X& C& i% E
echo __METHOD__,'<br/>';" F. }+ Q* K" H
}
8 Z9 w" E1 N; a0 M' a9 y5 u//showInfo();
# s1 H; f3 c$ L' A2 C, ]: o/ v/ s----------------------------------------------------------------------------
3 {; ^ z& e# n5 F$ ]3 g2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
5 i" `$ W0 R6 z" g% ~* `8 _$ G) y
, k; |- q8 F$ U. x5 ^1 e, l3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。6 f0 A9 ~$ C+ N% [" O/ s
* t7 \+ _: s4 m& u" ~/ Q
----------------------------------------------------------------------------2 r [4 K6 Y3 Q: o% F/ o
2 `: A0 R0 K8 M! h' e9 I<php
( ]8 U( {5 f6 D, `6 g$ [) `namespoc_e AA\BB;
& j, n3 G% V6 g" Rfunctio_n showInfo(){
& n* b3 D9 [) p' E. X7 S! Z Z. G echo __METHOD__,'<br/>';/ S; ~* ^. Y4 u5 Y& {, @, S
}! k5 \5 T6 X& x$ `) j+ H4 ~" u
namespoc_e CC;
4 z1 Q( H9 ^' T/ ^functio_n showInfo(){" R8 U/ `9 @( L8 R: N
echo __METHOD__,'<br/>';( v) ?# ?5 {. J2 d8 F
}7 ^* O, Y* p- O/ |
namespoc_e AA;3 N8 t) a, o' |) w; r6 U
functio_n showInfo(){7 X3 ?( u! q# U
echo __METHOD__,'<br/>';4 j7 O$ _; h: {4 m8 T
}
5 p9 V# ?! r. ]8 @//非限定访问:用于访问当前空间中的成员
Q( h" d' k% X3 ^% wshowInfo();2 a( o6 \0 t5 @6 K3 X+ t! `
//限定访问:只能访问当前所在的空间的子空间中的成员7 F+ F+ ^) c& D8 A
BB\showInfo();3 J5 A+ Z) _4 V8 V8 q" P9 \
//完全限定:可以访问其它所有的空间的成员; x7 }' W6 g, r- y. K! u
\CC\showInfo();- H0 w# _# G' C& c& O2 \$ e6 `0 }1 i' q
↑根空间标识符
- O9 ? _5 D+ y5 N----------------------------------------------------------------------------; i& l6 f" H0 }
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
8 m! j0 K& J$ n3 |: I/ N4 f
. ]* o/ u5 f& Y4 \2 s当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
' P* K: x, K$ e0 |4 k8 p2 L- c' a4 h4 F
代码示例如下:
* {# R6 ^: P2 e8 S# U6 G2 K2 o( {8 a1 E: X+ s9 B) }8 Q
----------------------------------------------------------------------------; d& H! N/ R8 K) I! m! m, j$ R: ?
" `6 J' G* N: w4 K
! ~) ^# @: E0 g+ h
04inc.php5 f8 n( H7 E( x9 r
<php/ N4 G' |- N) Q* N3 R- t
% p9 ^% h) p$ k9 ?( d: Vnamespoc_e Core; \5 w6 T( Z" j4 L: l% D
include '05ou.php';
I; z9 o2 g% G5 O0 R- l2 \new \AdminController();
6 K" W: \+ ^$ |showInfo();& U$ R/ C' d/ ^/ q% K
0 n' d8 T. n0 I, Oecho P;$ g6 ~5 k& F* @' N1 M6 e
//根空间中的成员,只要类的访问必须加‘/’% v0 x4 c& ?& y
----------------------------------------------------------------------------/ l, a, P5 x% g
" P2 \. s# _2 R9 q1 q
05ou.php% k: d* K9 P3 j5 R
<php
& N8 F$ ^5 }- U' a3 x, E6 sconst P=5;& W/ s! s0 w0 @" r1 [) o6 k: ~
% C& a& H/ u. k' a8 d: r, bfunctio_n showinfo(){
" s) m0 D! l; I) b8 ]! @ echo __METHOD__,'<br/>';
( I5 }3 O( w: y$ n}
' K9 t$ C( ]0 X' j& B) u Q
: w) F8 I: Q) s# L# ]: U/ ~clas_s AdminController{# {: ~2 Z0 E4 L5 L3 ]
public functio_n __construct(){
! O# _ H5 p/ l2 h/ ?5 }; i0 \( h echo __METHOD__,'<br/>';
' G8 I% X: ?# B( r }/ h/ l3 [9 a5 C1 D0 Z7 V) T5 f
}
1 H E5 }) l l3 |& ]4 u5 ~1 x0 {9 M+ O2 m6 W! I0 h* ^9 u: j
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
% i8 M9 w; ?# t3 O& h2 B----------------------------------------------------------------------------
- C' T* S7 y& _. s7 D4 N( ?04inc.php
$ d4 ?1 M$ {: ]8 ?, v) D# W: e<php
1 M6 {) V( f0 i( l2 x
& j; r9 ~' Y. S' J# i3 enamespoc_e Core;' {# @- B" g3 m1 w+ G9 \
include '05ou.php';) G/ M9 e$ j1 I$ c1 y
functio_n showinfo(){6 m; k% T7 _0 y, I) R
echo __METHOD__,'<br/>';$ E+ w6 \0 a2 g4 e7 e
}& o! W: Z, I% Z7 G. I5 e9 T8 Y
0 _7 I! l7 k' a4 f0 Unew \Controller\AdminController;
9 r& R0 q/ O7 t3 `$ d" E4 d3 z----------------------------------------------------------------------------
, h' z9 c& z6 r/ y. Z0 L! u/ Q05ou.php
: e! R; Z1 r* T<php
: B/ ?$ l4 n& p% ]$ ]namespoc_e Controller;
+ D* a" q" O) |( N3 L
$ t3 [) a; Y$ f- W% s' f6 X, bclas_s AdminController{3 b3 J6 ~- `; s0 W" J6 t# b
public functio_n __construct(){
/ j9 _9 u4 G" R$ D5 {' } echo __METHOD__,'<br/>';
/ j; C% Q, j1 D: B5 Y }
( ~: ~. v9 a' y2 u( f- u3 S4 }}
6 l4 P9 t; y$ A+ V% h----------------------------------------------------------------------------# L i6 X' i8 Y" Z, U0 R7 I
# K: b6 d7 Z) }! l8 g# p# S2 [
4.引入空间成员:
0 l1 g, }" V9 k+ _
) c8 i* Q D* U8 C: {1 X1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。4 W$ K2 p: Y$ [$ b( q0 M
. M3 a- Z6 D+ `
----------------------------------------------------------------------------
( G# l2 h0 e# R( C# e7 j/ K0 N' K- S' [9 @6 e( l+ n
04inc.php7 ~" v; V1 v+ J8 q2 G7 L. b
<php; K$ K9 E, E# n4 \8 z; }% Q
namespoc_e Core;
$ N8 h$ A; e0 _7 j3 Q8 Huse Admin\Controller as con;6 y" r# z, h+ k
* p2 z6 g: a" S! z* Z2 R1 c
include '05ou.php';
( U7 l2 h/ Z J/ T% ? f8 h/ m8 \5 [1 Y6 O2 U+ v
new con\AdminController();( \6 v. H" k3 n# |% p
----------------------------------------------------------------------------
0 A; g: R0 U0 b4 f) o( u# Q05ou.php
2 h$ m5 F" \. T2 E7 e<php+ o' ^9 B3 }8 E! |7 g6 g" f& G
namespoc_e Admin\Controller;2 q: x6 {; J- e1 W
% T t8 Y3 G( d* e
clas_s AdminController{" K" M ?" \2 A- d/ G5 L
public functio_n __construct(){ ]8 J# Y; X) K" d5 r& c( h
echo __METHOD__,'<br/>';
; t: Y B4 A7 [ }; a+ `. q3 A! O$ {: I8 {
}+ n; C( s0 l8 B" u2 y3 u' B. V
----------------------------------------------------------------------------- a2 u1 @% T+ U6 f$ C" d2 C
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
; e1 \, W. K6 \% o8 j% j$ F: }9 J4 N* z, O& Q! d
----------------------------------------------------------------------------: V& T* x* n! y; n+ r& U1 k6 u: b
8 F) P/ ~3 H9 O7 H# S6 t- a04inc.php
9 R/ U! |( C, h0 V<php9 K; V5 L8 S) b& b1 e) Y9 q/ ~
//引入空间成员类
g, t+ z2 p3 F- d- y6 E: V
( S/ [! L. Y4 z5 t$ gnamespoc_e Core;! W. {& f O& h
use Admin\Controller\AdminController;
7 v3 j k6 G; L1 q2 c, _7 l! q% G$ Winclude '05ou.php';
/ w0 Y7 D( f% k& f. M, G+ K' g- x# S! c: S% k5 `. l
new AdminController();& W" m2 ~4 E9 f
----------------------------------------------------------------------------
, q, M6 D8 a9 u9 a05ou.php6 y+ v$ ?& D& T3 Z3 ~5 g
<php
- @6 B1 i7 p' @namespoc_e Admin\Controller;
- y# o: a) ?' ?) O
* z5 W& }5 K/ F- H& |clas_s AdminController{; n6 _ p6 V1 I
public functio_n __construct(){
8 F2 b& T% J: m+ p) T echo __METHOD__,'<br/>';
$ }; e( V, D/ Y6 ]4 q! j }
' C: _) C5 Q6 a}; v2 S4 {% p9 r; k) T8 J8 x/ u* Q
----------------------------------------------------------------------------; J/ c& V" z1 f& f
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
- Q% g# k, y0 B M; N0 c
( l8 N# ~1 M3 W
# w+ {$ c4 p$ t' u, V3 n9 l这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
: U" j4 W2 k9 K! \( M& r. G3 b+ v* q3 {- S
# X7 S/ L- S6 d& R* F: e' |& t
3 j/ u' h- U n" q, W) j$ A; |
! u! J$ S( q8 p0 t( c! c. V
6 Z5 d& g! d5 G+ I5 V# _1 B `& f+ L: `9 h1 w/ e1 Z" y
|
|