管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:& F: u7 V- l9 |" O) `2 [0 v
) G5 N0 b0 o6 e! S1 F) n K在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
* Y2 a4 T5 X- i$ n3 G9 Y8 ?/ U1 Z: P( t+ r4 r2 D# S
. L2 \: F: D" a5 R) @: A( ? h+ U+ t9 Z( [
我们来详细的讲解一下PHP中的命名空间:9 y, R4 j6 _! J2 P2 ^, a1 R* K
5 M. ]+ n, J9 t' k% ]2 {! C语法:namespac_e 空间名\空间名;- x; F) M' M" I1 \# x0 ^
5 b0 c# \9 ]: Z8 o J5 W说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:, |4 ^& |8 R/ G2 N* A3 {( L( j
$ W+ @9 o# ] `2 }: ^4 |- C----------------------------------------------------------------------------2 J1 ]/ A& N0 h( ^7 d
4 ^5 [+ V4 C1 C$ i$ A<php7 ~: S* F! P" ^* V" j
! y/ U7 @2 s: e4 a) t/ }5 c0 L
namespoc_e AA;
1 m! x8 I9 }6 a! Wfunctio_n showInfo(){/ ]* ~' n! G g
echo __METHOD__,'<br/>';; d! b7 H, `! ^; f* _2 |
}: ^' H: c0 J P3 J
showinfo();2 M/ @! d7 K4 d# X3 q
) y: Z% S) \( o! x9 D, r anamespoc_e AA\BB;
1 U; o8 b0 c% b$ o
9 A( P3 v# b. C' Q+ Y% N/ `! Y" B; \functio_n showInfo(){
' i" F$ N" v8 g/ u, c, c5 C echo __METHOD__,'<br/>';
! }0 l f8 Q; Y}" b1 C9 }. J0 i. i! _4 w) O( L
//showInfo();
& z, F. O% B7 d7 r. R( m----------------------------------------------------------------------------2 k- I1 n6 F- m ]3 V
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)9 O6 o" x/ {& g3 W4 B& o2 E
: c, v# R% A7 G$ \2 L/ p0 ]- n) Q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& f5 t5 w8 ]+ [+ j9 C- |: |% g2 Q3 Q( |9 A$ V5 y3 t/ }
----------------------------------------------------------------------------
& I& E l# w" r A! b' g
" c* |6 f; g1 T$ n& Z. [$ t<php' S$ g5 L$ G- K# x: a$ Q& ~
namespoc_e AA\BB;
: E U- m& g/ L/ H4 {4 i" Pfunctio_n showInfo(){
1 q: P" i! n6 h$ j& M: U echo __METHOD__,'<br/>';
' _, i# x l4 u, [2 m2 R; L& Q8 f}
' S1 V* ~$ q9 \ @- G; g; fnamespoc_e CC;1 k& o; w3 s* _) ^- ]8 r& }; b
functio_n showInfo(){
' i7 d3 \( v" n( C( }- ] echo __METHOD__,'<br/>';
; w" k7 ^- I2 X- p5 D* b* }! i}
3 L9 N: ?+ L+ C, _namespoc_e AA;3 J$ [2 k% a0 S/ Y" ~* l) m
functio_n showInfo(){% [& W# h; X3 P! @+ y
echo __METHOD__,'<br/>';
4 p1 W) v; T! B/ P5 B}
4 G7 V" Y/ B9 S- n$ H! g//非限定访问:用于访问当前空间中的成员
8 e M O0 K2 s0 s4 z4 ?showInfo();+ W! s) n) U# A- ~
//限定访问:只能访问当前所在的空间的子空间中的成员
. W# b( J, o" \2 ]( uBB\showInfo();% Y0 X) z7 { y: M& z8 l# i, ~
//完全限定:可以访问其它所有的空间的成员
$ }' p5 b0 u) Y6 R; s/ `\CC\showInfo();
( a: R% X# G4 s/ I. T: d↑根空间标识符% Z: c; h' O; v; s& @0 w1 A( w; v
----------------------------------------------------------------------------
7 x" r2 X/ j" C, y7 }% M6 _但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
4 `1 E. Q+ F7 ?* W& ~3 ~/ D4 r( a0 n7 P2 M1 ^. r
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 y5 n$ X; J. y
" ]2 W* X! g+ u0 T* n
代码示例如下:* h2 G4 ], N5 p* w
9 v" J' ?' a; F6 G
----------------------------------------------------------------------------4 W+ t0 h$ _: y6 U$ B
, R. p b0 b( j L& J. C7 `9 j; T9 F) r1 v
04inc.php
1 z. O0 ~3 B# x" B( M<php
2 L8 o+ {6 x% k$ Q# q' @. @ _" a) v* V# Q w( P
namespoc_e Core;
6 \% c6 ?& G6 k3 t5 Rinclude '05ou.php';
: H+ |7 ` X7 U- R1 ~" b$ `new \AdminController();
9 O7 f4 t. R, C* a) }showInfo();
/ ]$ a% i$ K, t$ H( t
2 Y3 P+ M% ]* o+ ?5 F# g: Hecho P;
. C( {6 x! n$ ~+ l//根空间中的成员,只要类的访问必须加‘/’
0 M% f4 }" _. Y0 c8 Z" O9 O$ o4 j----------------------------------------------------------------------------3 U0 g | r( H- ]
2 D2 [) i5 I* m- |- q; ]05ou.php
2 a4 o+ O; H9 j7 `& T9 G- Z<php
# ^0 Y- b# L5 t$ c8 |const P=5;
+ {. ?* N, U1 U4 ?. [$ ~
# r! e+ d* ^6 @* R" [7 }9 Zfunctio_n showinfo(){
0 g2 ]( h$ z1 `( _. v3 n* G/ Q echo __METHOD__,'<br/>';% @& T ?) ^" u! v+ }
}
8 a' G4 e1 ]; ~. w6 S* O5 D4 ~
( H. F' |- @& Rclas_s AdminController{# @/ u+ X2 O1 K( [( e! V7 \
public functio_n __construct(){7 J3 C/ P) U# A& Q s) k8 V& G8 @
echo __METHOD__,'<br/>';) K( ?; d& i. n, P$ k9 I0 P
}, S1 \7 h9 ?7 u* F: u5 B
}
* Q; b; m f7 @ ^, h2 I5 R2 l# Q7 x% f8 G" K4 j' U
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ l( f* {4 _* S; U
----------------------------------------------------------------------------) U! `1 f; ]/ |
04inc.php2 w" R9 ` g: M4 E5 Z
<php
* E+ o, q g/ v! ]1 o2 J' h. {+ E5 q8 x" f2 \6 ?5 g4 p
namespoc_e Core;- g; Q2 F/ e5 S' R! G( t
include '05ou.php';' D& e' Z; P$ `" v4 T
functio_n showinfo(){
+ D9 |9 r; n# I# z7 z0 P N echo __METHOD__,'<br/>';" p l( C$ a+ ^
}
1 ? I! s+ N- q) e) f) c$ K0 n8 q+ _! h: A# x& f2 E; r" k L5 P
new \Controller\AdminController;$ L0 O# ^% p9 B
----------------------------------------------------------------------------
5 z2 P9 f) d( k2 d! i8 D4 C& Q" k05ou.php( v5 e0 S/ a3 E
<php1 ?3 \7 @$ M# i7 c' c* H8 j. \
namespoc_e Controller;6 ^, T$ n; o) C3 s5 X) q
4 w, X& T% ^( {
clas_s AdminController{
0 d. R, U: s. C! j& \ public functio_n __construct(){% p. V5 H* _( z8 q; y
echo __METHOD__,'<br/>';
/ J7 b/ c$ A3 q5 v1 F: ^& B }- ^- m1 H7 z6 I* K# S# t7 N# O
}
) p5 b0 j* w6 d; T+ w3 C8 v----------------------------------------------------------------------------3 i- H3 r! Y: r; |8 D
/ f2 _; t+ k0 I0 a0 q! j8 H4.引入空间成员:
3 ?3 B; `7 N, m0 I8 ]3 b
0 |8 g9 q* E! a. N1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
8 I+ p5 A) o! a% ?, P g0 ~" K1 m7 p" {6 q/ E# M. W( p2 ?
----------------------------------------------------------------------------
5 q& J& h% B E, Q0 `1 B, G- Z4 z
( {1 k* I, Z5 Z04inc.php- X+ P8 {% Y! e7 {
<php* C- y% v7 A) ?$ D0 j- X& ~0 C
namespoc_e Core;' G: |9 K9 T6 F/ I9 e, e
use Admin\Controller as con;
; T2 c) c3 _( t3 o; \5 y N
3 ?5 T0 _, @2 s# n$ F, U# kinclude '05ou.php';, F+ b* ~7 X( Q2 M, T
8 J: u$ ? \( o9 [& y V7 R. V" H5 D
new con\AdminController();
# {* Q5 O8 u( s! y! ]----------------------------------------------------------------------------7 _( P7 n0 F& m3 Y# S2 B4 z
05ou.php
" a& l- @6 L* G! h, C7 M4 u<php
# V& A }8 X+ v1 G* k2 C. wnamespoc_e Admin\Controller;5 ]' w; M' Q0 X
E8 M. U' U' M7 O- R5 Y
clas_s AdminController{1 T8 s- u5 P' T* K0 G
public functio_n __construct(){2 y' S! I/ g. \$ Q- t% P
echo __METHOD__,'<br/>';
' Y; |/ w# d* T1 Q' z9 K/ B# Y, G }
# o& m' b7 U3 y0 V}
+ C6 F/ h# M+ n% Z! @; l$ M) K----------------------------------------------------------------------------
, o5 ]/ X7 P0 ?, |8 m- ~: F2 ]( H, _2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ H/ h) X) G# r/ K9 K7 Z1 ?; f% c% a. B' d
----------------------------------------------------------------------------' g3 }3 ? A4 O9 T
! C1 I: _/ C3 L" a04inc.php- [6 a( N* w/ G7 c9 Q; l/ D
<php6 s2 s; P$ G" F L- G6 v
//引入空间成员类
# t% ?7 j4 v& {- a0 E& V8 d9 Q5 G9 y' e, }/ O! s. ^, r" A
namespoc_e Core;, ?# [, e0 i1 a- |/ T9 p
use Admin\Controller\AdminController;
+ n9 T& G1 I7 W0 ?! l; Ninclude '05ou.php';; B) R. |$ k+ O* f% [
" |; ?, y4 }8 r7 lnew AdminController();
2 O8 D4 K$ J ~) J----------------------------------------------------------------------------- o" [1 x! v$ h8 r) h* r9 [$ b
05ou.php
! S! r) n# Z7 i. E<php1 r; E9 p! v% Y: x+ N& j! m
namespoc_e Admin\Controller;, p4 s% @9 \& E7 r
% F2 d0 Z* E2 k+ u2 c, jclas_s AdminController{
& z ?) K( M" G7 ^ public functio_n __construct(){' B, \% z% {' h/ Q$ H
echo __METHOD__,'<br/>';+ b& L* V2 m3 L
}. i- h: o: e# i O3 O: u
}
# s" r: ]! F9 ?" _6 B7 f$ o----------------------------------------------------------------------------9 p8 K% O' P3 K
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 ~9 a/ Q2 F. e
& J) U! I. j; H% e; |4 s* J
; e$ s x0 p% _$ q' x这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& g( u: o. P& M1 `' E: v" B* z. W
3 \5 h7 o' `" K5 S4 s9 ]
9 a# T A J& G R8 b; [- o, K3 M9 q& f5 y: H8 G9 s: P3 B
% ]/ L0 k+ W7 b, X% A
4 O0 P2 l, q9 }# [9 C/ Q$ d6 b% C
* D# a- I; U. `( _% k8 } |
|