1.命名空间的作用:
, l9 ~0 N3 v. g1 Y' E/ G: z3 N+ m. \
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ q: j+ g1 y+ J/ E
% S8 g! o- f& d8 e2 i# U& a
- F9 B8 T: y+ u0 X' \* {5 l
; S7 A6 n# s4 w3 D# K
我们来详细的讲解一下PHP中的命名空间:
+ l+ {0 q0 W" | l- q! P- |7 f8 F! G D$ M
语法:namespac_e 空间名\空间名;
% o- F Q- P! @; o( D6 B7 J, G l" E' K! l
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
+ I9 I# Z; z% r1 F, I7 D+ @3 S0 [0 m. Q+ L- A# d! x3 W* t! @, g+ O
----------------------------------------------------------------------------; f% ~* D6 |5 u3 D& y9 z
# e) |. L9 H5 L! ~
<php
2 a2 |8 P- |. N0 t- t- a
! h: j1 L% W1 R4 a; mnamespoc_e AA;
0 A, \* `- v! N2 o( O+ t% `: l ?functio_n showInfo(){
. Q. A8 e+ @* G echo __METHOD__,'<br/>';
, i* t, L) q8 E3 @2 h! J}( L9 i, i- S( k2 |- V
showinfo();# Z0 s L, x5 y. C6 i
# I* o1 G& Y- W: e
namespoc_e AA\BB;
1 q3 @9 _+ P" E$ C" d' g" @
; O5 S1 }7 c S) x; N! [% s( A: d( Zfunctio_n showInfo(){
/ a" f) m' Y, m& |/ a echo __METHOD__,'<br/>';9 u* `3 T3 f, n" P
}
9 h, Y% A! b9 b8 p9 p; K1 Z' e//showInfo();
. k; w5 v; O4 \----------------------------------------------------------------------------( {! T; q% B& i% a
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)$ n) c: n( Z4 ~. D4 e2 a
7 W( E2 ^9 k c! A. T% \3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
4 M3 j6 k% o2 P# s, w5 _4 W" A) @6 E3 k) N( R7 W
----------------------------------------------------------------------------7 m4 d1 t+ L% n( l/ t
- m6 t, l! Q% L
<php' ]7 a; F* E7 U. q0 m
namespoc_e AA\BB;6 k6 i( V) Q! z! ]6 K/ p7 c* G
functio_n showInfo(){
# k5 N: L8 c" [7 O: T, i5 P4 B echo __METHOD__,'<br/>';8 Y. M8 s# O0 U! T+ i5 ^
}! B' V3 [9 M- z. T( \
namespoc_e CC;- u+ E0 Y/ T4 P2 ~5 \# x2 Y5 |
functio_n showInfo(){
* a5 ]& ?- N! y' }; ]% i: @ echo __METHOD__,'<br/>';$ T* P. ?# ?& m: Q5 Q% g
}
6 I% D$ l$ C' n9 q: K$ B6 Mnamespoc_e AA;
$ _; u/ ~+ I" dfunctio_n showInfo(){
3 Y( c& K7 t. C+ ] echo __METHOD__,'<br/>';
0 W! [. s% ?0 ^; j" A}
" n; e2 a( g8 K& x% F; A( k6 @2 C//非限定访问:用于访问当前空间中的成员" d: ]2 _0 h+ M1 T0 C( U
showInfo();
/ n. D; p, Q9 d! ?4 U, W* K//限定访问:只能访问当前所在的空间的子空间中的成员
/ R0 f& ^0 M4 w7 YBB\showInfo();
& S3 v, J+ M, u//完全限定:可以访问其它所有的空间的成员
, O. j/ O" } y4 J, X0 ^; d\CC\showInfo();: Q- P3 a; O, C# m4 x$ c) C4 @
↑根空间标识符; L" M9 M5 D9 G3 S% |
----------------------------------------------------------------------------
6 T0 s" v# Z! ?& q6 V9 s但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
9 k2 n$ p% X1 u. \! P! i: N
- V6 r) F t- X/ y. \ O当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 [9 U* P7 W2 U. h Y' j
& a8 J( s' \( x8 d
代码示例如下:
) P# Z* [/ U& B0 V7 f+ G
2 L# q; ^3 X, F----------------------------------------------------------------------------
; z2 e2 ^! S/ D( V5 `0 l, d! S+ S5 r5 O3 V2 o5 I
. Q3 L: C$ I% \* l6 U$ N04inc.php
3 I3 F6 b& v, D6 H<php/ V) i. ~/ K* c, l6 D8 f
+ f1 l7 T) V- ?+ Z* ]8 a* D) _! qnamespoc_e Core;
+ I. H: n1 ]' t# ~) l: y. v) Ainclude '05ou.php';
& u' r3 w$ `9 X$ c0 H# D* w, y2 enew \AdminController();
9 ^8 T& @8 h8 B8 d! D' mshowInfo();
$ D( s+ P" _" t! f. `4 U, e
+ _$ g& q6 g/ ^) Q+ [echo P;
_9 ^2 y, R, \5 T& A//根空间中的成员,只要类的访问必须加‘/’% {7 D) F' L6 B5 v3 U
----------------------------------------------------------------------------
# {# E" Y+ f2 o: R1 p" c, Z, H1 T
' x# u7 J1 r+ o; t" ]" N05ou.php
( F0 ]# D; Z& |4 O! f<php
1 o$ U. T1 h3 }9 lconst P=5;& U T: G/ _, G8 J
' y% q* j1 y3 {- l3 F5 @functio_n showinfo(){
, o- f( I- @. [9 R5 s N echo __METHOD__,'<br/>';
3 \ i6 [. ^; { ?, q& u9 z}: q* a/ h; u# k
E. ?. ^/ x/ i4 o Y8 S: w1 H
clas_s AdminController{
+ d; b* @8 N* J7 P9 H* D P3 V public functio_n __construct(){3 y a! c% e8 R1 D
echo __METHOD__,'<br/>';' \3 { q. Q1 Y/ i
}
) `; O4 d- K/ R" I: ]+ X$ E- {2 y}6 x8 H# C0 q$ u
! y. w g' m: e. o0 w
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。 ?5 N4 }# H; _8 [; j; N. @
----------------------------------------------------------------------------
8 _1 x$ r) F# Y9 a9 K7 v04inc.php8 J1 m7 b# s( A& y; M3 T! h, E
<php
. D( }. u% [, k E( F
5 c1 t' L8 I) M. V4 X" Z* Bnamespoc_e Core;& W* }) h9 C0 |% V0 I% i" Z8 \1 X
include '05ou.php';
5 O' D! l2 o5 cfunctio_n showinfo(){
8 m# O5 _ x# J echo __METHOD__,'<br/>';: R; v2 [; ?2 Z: j: G& p
}
3 q/ u- G) Q; Q
, @0 o; c0 m: _* e* A% ^new \Controller\AdminController;( U. D) g) ?8 B" N, q: L- R
----------------------------------------------------------------------------
/ a0 \+ c; O( `% h) x05ou.php
7 s9 H5 n+ a3 P9 C3 i& Z3 U& H<php
9 N8 R( k( ]# P$ V; ]% Anamespoc_e Controller;* t* b$ J5 d0 |8 `) _% T2 ~6 w
$ S0 T2 C" Q% P0 g. f0 uclas_s AdminController{4 R- H% L- o+ w' @
public functio_n __construct(){4 C. E- B3 x Y$ a, N
echo __METHOD__,'<br/>';3 G6 P. k2 G7 J0 w
}
W/ D! o2 _& }}) W3 f* s# ]8 M" r: \. s1 `
----------------------------------------------------------------------------
% e; r8 t- M% G" h' D* o
& v2 v8 I3 V& F, o( x4.引入空间成员:8 E+ z; q! N8 T1 w
& u+ i$ o9 x5 S' b
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% B; ~7 l( l1 g0 \
% K6 \$ n0 d: L& J' H1 Q6 E----------------------------------------------------------------------------+ @' K6 y& ` B5 Q9 Z
6 D4 \( f! ?5 C2 z0 W; {5 `- ]% g04inc.php0 Y# _" L/ v, [$ P% O- O
<php
2 W& I6 s$ f; p3 `namespoc_e Core;7 Y7 {2 v4 F+ n# P0 }
use Admin\Controller as con;/ d9 I& K' t$ K5 J
" V, i2 t/ G" n% r }: O
include '05ou.php';1 Q$ p% O7 f: X4 e
0 {& [( T1 S+ d9 e/ I# ~
new con\AdminController();
4 h) q- j: }) Z \- u----------------------------------------------------------------------------
$ a( o7 W) R) I; ]- }05ou.php0 g# K& E) R$ S$ q( J
<php4 A/ W0 j5 o) y& ]. p( x0 }- y' X4 d
namespoc_e Admin\Controller;9 w9 Z, p( \; m
! l* h& p2 U6 o2 m4 T) H# j; H
clas_s AdminController{
5 A9 L' A2 x h5 C7 p public functio_n __construct(){) x5 u7 z2 _. V, {5 M
echo __METHOD__,'<br/>';
: a' Y+ [( P# ~ }
' ^; m7 ?6 ?% y% |}0 D: N+ x. z6 a1 D* l0 V% C
----------------------------------------------------------------------------
0 O% Z# O8 @; t0 g9 j, c/ b. J7 P1 N0 m2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。- p& x6 \* {9 v2 B
3 O' I* ?" P* B----------------------------------------------------------------------------
1 H4 C4 a5 n9 e& N: T& H8 }( m
1 J, w! \4 V; U7 M04inc.php/ R' l1 c- k/ @
<php3 r# m _6 a1 S! G: S
//引入空间成员类; l* c3 c4 J& y& Q1 o. _
& Y' R4 d& U1 l! K# Fnamespoc_e Core;
* ~ Y0 z0 S( ?7 Tuse Admin\Controller\AdminController;
. g% U, ]1 C1 k% l6 [include '05ou.php';7 c2 S( ^+ H5 B) s* F
9 D4 w8 j: S Y9 O) |- G
new AdminController();' L5 c# a9 {3 c/ t' m. X3 Z. I7 y' J8 K7 A& G
----------------------------------------------------------------------------! i2 b3 X! i( m9 p! T
05ou.php; f( ~* k. S# N3 q; V5 D( `
<php
( x; u( @0 k& [7 S7 \namespoc_e Admin\Controller;9 w, k3 }, |3 `
: D5 u) q) ]1 c$ d& C# d" Oclas_s AdminController{# y- _6 A, A3 j8 D5 N. i
public functio_n __construct(){! X$ _4 _) s3 ?7 M0 a8 R
echo __METHOD__,'<br/>';+ k; S5 v* r/ F0 T) w) x
}
) l% S* \" w: I' B# J}
0 }3 Q& ]8 R, M& W----------------------------------------------------------------------------- z S- V; B% y/ G$ K
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
, m, e1 _( P4 m, A+ K4 ^0 V' L- A3 A' A
# ?! F6 ^: f$ u4 J+ _$ d这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ J2 B, r$ z, j2 }
# S# u+ ?( W$ T9 Y, L' y. l! L, z# Q6 l8 J. A" Y& d
, c2 x5 @$ N) I; \8 j* q
( C B: C' X+ N" U+ Y
- T6 R& @) u/ n5 Y" c# t; ?3 ^0 N0 A/ X: Y/ V
|
|