管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
' o( f2 O) W r: k5 s( j" l/ G) a9 \! I8 p) J# q; G8 M. s
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; O5 i4 B, g+ v& K( X
, S3 V7 x! j3 k& N
* p& ^( {: Q3 e- ^
) @& k7 e" U. U
我们来详细的讲解一下PHP中的命名空间:' `7 m7 o2 k# l3 K' z# C h( x; F9 E
8 Z2 q W S& v. ?语法:namespac_e 空间名\空间名;& v# ]9 E& O, P/ v. P
1 `( d2 e/ ~+ q% R( z* e1 E4 z说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
# g! U2 B. D( K+ g/ C& b0 X% i6 G. C# z6 e }) s
----------------------------------------------------------------------------
# T1 L; @& C. ~; M, j7 e/ `: O6 d
6 m Z9 C2 t3 G<php6 H, x- U% R [7 g" {) V3 U1 A4 h
5 z# u- N( r( s8 I9 m# l
namespoc_e AA;
' g) g% m% x/ X7 R/ Xfunctio_n showInfo(){
: Y/ E6 \: k% x- Q0 K. a5 o echo __METHOD__,'<br/>';
4 j6 F* b/ @9 T# z" y- |}
9 o! e# \( l- F& m( Rshowinfo();1 w! i# C" V( y* c7 s, ~7 I! f f3 |
; Z- P; V/ s6 _" x5 D; B( N1 {8 q
namespoc_e AA\BB;
& ]- y$ n' g: d5 x
! r6 X) A2 ~, [1 p$ c& d/ rfunctio_n showInfo(){
# z: X+ Z, R7 K8 j2 g echo __METHOD__,'<br/>';
+ |2 E9 e; ^! o: g6 w, B+ I9 L}2 F8 r& m4 C0 @* n% n$ M
//showInfo();: l2 l) X/ ?/ L
----------------------------------------------------------------------------" K# X, x% C$ Y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)& c- A3 f, X* k5 t; e3 j) O! H" e
: i# U1 D3 V5 I1 M6 h3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
/ a. Z" B, I1 _- n3 O
6 A0 b, x# o: Q/ Y1 s; [, [----------------------------------------------------------------------------
" C( r1 |' \; Z. s
# K8 j) D2 G1 R8 {1 I' `4 e<php8 `7 |4 J9 q! f! q# z/ T* G* ~! M0 Z
namespoc_e AA\BB;
' U: O0 W, d- o: A& Dfunctio_n showInfo(){' R/ b$ W) P# i: c+ Y7 t
echo __METHOD__,'<br/>';
/ c9 B( M& c4 i$ a8 h}
2 J5 U8 b; o2 x0 ^: w6 jnamespoc_e CC;
$ q, v! b$ X# C4 e Ifunctio_n showInfo(){' B& ~) b7 @: ]
echo __METHOD__,'<br/>';; t5 N; H$ d9 ^7 @
}& H* u( W: h' o D" l4 N
namespoc_e AA;
/ K' J2 q% U! B q! W/ h, U9 w' _functio_n showInfo(){9 G4 h$ m' S9 q. b" C7 }' }
echo __METHOD__,'<br/>';" k7 D: P0 L0 J1 K' R4 a/ a
}! J8 b% F9 R. J
//非限定访问:用于访问当前空间中的成员% q h8 [) r+ j' L
showInfo();
) R$ f! _* [4 q! T) j' \//限定访问:只能访问当前所在的空间的子空间中的成员0 P& \( v" |1 {
BB\showInfo();
( F' P, m8 [3 c) l7 D- B9 q5 f) x//完全限定:可以访问其它所有的空间的成员
9 M1 ^2 ?; A' B+ s\CC\showInfo();1 w/ O9 t u2 R8 g9 U# @$ U# f L6 G9 `
↑根空间标识符
" w& i0 I/ {* P7 r& d----------------------------------------------------------------------------. S+ p* R6 I0 C
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
4 p8 x+ i% |6 [8 {3 K; f. ^4 C) t. z- z+ _
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 V' ]! V! F+ W2 V. ~. `( b( e! P
( O% ?$ \1 O% j% Z" n9 k$ Z0 Q
代码示例如下:2 f( V& k9 g2 m7 d: n( D. j9 G
: M. Q8 N3 ?$ J- E5 U" T! C4 o: H----------------------------------------------------------------------------
) ?* d% w% u( p/ P* Q& R' l/ z
- v0 k& C7 Q' ?2 _9 r. l- z# n
5 {& q8 B5 R( x: G04inc.php
: J; K4 d( N( A: o( H<php
' r7 j5 R- t' I7 \3 T& @+ j- p/ Q2 C
namespoc_e Core;( q1 d3 e' [" W) g- b2 o; }/ Q( c
include '05ou.php';
" y4 c2 b- m" G$ Q+ D% Enew \AdminController();: c( y. i% v9 N; h% U1 ?
showInfo();
+ k% ^8 s4 k$ g; j" K7 _- s ?. g* b* T3 [2 {* Y. G C1 S
echo P;
. I! W( s$ u1 O: }, Q: ?//根空间中的成员,只要类的访问必须加‘/’
) A a( B, d( m* X1 H----------------------------------------------------------------------------% }, `( ]" w2 j9 M
2 D4 T0 X& q! z- }3 v; X# I/ j05ou.php' J# k$ N7 q! T I) H% ~& V' v
<php$ v7 u6 J, b; U t
const P=5;
: z, V/ u/ b# l- q0 N
l, m; c. Q7 Ffunctio_n showinfo(){
& ?# A2 c7 I7 S2 J echo __METHOD__,'<br/>';% P( }, Y3 T' f* h# s1 o
}' _& |$ L2 u" N
8 H7 j& v# g/ M+ F: [" R) }
clas_s AdminController{0 y, F) B+ x: m' w# d
public functio_n __construct(){3 j3 }9 h& |+ j
echo __METHOD__,'<br/>';8 |2 u' L" b ^; M
}
% Z$ E4 m5 s* u4 s}
8 Q/ ^; Y0 j& I/ |% ~& `6 ]. [, z4 f6 @/ _$ ]9 V) E
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
6 N3 V# ^) X7 _8 q/ d5 `# z----------------------------------------------------------------------------
7 j, i/ U7 H5 n* M& b04inc.php' h% e3 k, T$ \: ^7 X, h
<php
7 M2 `6 K; w' G& l) \$ K
% ~1 }1 x3 r. K1 u! ]5 }namespoc_e Core;
$ i$ Q+ I( I2 C8 N4 Linclude '05ou.php';
+ X. V% E& G8 ]4 @0 t; `functio_n showinfo(){6 ?4 U' W) S' o4 ^% t
echo __METHOD__,'<br/>';# [4 b& |- O/ O" @% T/ K
}! [$ T J* W4 u: \' {
+ e& ?0 k$ D' r$ D9 f7 X9 Onew \Controller\AdminController;
) _ R8 L' ~6 l3 q----------------------------------------------------------------------------
" ^. `* Q1 x- a) }. {. \+ q05ou.php
; M' ^# Z; P, n; H8 w4 k<php1 O9 ~; Q1 Y; M9 ^: e
namespoc_e Controller;3 C) [$ N' k3 n4 k- Y( Y
; P, H8 M0 z; rclas_s AdminController{7 }- o# t; E3 [0 l
public functio_n __construct(){2 Z! G. J I# D; O. L# L5 N2 W
echo __METHOD__,'<br/>';/ b4 g% u' @0 T! _
}/ E. S/ f1 j( n* z+ X4 o8 s
} z0 O' l; Q' N* O, D! z% M
----------------------------------------------------------------------------0 @8 U9 S' z8 e+ Q' x. g* `9 e
* o+ t. _, q4 l7 E1 p9 X: D4.引入空间成员:
. Y( a# k. M$ I3 a) Z5 x; B. A' \* H
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
! j1 e2 j# B+ H! T/ i8 J3 x7 l8 W4 h( ]% v. \/ E& r& z
----------------------------------------------------------------------------0 s8 v& o. q" r: d4 f; v2 B4 t
5 p% u! j& B- T04inc.php0 L( l$ q+ v3 V6 ?4 e8 W1 o
<php4 K1 I" U, \# r" Z. m. f
namespoc_e Core;/ a; u( |% ^9 J1 L* }* O+ \
use Admin\Controller as con;0 p, d/ p$ L2 A- F5 y% C/ n# n0 I
7 ?& S ~+ b6 u* dinclude '05ou.php';
: E' l) k4 c$ o* W+ ~. k. o
2 A6 r K M; H4 O# y6 N/ Gnew con\AdminController();+ f; V% L# g; C3 C6 @: {- ^
----------------------------------------------------------------------------4 s" |: r" T7 n& ^' I0 r/ `
05ou.php
& W1 S3 q& M2 ?3 D) [9 x6 G<php1 F# D& a9 q& }3 j
namespoc_e Admin\Controller;
8 O8 _4 i! p; \- I: |3 j7 C8 g
! G! M" g, X/ K4 @( b$ S& Gclas_s AdminController{+ I [3 C' K9 r( F" L5 G
public functio_n __construct(){8 d6 e9 R. ?, c. p% k
echo __METHOD__,'<br/>'; H1 v, I- V9 }$ Q9 y* n
}
* u: }( w4 c2 H9 x7 a3 q0 m2 t3 d' Q}
( B( N. {* B+ ]" o( U6 ~# m7 E: F- X----------------------------------------------------------------------------0 |) {( b% e: w2 Y4 C* k
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
. H$ B4 u9 Q! p1 Z1 h! K$ Z/ \' g" h. M4 k1 k$ d) O
----------------------------------------------------------------------------
* `4 x& w/ i9 ]) C, K; ?: t1 \# Y2 E- V+ n7 l* e
04inc.php
: o+ Y* S" J' {, r+ [<php: v, {- f k2 V
//引入空间成员类
% O q1 X. p2 Z3 h$ Q+ P- K4 G# o5 `8 i& ^
namespoc_e Core;% n4 h g1 E) b/ c
use Admin\Controller\AdminController;
j6 @8 z0 j# l; N* [5 minclude '05ou.php';
# i- \4 p2 C- l2 V, n& _/ ]% y; J9 z, n4 C/ P3 o$ \
new AdminController();
3 O) L$ p+ n. ~5 r----------------------------------------------------------------------------& J/ Q% ~8 x! V+ V# |
05ou.php7 X8 G. A3 h, }
<php Y: V. h" R, i4 } h: X
namespoc_e Admin\Controller;5 E# y, i, g8 H0 s
+ f: N* h1 a) ~: B- Tclas_s AdminController{
2 {$ u. F% }# g public functio_n __construct(){, z( E" e' y; P0 A1 n7 Q m1 h: h
echo __METHOD__,'<br/>';
8 Y5 a) l9 G) A: q |: y }
9 N* L) v& f% F}* j; h6 I& w* j5 r* k
----------------------------------------------------------------------------
8 q7 w" Q; a8 X% N. _5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( x2 ]- z% @% M1 }/ u3 U9 r
) {5 Z: `- _) x* U& x$ A7 X# l+ t. q$ ]& c$ w
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。9 k: W R9 F" d- z9 P3 K t
4 u9 W1 D6 n" J! I7 t" ?9 H: R; S( C9 d9 c
e3 O2 `+ D, Q$ D: [, {6 c; g% X' v# _. s) S1 I6 O7 }7 C6 K) n
- _4 P. h% }' e" o
* J5 v1 E, \3 y |
|