管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
* R, F0 `* l/ ?0 K" } g5 A) E8 Q3 o' N' g. f" w5 b& g
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:9 I! w$ ]2 U4 ]1 }, n* z% H* t7 m/ w
% F1 T" L; }, b( s& _4 ~
" s. A+ d; m& M) F/ H, [. n- Z
2 B! \' x9 I5 d$ [0 R$ p6 _8 I我们来详细的讲解一下PHP中的命名空间:: i3 G: P( C: q6 G+ U
5 I) A" B- m. H" \8 o/ w
语法:namespac_e 空间名\空间名;
}2 J: T& R+ \8 J- @4 ^& k7 l$ b' r# K: W, F$ e
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:6 F4 W4 D+ ~, s3 G% T: A" b& t
* z( \7 E# i' B/ x1 K----------------------------------------------------------------------------
" Q) R& l) m7 R. M4 Q; k2 ?1 R
3 i6 K2 x. ^# x. m0 N9 ^<php2 F' Q) m9 U, I& m8 m( _; Q
`" e, M/ h3 [" R
namespoc_e AA;
* ^. p8 A7 c6 K, _* t2 P9 \/ a5 z& |- gfunctio_n showInfo(){
, w: q4 m5 U- e& F2 U/ P; K# E% q h/ h echo __METHOD__,'<br/>';3 T6 E! j3 m' ^+ E2 }
}0 C& u$ ?/ E/ i. \9 {, y
showinfo();6 P, J) J, h. X( e
: b* @: s, } w9 x- V
namespoc_e AA\BB;
j( n9 x% N9 a+ G
( ^+ a: y+ }( R' _5 yfunctio_n showInfo(){/ E9 l, r* `( I
echo __METHOD__,'<br/>';+ @6 [$ Q* q4 W+ C; e* b& `
}
B# q. E4 l9 l2 S& G t//showInfo();: J' W7 m7 V4 B6 @, L* o- s
----------------------------------------------------------------------------5 m/ j1 Z' _1 _. K" q
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
; S+ p; S& _5 v) V# i
( |4 l" n) ?& E; U# k$ |3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
2 U5 p* D" V& I4 \+ E G, s6 A
4 [ N Z8 h4 i* p1 E' I----------------------------------------------------------------------------
; ^6 B. o, o6 ~* V0 L6 P5 ^/ p
5 ^1 h7 @/ f Z<php
+ G; _+ j) R* nnamespoc_e AA\BB;8 s. N. J( E L! [) T
functio_n showInfo(){5 l. P/ S; S' t0 ]$ x! H
echo __METHOD__,'<br/>';
/ ]2 p0 N" Z" A}
; ^" L) ]9 b2 q, c% K! Y7 _namespoc_e CC;+ p' D1 A. `# s- \) C6 ~
functio_n showInfo(){
8 Y4 @, h0 y3 B0 X. P echo __METHOD__,'<br/>';
$ o- G9 I& h7 l; G2 v v" H}6 v6 h. S% { J' E- a; m, t1 \
namespoc_e AA;
+ S# Z- ]. s, x- U' \( y Kfunctio_n showInfo(){
' z# T0 |9 h, g' Z: |+ [ echo __METHOD__,'<br/>';, M b! K: a: P+ |
}
: E# w- l$ q8 {0 ~//非限定访问:用于访问当前空间中的成员
" _# H/ R& F# k! G( ~- b/ PshowInfo();
0 |4 `, U5 @+ D" m//限定访问:只能访问当前所在的空间的子空间中的成员
; F: o" G0 I; ]BB\showInfo();" M4 L$ m1 Y/ k* E8 a
//完全限定:可以访问其它所有的空间的成员& ~4 u1 L; c( J/ b
\CC\showInfo();
) X' r( i& V7 q↑根空间标识符
; N& |% X: x9 a' P----------------------------------------------------------------------------
! {$ l. F9 D$ T* h3 J+ l; b$ G( Z4 w; w但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:: W( h( Q/ ~( D$ w" ]1 {) j
& C% S4 u# S0 W: A0 S) |( v! v当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
w/ c/ L4 e5 q' J* e" g, |2 g& C+ ~, S: A7 x
代码示例如下:
9 G& C% @" W1 J3 E4 l) |. T8 @6 V
. ?8 J' @; g/ v, t( D: t* ]----------------------------------------------------------------------------+ a6 P; Y; K9 v$ s0 d5 x
' u9 B# C* `% w0 [2 c7 |( b
: U1 H/ E" N! `
04inc.php
' E6 o+ H) B6 O7 F6 O<php
6 X- _7 p' K I& T B( G7 A, P( e' X
namespoc_e Core;
; O, f6 Y. J. V- c3 G% M Rinclude '05ou.php';) L6 a- B4 p8 X6 m) b
new \AdminController();
5 P* j! j7 ?' PshowInfo();
: y/ @, m, z) j2 l" e* m) v/ w6 q
3 s0 L! }: `- Gecho P;8 t B! K1 {. K* r& S ?
//根空间中的成员,只要类的访问必须加‘/’
% g9 k8 m- B5 F6 g. c----------------------------------------------------------------------------
1 `- I* ]: W3 T1 {9 M
9 k7 b5 O$ V: w9 n' x3 S05ou.php" ^# Q1 M- ]- X. s
<php
7 f$ u/ {6 X1 f' T" P# Gconst P=5;
8 I) r8 }0 d: b- w9 D. W3 n# a0 u& e! p# ]' {6 O. P
functio_n showinfo(){* @$ m9 ]2 ~& y3 x4 G4 U: ?9 _
echo __METHOD__,'<br/>';
# ~7 U$ A5 F) y. i. ~0 I/ L. M# p}8 A, J# i. l3 r9 I
9 J" H, S( o T9 U9 ~$ s0 bclas_s AdminController{' f* g2 M& K0 C( q$ ~/ D
public functio_n __construct(){
) Q: G2 c. ^0 ~! V, ]" R8 I! S echo __METHOD__,'<br/>';
$ _/ T% G) a2 G: T+ X2 }0 B5 C$ U }! w6 I7 G6 i5 [8 d/ C
}
7 u/ B) ]. L4 n$ `% D8 H4 H
1 z& H# F1 t9 x( U0 i* U第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。/ y; d; ~5 N1 Z. C
----------------------------------------------------------------------------
) p: [' {+ H; ?1 U5 O1 X- A04inc.php% W- ?; x% E. s: p
<php. `, n) O6 K; k( E1 f2 G3 j
7 k& B' T8 i' k# F' [2 b0 ^namespoc_e Core;
% g& w/ d& q2 Binclude '05ou.php';2 D. a( E! m: G, @; ?. f3 f
functio_n showinfo(){* c: u) Y& l7 G& \7 w- L0 H( G
echo __METHOD__,'<br/>';* a* {" d U1 `$ x* w& G: i
}
}7 A3 T- ?, `+ L G4 a* n' ]1 Y7 s, C0 w# R" [: H% ?
new \Controller\AdminController;
; c: Z) \3 i( Y& {) d! o----------------------------------------------------------------------------2 `3 t: y8 W- z+ e% z/ H* g! X
05ou.php: i z0 \' s" k+ g6 h, L
<php& l% X4 E3 e% k4 F" [
namespoc_e Controller;1 n. I8 r, S _. h) i
; X9 l- ]. x: `0 X0 B+ y
clas_s AdminController{ ^+ i# a2 V0 p6 }) p; ~
public functio_n __construct(){
' x" U+ e, V- t: Z, M, @ echo __METHOD__,'<br/>';* r& y3 G' _$ A1 ~; m9 y2 b
}
6 o/ G$ b! {- r3 p4 `; N& y f}: [8 ]2 |+ E$ e, K8 X
----------------------------------------------------------------------------) h3 ]' a0 a2 S* I% F2 ?' `5 s3 v
) h; k F3 |% E4.引入空间成员:4 o* D9 V0 b' V( W3 Q l* w, X% m
8 ~* o* R# B7 B, E# Z3 ^
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 t, J" s8 F, w0 X- ~' \4 }7 L2 n' J; ~ ?0 u
----------------------------------------------------------------------------* [6 X6 z0 Y. i# D3 L: E
' p8 P* x3 \# N3 y% R04inc.php" c {7 F, {/ s5 i; l
<php8 }$ A" m' { v, C! T' F/ `
namespoc_e Core;5 P/ W6 }; b- a2 c7 T/ e i
use Admin\Controller as con;% ~! y) C) l- Y
( U1 \, | Z+ a* A$ `8 qinclude '05ou.php';
% c: n8 _2 x6 u, X7 c! y$ }. h+ X
! r( r4 E# b; N ^' n9 {6 anew con\AdminController();; {' s# g5 y9 j
----------------------------------------------------------------------------
9 m: y9 a, _+ f% Y6 n9 H) ^ I% y! N05ou.php
. M" f/ ~& R5 I# r0 c# o<php
r) |( Y' d; r6 J1 v0 Hnamespoc_e Admin\Controller;
?( n# s) q$ U
( `0 V/ Q2 J) h9 V% xclas_s AdminController{6 R3 H; @ ~+ e C& z& N
public functio_n __construct(){
* q5 x3 Z3 D1 `3 K7 m1 y echo __METHOD__,'<br/>';+ M' X1 N" ^/ g) Y3 `+ E
}& s" N# X% Z& H P* ]
}
# c9 d5 ^2 L4 G+ T5 C t# `/ n----------------------------------------------------------------------------3 V; a4 f: }- i1 d: X( C e6 M7 M
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
3 r% `5 Q. C6 V4 G# j! R6 ?4 w+ @4 i9 b9 y
----------------------------------------------------------------------------% { J. C2 C% e' e7 X! P
1 Y( m# z* P; B+ t0 N" p, v6 ?% ]
04inc.php2 l _) `2 M. H* M! L
<php0 ?+ w) g; U- x" _) K7 a: x
//引入空间成员类
5 _% f" S0 R' _9 L4 Z! s* O; N' ~& Y+ r: v7 d
namespoc_e Core;1 d. I c3 m' N
use Admin\Controller\AdminController;
; w& J- v6 e4 K, qinclude '05ou.php';
- k4 {9 A8 w+ k E* K
4 [* Y& H( b8 e. T+ i. Vnew AdminController();
1 @; }* m9 e' i) X----------------------------------------------------------------------------
/ S0 Q1 S3 j/ w; A7 M5 ]2 t! p05ou.php" z0 k/ G, K& |5 X# w- [
<php. b/ } ]& I$ _' d! z! G/ @8 ?0 M
namespoc_e Admin\Controller;; e2 e. p. W! ?, R2 A( n. p. U Z
! P! I c) Y* ~$ [: Hclas_s AdminController{! F" R. z# G; Y0 O Y3 a
public functio_n __construct(){! a4 z( p' y8 O0 V a
echo __METHOD__,'<br/>';2 P y1 t& f' T. M
}
5 l* u6 ?+ k% o4 n" S}
/ q) q: ]* W0 U----------------------------------------------------------------------------
: X) ^# v% k. `5 n5 B. U: D, d9 V+ _4 e5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
4 i- P, G, S, ~' E( y Y
+ O0 x5 p7 f+ c1 r) u* \ B Q* L0 P! A' v T* j
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。% L" k: k7 x( \2 o6 l* v9 l2 G; w
( Z a& [. R3 F+ A: f" c% o/ K' S* \2 }# N- L$ P+ S3 ^3 M
+ e6 a" V' z0 S( r$ m
. M; ~' L, o. k t1 ?9 n; M1 O& l' }7 v4 V) y) \/ P o$ P, T+ M( v+ C
5 O: N, p4 i4 E5 n4 H9 w& C5 ^
|
|