管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:( i9 _7 }' j* {, K W, C
; V/ U6 _, b* F9 f, _, x在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
6 O/ `1 t3 _# C, v
# o @, i( D' M$ [
9 R! G1 U4 l/ c' X$ F- s
2 O+ ^% W( {: m& q# S4 V0 N f5 y我们来详细的讲解一下PHP中的命名空间:! m" M4 e5 J! m& ]/ g; n& j$ k
1 y7 m3 }& S( w. ~% T
语法:namespac_e 空间名\空间名;
. P; O$ ?% N" P- F7 g2 n1 X; W6 M
! m$ i: B; q1 F* q3 I" ~说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
5 Y/ x. _. |* y9 [; Z2 r. v$ \" [4 D' U! O4 |' [
----------------------------------------------------------------------------
+ p9 y6 B6 a4 p, G9 A) d6 {+ U& s- o W- z t/ c
<php
- V8 S0 Y- }8 b* i# C
/ D; w! Q7 o, [namespoc_e AA;
; F& [, s6 t/ S8 @* X( X# N# ^+ y6 `& lfunctio_n showInfo(){! W- Q' e5 p2 ^5 b) I
echo __METHOD__,'<br/>';
- X6 z/ m4 c1 x: v. w m$ C; A}
1 P$ p8 [3 r6 J3 N) l1 ~showinfo();
) v Y) U- ?" F3 f5 G$ W* I( F1 b+ F* m, y! Z+ P0 L A- Q
namespoc_e AA\BB;' S5 ^0 k3 E( m' m, ~
: d; R7 a- ^" q) e3 e9 p" U
functio_n showInfo(){/ V w7 f7 K+ `
echo __METHOD__,'<br/>';" e4 s0 O4 V3 S% m( @
}, C; m# B1 E+ Y8 }! v2 N N, |
//showInfo();
# I* Z$ t' j# U( j---------------------------------------------------------------------------- Q5 D0 N2 _) l
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( }/ G! Y5 z6 r2 A1 C6 L, y1 Y, v( {" z8 r8 g! Q. u0 P
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
0 Z5 e$ a4 m4 k, y* t( D
" D2 p' s5 ` f+ \% l5 V+ \; ^----------------------------------------------------------------------------
0 O M+ Z. F F6 Z/ H$ Y, t9 T. X& u. G
<php
; b2 z. g3 \* i( z4 ~namespoc_e AA\BB;
# ], q$ g8 V. `functio_n showInfo(){
6 @7 x1 A0 P8 @: Q& T$ O8 S+ [ echo __METHOD__,'<br/>';
3 p/ [, Q& S' r5 D$ ?: e}/ ~/ h' o! s- a& F( k% C* h
namespoc_e CC;
I; A1 d1 x+ ~5 |8 i" @functio_n showInfo(){) f3 | h! `) u6 c0 ?: q5 C
echo __METHOD__,'<br/>';: A: I( H$ Y% E# M! [/ a
}
) e6 ~# z+ C" b0 u& jnamespoc_e AA;
/ K* z+ z% V& Bfunctio_n showInfo(){( c( j0 f3 ` w: C4 r8 Y
echo __METHOD__,'<br/>';# `% X# ~/ v; l: j* r; ^
}* |! u1 I' P6 _) p) w! h
//非限定访问:用于访问当前空间中的成员; W" O! e5 g1 u8 t
showInfo();
2 V2 b# O, s. Q% S//限定访问:只能访问当前所在的空间的子空间中的成员6 b# U9 ~ m) n0 I% q# n$ s W
BB\showInfo(); v7 y3 e& Q6 C
//完全限定:可以访问其它所有的空间的成员# Z( X* C+ h. M- N6 g* H8 R
\CC\showInfo();0 {1 m+ U% e% B( \2 a9 w
↑根空间标识符
1 l% R" e3 V6 ?----------------------------------------------------------------------------
* E; k! L. ?2 N- d# S" t; N但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
' T1 U; a5 M1 C
0 Z6 Z6 M g# C4 \, s当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, E! Q* a) j s$ |' I2 W4 ^' G
* T% s3 b9 w- r! H |) ^代码示例如下:
/ z/ K* M# M# }
: ~0 a( b6 X: ^' [2 e7 d$ ?----------------------------------------------------------------------------
$ ~' Q4 u3 e0 R" K2 M$ I" z- ^+ B! R+ A7 h. ] ]& r3 [
% Z: e1 |9 v k/ p1 A2 f8 ]04inc.php# l" ^8 X' B3 \3 i% M% _
<php% y0 U# u/ _% P, V
- E% y, f" w7 S- unamespoc_e Core;' M; Q4 O8 X0 U Q
include '05ou.php';
s' s6 Z% p) f( W! H9 ?new \AdminController();
8 _& `1 f- ?8 u+ D6 ~7 O+ k UshowInfo();
" j! z7 ^0 U0 X; m. L3 f- @9 {3 a/ X/ V: \ s- X
echo P;
7 D% N, G+ r- @$ A" C# _7 O//根空间中的成员,只要类的访问必须加‘/’& S4 d2 V( e, K x: X, N' m
----------------------------------------------------------------------------
6 z$ L7 x* f! C. ?1 n r7 C8 a% c4 e
05ou.php* d O5 q5 o, V% G' {0 t
<php
3 i6 d, U2 r! y7 K! c; qconst P=5;
9 {4 t9 l8 z7 V/ @9 [' _- E
. Z9 s; ^3 @' o$ k! N7 ifunctio_n showinfo(){
) r3 a- X* _' ]" T$ A; W- N$ A+ h echo __METHOD__,'<br/>';
! L2 f: o" T1 V# Y}0 a$ l' P, [8 D' K% {( d4 z
1 ]0 p i2 X( Q& B! d+ E
clas_s AdminController{
" G* b( T7 x$ W5 [ F, Z+ z6 D' I public functio_n __construct(){% _- v" n) _4 O1 {# g
echo __METHOD__,'<br/>';$ d* x& {: d5 z
}* p4 D' @* Y( m( r& b
}
5 @, ?! U K$ ~' F' L8 ^: U/ ?7 \# ]! W; R. {% Q" i
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。6 j d1 c) y* ]. j& A; D+ k6 B/ W
----------------------------------------------------------------------------: Y& M3 ~4 p d, ]' ^( ]
04inc.php
& F: K3 n9 D/ G3 @# a<php; L; R) ~" U# f' G0 ^: H& @
* i/ ]+ c3 ]% d0 t( x) d, U+ m
namespoc_e Core; i' V& f, L/ [
include '05ou.php';
) V3 R" p F& k. Nfunctio_n showinfo(){3 }+ F/ r/ `+ k# H
echo __METHOD__,'<br/>';: ?1 `' z8 @+ O4 W
}! E: y: N5 s! t4 ~% ]" j0 V
, P! r& q6 A& Z8 Y
new \Controller\AdminController;
# @7 @. t+ o8 j----------------------------------------------------------------------------5 \) m- p3 `, ^8 C
05ou.php
$ o( t; o1 F8 t) _& F<php
" M6 C6 N9 P! g' j: V) cnamespoc_e Controller;5 L* d, q G9 j- x0 \6 j
" s' C9 ?0 E/ ^" iclas_s AdminController{" {. U) x5 P C* J4 z- A& r
public functio_n __construct(){
$ H. s. h" I A( ]. Y2 L echo __METHOD__,'<br/>';
& r6 l$ t1 x" `& K }7 |* q/ ]5 e2 T
}% r ^# k2 c( d8 l9 g* Q( A
----------------------------------------------------------------------------2 a" K# K3 i+ r5 D/ l6 S, u2 H8 T
/ M, f Y$ P9 F& J: y6 n8 c/ \4.引入空间成员:* Y! V9 c. n% j5 [ @
9 Q! g$ ]$ R5 i
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
9 r3 d4 @1 j5 {, R# a! q' ]3 a2 F* u/ \1 S4 {" [5 e
----------------------------------------------------------------------------0 i1 R$ B0 ~$ R& I( D, B
4 t* a8 i* {4 S- f
04inc.php5 @* u u- m: M* `" F
<php! F8 _- W2 K+ b7 H5 p. s8 p
namespoc_e Core;
" i) U q& U, z; s' ?use Admin\Controller as con;
, O: B* a. e \; {1 h) e4 x. w0 [/ L; ?7 O4 [* [: e- p4 e9 r
include '05ou.php';! R* ?% O p, O5 i( W' f
- A2 r p; B& t L3 \
new con\AdminController();2 p1 b$ U, E; U. \- K M7 @
---------------------------------------------------------------------------- ?1 h9 z$ _. W `
05ou.php
$ B6 @" g3 K0 U+ ~8 F7 Z1 S' }, U<php0 d& n& h: H3 `9 W' E
namespoc_e Admin\Controller;
* @: o4 r J8 a7 S. k5 K: K# ]# T% F/ `0 T4 K# ^& _
clas_s AdminController{
" \% y: {; [% e5 O public functio_n __construct(){
$ R: _; I% g; e/ J- G echo __METHOD__,'<br/>';
^, D7 k( A. x* h# j4 [ }+ W/ ]+ R1 i( B1 S: Z2 ^) i( _
}
# U4 N* j# {- F' i; {, W' u----------------------------------------------------------------------------) N* g6 L. f& J7 V B
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 b/ V0 }/ \8 h7 f
& M) _: e0 v) ^- Z: W) }7 L
----------------------------------------------------------------------------4 j u) \5 H% I7 p! R
9 H7 a. E, m# e+ R/ F; ]# y' s
04inc.php
7 I- b# W) a" c<php; _! M V1 N5 U0 F; K, l
//引入空间成员类: c, c6 e, Y4 L
/ a& y# Y! |0 y% L. k* b$ a
namespoc_e Core;
/ O' u2 I0 \, r Y8 ]: guse Admin\Controller\AdminController;
/ c1 ^9 }% `9 E$ Winclude '05ou.php';! u, O3 N" t3 m' e3 a
- n6 T O) i8 W" k9 e( J2 Nnew AdminController();
0 U) Z$ b. A) G9 K k----------------------------------------------------------------------------
; |6 q7 x2 S, A/ t05ou.php4 t2 e* }3 g" e9 [ i. F
<php
! R9 \7 [) `3 O! H% Ynamespoc_e Admin\Controller;
+ l7 Z8 b7 {1 H' n( k& {1 F$ R! @2 C: ]& u$ R
clas_s AdminController{. _! g* I- w! v. t. L
public functio_n __construct(){
6 }+ |+ d$ f8 v0 u: V( ]; V echo __METHOD__,'<br/>';
. E N1 r# c3 P& N1 g G- O" j }
3 D# U" w- ]0 z) ^ I5 p9 c}: N5 J; i: @8 Q$ x
----------------------------------------------------------------------------
q0 q3 G) Z- S* m5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: k6 Y. K5 D* U, T/ d1 t
' ^" P! T g/ _: v- t$ @2 Z( l! a- s. t
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
) @% _/ l- `( k6 m5 T/ s3 ~4 }# _! ]9 r0 U: C
/ W, L+ x' A0 Z) X# ?! C7 C) r, y2 @ a# J! } R# U8 W& i9 P
9 E7 c/ @0 h, }3 p Q- A4 @" d" N! S/ }9 R; @+ V: v
" a7 ~5 h. T' P' B U |
|