管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:9 V7 D% }3 z ^5 [6 k; i
' q; J) P. b$ j- m7 W. ~
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:, T6 n& @0 y! k* s5 ^! h
# h. u7 M- m. j/ }% E! U. y" n; |
% n- V* Z @9 r" J) W/ [8 W" c" `
* k7 S* Z) i2 P; r我们来详细的讲解一下PHP中的命名空间:
. c5 |$ d$ J* n0 ] y
: ~) V1 I! g, g* ]6 Y2 e语法:namespac_e 空间名\空间名;+ D% C, j) D# U" y: x- B% ?
3 Z; ?; U* H( L4 ?+ {' K说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:0 l4 a$ I* T8 Q/ s
& y$ ^7 T: {, G- U! I3 T2 j F) |----------------------------------------------------------------------------: g" _7 C b" Y+ Z5 _
$ E2 o; c% w- V2 b: V<php
7 v: K9 o: j% H9 z( w& {/ f# L1 f* C- C& m: T8 N8 G6 R
namespoc_e AA;
& Q; a v& l6 Vfunctio_n showInfo(){) e1 l/ _' {; d5 J5 \
echo __METHOD__,'<br/>';( M8 [) b5 F$ p1 C' v. }: K
}
9 E6 `; s) g; c5 }/ W1 {showinfo();* y& X+ l4 Q" j
8 T+ G# t, \1 X7 z9 Hnamespoc_e AA\BB;+ ^8 T! a" w4 |1 E" {
F* j" o/ `8 p& R0 M2 zfunctio_n showInfo(){2 U3 \2 @2 N y' X2 i ^% x& c F/ y
echo __METHOD__,'<br/>';' C( J5 ^. I' F6 c( W' R2 }
}
9 Z5 B; f* M* Z* i2 Z0 L; f//showInfo();2 b5 ^1 y6 G v1 m9 i6 s6 U
----------------------------------------------------------------------------
6 @$ U" u& w9 T& n/ L2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
$ {- P! _6 U7 J( H( Q* F1 }$ b
; G! D# q+ z$ ] e3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
8 A# R- m( T/ A2 M# p3 F5 z* {; G2 P* [0 u1 r- _( l
---------------------------------------------------------------------------- r% W+ h/ E) `$ |8 P
* u5 l9 P* C) F<php
# T, m9 i. G# X" m6 fnamespoc_e AA\BB;9 o; P4 r& k! ?& q6 q7 k2 s
functio_n showInfo(){
" E5 v# Y: T( v echo __METHOD__,'<br/>';
' G( z6 V& \7 b6 t, o}
+ d8 h' W0 m* j! l9 d' onamespoc_e CC;
8 F2 u# }+ Z) t0 w- ?8 Pfunctio_n showInfo(){/ g" T$ l8 B; k) q- M
echo __METHOD__,'<br/>';% J2 L! U3 C/ O
}9 e; T( | E( S: w. m3 F( T
namespoc_e AA;
8 q7 X( d0 E8 D: a# n" |+ {' Z4 K1 O; ?functio_n showInfo(){
5 |. }& a/ k( w- Z0 k echo __METHOD__,'<br/>';) M3 B7 t( V+ t/ Y3 ^, k
}
- |* W8 I- R3 S2 K% a//非限定访问:用于访问当前空间中的成员. U( R* f+ c) x7 d J1 F
showInfo();
# o! Y& Q$ d: ], @7 S% r d/ j; w//限定访问:只能访问当前所在的空间的子空间中的成员0 i$ j' b: O! }- f0 _" c3 t- B
BB\showInfo(); b& H, K) `$ q# c% C- U
//完全限定:可以访问其它所有的空间的成员
( X- \1 [' u3 ^+ t6 r2 H\CC\showInfo();& \6 \7 R0 D: D# M. I' w7 I$ W0 T
↑根空间标识符& P1 O, |) S& T& _3 L
----------------------------------------------------------------------------% v2 O' `: S; x" u2 @( n
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:( D4 a2 T5 t/ P, x6 D2 [7 P, S6 u
6 h, s' o+ _" R9 }+ Q6 K! m当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
' f( {5 E5 n( J# q, I+ [1 `* K% l$ t4 d
代码示例如下:- X8 w$ ]# P2 u" C" V; v
; s! O1 d: F$ b1 K% L2 G% s----------------------------------------------------------------------------8 c& N4 W+ m1 X0 i
4 g' v4 b* e4 l6 @' I0 t$ L3 g t' ~& M
04inc.php
6 p& ^4 N k& c<php
: Y* c) p1 U. J8 H0 L% I- A8 q. u; G/ G* \6 N1 O3 J( _7 \
namespoc_e Core;
+ d( q7 O. o* D" }, _9 [& Ninclude '05ou.php';7 R2 {, b- Q& Q; o& e' V
new \AdminController();
! }1 u* l: O2 }& E( C; h2 D0 e7 MshowInfo();
* e+ v6 l6 X( x2 t: p. A. Q: n4 {% d& T1 |: h
echo P;- q5 z6 I1 e. M# _
//根空间中的成员,只要类的访问必须加‘/’
( c* d9 `& U! L8 L- L& T----------------------------------------------------------------------------
( ?/ J+ T* V0 `% S' V" C
6 ?& J9 i% p& c0 a) T05ou.php
0 Z3 V( q6 Y, G6 |+ ?. o<php, K4 m; ]9 t# ~% o# G6 K
const P=5;
2 ]: X" R( _8 n) d1 D; M( n9 H! D; X" ?. _( [ a( o
functio_n showinfo(){. {& d9 M* z1 I+ L( N4 I
echo __METHOD__,'<br/>';
g- B" _6 [2 S( @* k}. E6 f( @9 U d% p
2 x$ _4 o2 K: Y. u# i0 i, P
clas_s AdminController{1 V5 h; s# G6 j' B
public functio_n __construct(){
1 {: P$ N8 c! I# o' A echo __METHOD__,'<br/>';, Q" M2 f8 K! X8 a/ O) O
}
* J1 h \, c' \& S* B}) H8 n$ @5 O" @6 @( C% l
/ W; d$ m& x1 F- U( Z第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。) Q2 ^8 I3 u* O3 ]( k) C' z( ~
----------------------------------------------------------------------------' P: ]) L: |4 Z* |; S/ e$ l
04inc.php4 @& R+ x( G7 _* p$ N$ m& W
<php) M; e& w9 S$ Q' ]
) Z+ W0 O7 R0 z2 B7 Wnamespoc_e Core;
# Z, z. n! m9 j7 B4 c1 z) c$ p: Z7 yinclude '05ou.php';
* ~9 h, O+ S, x6 |9 C* `$ B3 Rfunctio_n showinfo(){! N9 P; V8 j( t/ @4 E6 d- X. P
echo __METHOD__,'<br/>';
2 g8 [: O$ i& c: [* O# z}% k. D0 Q+ L4 A7 o8 V" t
' F% r3 }" `- O. _, }* G5 x( _' N; Z
new \Controller\AdminController;- f% p! [$ W2 A5 e0 y# |& b
----------------------------------------------------------------------------
3 [5 k6 @9 w# z' I% Q1 Q8 F" v05ou.php
8 M7 A4 ^" z& V: a' e% Q<php
7 v$ z- W# c0 `7 g6 V. znamespoc_e Controller;
7 _; A: X5 |4 A7 Z# J7 n
4 i& s8 X" A& a. c3 Gclas_s AdminController{
; a- Y9 \; }; c3 E9 z public functio_n __construct(){* ]* O: r+ m( O2 v" T5 Q
echo __METHOD__,'<br/>';
4 j6 A) ]) v4 Z' A6 g% ~ }4 s$ B+ B' @+ k* k. ?. ~
}: k Y1 K& y6 z' S+ j( y! ~
----------------------------------------------------------------------------
+ c# t& L+ ]; K
! H+ i/ o' k& i4.引入空间成员:0 l; p. e6 S- O+ Q; t2 G
1 B' ?! {* K- {+ @" i( e& n1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。, [3 z- g7 @1 K4 z4 p. X
}) i4 D+ a: j* w1 e
----------------------------------------------------------------------------. v& B" V/ M/ P
" H8 I% {& J e% E; o& K% r04inc.php# m- r, K( A0 R) k! Z/ W
<php3 h& S5 h' u$ @" O2 ~
namespoc_e Core;
& A7 \8 n% B. C: u- Yuse Admin\Controller as con;2 ]* A5 {, P2 O$ p* J
& i( o# X9 K9 Yinclude '05ou.php';+ F8 G- `- S+ x) S p1 U
9 f! Z: a3 Y" k Knew con\AdminController();+ `7 }, o( C4 l' B9 [- i/ z; T
----------------------------------------------------------------------------
# D% F! N4 S: i% Y05ou.php
3 P1 T* {+ P* E: N3 [+ d; ]3 M<php
% v: y6 w. V- h# Q _namespoc_e Admin\Controller;
; R4 C8 L5 t0 M1 u5 }
0 ^5 Y! ?7 `/ n+ u. Z" ~clas_s AdminController{# r9 L; f1 D8 F* w% [; r
public functio_n __construct(){
. L% c1 F' A" y5 V+ M: s" ` a echo __METHOD__,'<br/>';
7 \$ U+ o8 p! H' ^/ ?$ J( M) } }
1 ?, K' B% p' N- U9 {' `- L}, \& t# R* x$ {7 w
----------------------------------------------------------------------------
3 U" X; s: n9 j9 Q+ x2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 T7 }% G# m! ^2 } l' R& ]: c" ]7 {; V3 Q R
---------------------------------------------------------------------------- P5 W; m2 S* ?7 j7 R+ E
$ x4 c+ i: O, ~( N' P: K3 e
04inc.php
2 ^4 b e7 Y7 e; W! e8 O<php. i( z; p; d. h! u9 ^
//引入空间成员类
6 v2 ], y9 ?- o2 ^6 c6 [$ L2 h$ `% o! {8 `8 C' c
namespoc_e Core;
2 N7 R9 x" _6 g7 v6 n9 s6 `2 Ause Admin\Controller\AdminController;
( d# {* {: o0 t# Ginclude '05ou.php';+ j9 r8 H. P6 ^ X/ \* l6 v5 o6 Q
+ M; j6 s8 g+ H! J( ^/ o7 U
new AdminController();2 T7 E R0 q( |
----------------------------------------------------------------------------
$ i2 G4 ?& o0 I3 D05ou.php
" n$ }# w% h6 q& ~1 X$ E; l0 N<php
6 S; l1 y! M0 y$ D% v$ \namespoc_e Admin\Controller;
, a4 V2 b& n* ^+ z- o0 q4 l& h
$ [' ^ g- A& D# L- k0 Iclas_s AdminController{
. p8 G+ [8 \9 s# `; g8 d public functio_n __construct(){2 o5 _' V! j) N7 A/ q$ ]
echo __METHOD__,'<br/>';
. r$ K3 c, ?% @+ [* o% H }1 R- |, a/ D1 Q+ ?
}: w4 h7 q, a$ c
----------------------------------------------------------------------------
' y: l7 j( N$ l' Q! l5 s/ x: Z5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" u2 v$ w: S; A* E. j3 @+ \3 g& e i, _" [- s7 z# a, u, e
3 T9 c+ q6 D/ l
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。1 r1 q: C- {: n9 O3 \: i$ B1 B
/ k, D. U9 S) r. J! `2 n& J) l8 @ v, Q; M
/ R2 ?1 |, ? I- J. n
! Y* K" u# ~$ y% H3 B# u
! i! d+ j: C3 p: o% O+ G) j5 }& i+ }9 x$ o9 w V
|
|