管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
4 }- _- B$ \4 l0 R
. X+ W; a2 Z3 |在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
Y5 N& g% Y1 B: H R( Z
# B( M2 Y A) K
% d# S( J) V/ I# b8 U4 u! }: Y
5 E( |/ p2 S! s7 ~6 K; ^ r我们来详细的讲解一下PHP中的命名空间:+ @* M2 Q9 \ R' p- m( o- i
0 _/ a0 `0 X" o6 H# y0 ?
语法:namespac_e 空间名\空间名;
2 p: R+ ~+ z8 Y0 J2 Q: m# Z: [7 ~0 P. B8 x* ~" ]
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
# ~1 q' y9 _0 y( S
6 L, a# f& _5 \$ S9 J5 i----------------------------------------------------------------------------
8 P% A% u3 e# P' I, W: _- c
) p1 @3 a( e& n6 Y<php
. z2 m: J0 e' [$ H' m- w* u4 |0 ?6 ?4 O3 U1 F6 F" W2 q" T
namespoc_e AA;2 X4 B# ]" p7 G
functio_n showInfo(){
$ a0 `5 j, b/ i echo __METHOD__,'<br/>';/ H. w! A: R2 B
}
* `! o0 {' l6 I+ Lshowinfo();
V1 T/ L9 V9 H' f$ Z6 U# L3 O5 g# D4 k7 x4 x( k
namespoc_e AA\BB;+ p. r1 H! @% T# m" v, R. g
& o! o2 N0 p! r/ p* B+ ]7 K+ N# \functio_n showInfo(){6 l/ F0 O8 u. B( @0 _
echo __METHOD__,'<br/>';1 S- I3 _ g1 s
}4 m: k# R2 w- D- ]6 {- g7 `
//showInfo();; a$ a' @8 D& [
----------------------------------------------------------------------------
- j d8 L/ r7 f* n0 n" O4 a1 g2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
) _' H4 V5 u3 z% U3 N
3 d- b, d* t3 `7 D3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。9 r- z7 J/ [. D' v
% ?. ^9 N: E4 _6 U8 J G/ l) _. m
----------------------------------------------------------------------------
e1 Y3 c) y7 V" W; f% w
' E. X& P3 `3 _/ S* L4 ]<php
0 q3 Q, F! G* Z: a/ v7 Unamespoc_e AA\BB;' z& {- o" `! i
functio_n showInfo(){
; L9 t0 B4 C9 H/ I0 W echo __METHOD__,'<br/>';
) N9 q+ ]* f" k( [}% a, K5 w$ R& X+ T h
namespoc_e CC;) I7 ~" i* ]0 r U" \8 o1 O/ I
functio_n showInfo(){( {: ^. _! D; t7 v' E6 h* W3 z
echo __METHOD__,'<br/>';
/ [0 d0 k$ _5 a1 T& P}
6 h0 x' i0 t% h1 V& G d' Ynamespoc_e AA;
; q+ h A: p$ W$ P: Cfunctio_n showInfo(){) c1 @% ^& c b) K( K& A
echo __METHOD__,'<br/>';# `) q$ T' T5 G- q1 L3 k5 b
}
5 h) W! ?6 t$ U l- H//非限定访问:用于访问当前空间中的成员2 p2 m: R& p% q5 n
showInfo();" `! A% R* F4 p/ W2 B' d
//限定访问:只能访问当前所在的空间的子空间中的成员4 `# U& x0 m. x, A) O; p* D
BB\showInfo();5 {" I, M- K- d: c4 q& j$ c6 ]
//完全限定:可以访问其它所有的空间的成员9 {% \! ~* E! [4 N5 d
\CC\showInfo();0 ]0 B9 I: E# H1 X( N2 V
↑根空间标识符* K- L3 d. ?9 f! Q( h. h% c
----------------------------------------------------------------------------
# A3 G# f; N% _" S8 } G但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:. c* ?" I" q7 n, g* z* r" n9 O5 c
# |5 J9 G9 K6 H4 @6 Y; u" x
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' Y2 \: ]5 X: t
7 G! O9 u% B4 F6 A/ g( {7 A3 L$ _
代码示例如下:
8 E& W, @8 U G/ |
9 M% L% @" V1 F4 r+ k----------------------------------------------------------------------------
" n& a) U# _& M7 h2 [
* ]# s8 X, q. r/ s
% E- J+ w3 W8 F: b1 Y04inc.php
, A8 B8 R% ^# a; d5 X7 ?<php
0 \: S1 Z, k# K ?3 S
0 a$ z$ L4 a7 U. Knamespoc_e Core;
4 b/ w" p* |( c- a3 ?include '05ou.php';* d+ D5 s! }( z* C! ^% i& y5 S
new \AdminController();: B- \0 _) j/ [# j7 V1 m5 L- k6 S
showInfo();
]2 S, {8 S$ O! ?' d2 ? G6 W. ~, h0 p& i3 h" J
echo P;( e5 Q% P3 g. L( e, o
//根空间中的成员,只要类的访问必须加‘/’/ {7 _6 j1 j) s+ e+ n! P, P# o2 u
----------------------------------------------------------------------------
. g' V/ d: y4 x) R; _1 d* {' y5 J5 N4 q. ^ p2 d7 @0 ?
05ou.php% k) V: m" G2 @6 S) `
<php5 M8 O- k3 B* H; I" I: n) _
const P=5;3 o1 V" I+ l' D* I) b
) F' I/ |' ~& q- U# X6 W0 Zfunctio_n showinfo(){+ ~ c* Y$ I3 \# `
echo __METHOD__,'<br/>';, D) Q. E$ J% C* |8 ^5 N* j1 J
}
/ M J2 t1 W- k' O" S0 U) R+ A( O7 Q5 b# {
clas_s AdminController{7 ]- U$ e. v8 a
public functio_n __construct(){/ n0 T1 y: X; D! ]+ V4 Q4 z3 B- M+ t
echo __METHOD__,'<br/>';
% D( S' H3 Q0 k9 D) u6 ?$ D' S7 _ }8 b7 L5 K3 c6 \, G u
}
6 N9 a/ P, n4 O5 ~; V& C+ m# m; f& q, \: ?$ f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: Q a: m' u: `7 |
----------------------------------------------------------------------------! q2 K2 S6 b `9 O" M9 t) Z O1 n
04inc.php8 r5 c+ k/ U+ b
<php
. S% _. Y, M+ ^- E: f2 n
9 k/ w+ h3 C' Z) G2 m' Knamespoc_e Core;
8 V( r. T" D& D' \" finclude '05ou.php';! C& t5 D3 n4 ` n0 {! J( O1 g
functio_n showinfo(){& B, _- d7 @- d! }* R( V: _8 D# r
echo __METHOD__,'<br/>';
3 k! c1 @6 w. p2 ~! e% f}: w' R$ ~/ q7 W5 _7 G3 e$ y8 ~
4 P: k* L/ @ Z* m) v4 J6 H; Ynew \Controller\AdminController;; d3 r" b; E1 ?- h) |' R
----------------------------------------------------------------------------' K& ^0 J" z! F
05ou.php E' P! k: ~* X ?$ }
<php5 M# h# j! d( g6 o
namespoc_e Controller; c6 v2 K9 P, q' O
z: U3 H1 m- ]
clas_s AdminController{
3 C G( s! `6 H$ z: c& c public functio_n __construct(){! Q, ^ z' b- o' g* ?
echo __METHOD__,'<br/>';) L# e Y& `2 A) N5 K u& T
}% r. t; @- [+ b9 Q9 X9 }' i
}* }5 J8 }2 C& W, Q& W+ Z1 b
----------------------------------------------------------------------------4 k+ ?3 G; i- Y0 x" _$ a: d W5 X. C
+ N+ n x/ K w0 @' ?4.引入空间成员: v8 ~9 n0 Z% v9 O0 C5 a3 c$ o9 g
7 O6 Q3 b6 N4 s W0 Y4 }0 P9 B1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。- F' }/ a7 J1 A# |* _* p
' }1 _6 ^# w0 }- v( Z& g" g1 @+ ^
----------------------------------------------------------------------------% M2 ~9 D- R9 M+ K: H" t" U. s
$ s1 R$ m, U5 A ?9 f: W; k; m, e
04inc.php8 s- s2 C% P& y) L7 [; l
<php
' s1 L ]' X! p: x U8 ]2 L& mnamespoc_e Core;
2 x: U H. D \4 I5 \4 p( R1 ouse Admin\Controller as con;) Z' H6 u8 h& t% [- U# z; z
# t5 N, I& k* ` P5 r, a
include '05ou.php';
, m; O5 b1 [- B6 P4 E6 f! Y
; {% C) A9 k( rnew con\AdminController();# M8 q' [; G) _& y/ Y6 C' N9 V3 Q- M6 Y
----------------------------------------------------------------------------$ P- e/ L2 e4 a# H. p" K
05ou.php
* K, s# I% Q" [* k2 `9 K% U<php a& D! c% ?* G4 s2 h4 l3 K
namespoc_e Admin\Controller;9 Y% Y5 q4 E- P2 _8 E# c- R& I% D: O
% d3 {) [) f# G( _( Dclas_s AdminController{, O6 G1 l0 y, t
public functio_n __construct(){
" I" T/ i$ a4 L' _/ r1 ~ echo __METHOD__,'<br/>';
$ p S3 W; }% h# U' I }: X* J r; z) V: k2 R) S9 S& a
}
9 d. _; l# k) @8 i----------------------------------------------------------------------------- a) H* [; L; u, E' W. `1 O1 w
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 f |- B+ s: H2 f1 n, s+ S5 f# m; t" r
----------------------------------------------------------------------------( t% u7 E8 F" q5 t# V
3 {2 `6 ^: U( | x, I
04inc.php+ F+ C/ ~2 B# ]. \8 g9 d
<php
# n1 o4 O! R; n% T9 p//引入空间成员类
1 q4 `% K3 W, ?' v ]$ `" s4 i9 D) i- Y9 S- h- H( _% S
namespoc_e Core;+ O @$ n2 ]' Q% \# a3 J
use Admin\Controller\AdminController;
9 ?! c7 Y, H& ainclude '05ou.php';* T1 G) [5 S+ B6 @0 ] u
4 y A+ Z8 v# K) E
new AdminController();. g5 E8 T5 p+ K3 a/ e9 i
----------------------------------------------------------------------------
3 ?3 Z9 N) Q. J; S! K05ou.php$ m8 Q! a0 j( `7 w# Z
<php, o0 |6 r: s1 h( I1 T7 C
namespoc_e Admin\Controller;. k8 \7 u) m; R1 h" |* [
2 Z8 P: ?) ~4 |6 r+ E* F& \8 J
clas_s AdminController{! V! H5 H" s# q
public functio_n __construct(){8 a# K) U' J i/ h2 @9 ]$ P' b: e
echo __METHOD__,'<br/>';
" H6 p, y: U" F) ^ V/ Z1 u }
& m- [4 Z/ B" H1 u5 n}
7 M' W# e5 [3 R6 t- j; r+ d8 I----------------------------------------------------------------------------4 b$ M" J8 j4 ^! i& ]3 e- W# P0 C
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 V; k6 j6 _$ O) ^9 e$ M
+ Y3 O9 X% q* z, |7 s* s+ r
( s ~0 t; _8 _' Z) J/ c这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" c1 b" Z8 x* ]* g2 w, k
+ e8 y6 S$ J: _* Y8 N) Y$ Q, M, B; c# |& i U2 O
! G+ ?4 E, ^3 z+ t9 R- T: C1 E
3 L; {6 V8 Z! s6 N* }0 j
# _- f. X1 M* Z) q6 q$ I
3 I+ e1 p1 J1 f |
|