管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
f6 h+ O( |9 ?0 _, a; _: Z6 k0 R& I+ G7 U: @) Y: o4 h" [5 k
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:4 x( d* l/ U/ b, c# r o
5 {2 x( S) o. C* E3 @3 J+ A
6 g( W7 I( b7 ~; m
2 _3 h) x9 G# q# V) w j* z我们来详细的讲解一下PHP中的命名空间:
* C5 A# z, d; _) V5 d4 C( l1 S r9 b4 S' ]. _
语法:namespac_e 空间名\空间名;
% u% g; k7 Q' x1 F3 e) J( }, ~- A1 q/ ?6 L) N3 v( Q6 M
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 I6 M/ o! t0 {( H) `5 K n- h/ W& h$ }/ I- g1 T) p% _# a7 p
----------------------------------------------------------------------------
( k% ^9 r+ q& D! t- A) D, ^$ t: ~* C! g0 i7 x) S4 |5 ~
<php# G# i$ k" ]% \3 m" u' `& j2 g' u( T
3 q1 s4 E3 p1 P9 _
namespoc_e AA;0 w3 v6 h: P7 M" r" n8 s0 ~: J
functio_n showInfo(){
7 [) g- S1 r& T+ i echo __METHOD__,'<br/>';1 M, o, ]6 P5 w9 l* x) H( H" B
}
( t3 S3 S6 Y& Qshowinfo();4 N* t `. g0 j) ]0 B2 u" w
7 ?0 B1 L4 Z8 c! e" g. y
namespoc_e AA\BB;
4 P/ \3 q. h2 L+ d( k: X. `3 k" x1 d0 X* R# D7 h6 B
functio_n showInfo(){8 [( k' e& s4 h e1 }
echo __METHOD__,'<br/>';! X4 i! N3 T$ R3 z0 W! N
}
& ~/ k# N: [9 I j+ y//showInfo();8 k" t! A6 N' N2 N
----------------------------------------------------------------------------9 Q. j$ ~3 }) @8 [( Y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)% z0 P8 d4 n6 {7 o
7 O, ^: X4 u1 W# P
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。& e0 I' b1 R: K1 h% z
# |/ d( u7 D) o/ [) `6 y/ C6 L
----------------------------------------------------------------------------
/ \7 ]6 \ X. `9 P" g* y2 f9 q/ ]1 j `5 y& `
<php3 u& w7 c8 B8 n1 b
namespoc_e AA\BB;9 ?9 h: ^- D% x7 @& ~, _8 t# n( N
functio_n showInfo(){
5 |5 X* |! W& w( I/ Y, y echo __METHOD__,'<br/>';( M6 ^) h3 ^- j4 w' x& B/ S
}
! C/ Y2 T: F2 w! v0 X) Vnamespoc_e CC;$ K7 N) C5 q: O3 P! V& H. `
functio_n showInfo(){7 b7 {; M) A' G* `0 t) U& j
echo __METHOD__,'<br/>';0 L' R+ \+ @( K6 M4 S
}# i9 U2 ` n& H3 S* W& G; h
namespoc_e AA;' a5 b2 P4 v# q. z* ~
functio_n showInfo(){
0 F% M9 P# o- o( F0 u1 P! z0 ^( M echo __METHOD__,'<br/>';
7 j g3 q8 z6 g( g% h}# ^4 w- ?' Z4 L) T5 B; }/ F
//非限定访问:用于访问当前空间中的成员; K6 E4 I7 F( f9 b+ P
showInfo();
; P; C4 o7 Y0 H0 l) h0 o: E) b//限定访问:只能访问当前所在的空间的子空间中的成员
6 i) d3 f) K1 J% I. sBB\showInfo();1 W0 B6 U, L; V( R l9 O
//完全限定:可以访问其它所有的空间的成员
# ^9 o" K0 t. Z3 C' {: }5 n! p\CC\showInfo();
- ~3 ?# b {+ Y" K: c8 w↑根空间标识符+ g: Y2 c# h- z. D8 O
----------------------------------------------------------------------------; x- n! W5 B Z
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:5 l6 _4 D( c% ^8 n7 k
! @8 ?/ m0 l2 s2 C3 V当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)& L0 X" s r" X; p7 f9 ^' `
- n% _, B/ N3 {
代码示例如下:5 n3 Y' `8 U% g( H1 ~" {
; Y, ]% k! v( @9 d$ T# t
----------------------------------------------------------------------------
! Y, S; Q3 Q' a8 _" n" R8 {# W) a( v1 a1 n
- Q) c @- W- H* T$ a! u
04inc.php W1 ?! i: p$ k5 b
<php
4 b3 m( `/ A# G* r C2 p- b% s0 n( ?' J N' P8 I4 M
namespoc_e Core;- g3 @7 G( q% M8 G) C
include '05ou.php';
. b; v" q6 D: f: hnew \AdminController();: L+ V/ f w9 W7 F4 }
showInfo();8 Y9 f; M( N: ?: p1 w. \3 m% z5 J
3 v% T# {; |& r4 necho P; x* l& h& Z1 [- [5 x, F
//根空间中的成员,只要类的访问必须加‘/’
0 V" T+ o4 f$ {% z; G' S----------------------------------------------------------------------------; Q# N* [$ P- p
$ H- J+ f6 r2 d# }0 r
05ou.php' K: a! Z) D! j0 B# w6 Q4 A% A! A" r
<php' `, c" Z8 v1 W7 M8 S
const P=5;. B" D U5 @- T4 B0 |" R7 @
5 w! e/ T' d8 s7 ~ l5 G
functio_n showinfo(){
2 g( E( i& O, V, C echo __METHOD__,'<br/>';
1 d- }: A. Y/ W( R}( l* m5 @) P U
2 P" C' I6 T- R9 }1 |: N/ ` O+ y
clas_s AdminController{
! r8 M3 n8 q' e/ w6 K& a3 o public functio_n __construct(){
: n" L. z1 U( Q echo __METHOD__,'<br/>';3 J9 t1 Z4 Z+ s
}- q* o6 ~+ I Q2 y# o* D
}6 [' F5 @( G# c8 \
+ t- [! n/ |- J第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
2 l) E5 @# E6 ]0 q) u----------------------------------------------------------------------------
3 Y, _7 q% r+ l/ o5 E8 [04inc.php
7 l; n% v' H0 r( B p9 z<php
6 m3 |7 `; u# t4 r3 C- Z6 M' ~$ c5 X3 `" F
namespoc_e Core;
0 x0 E% b& o( V% sinclude '05ou.php';* @/ I/ D0 [$ U
functio_n showinfo(){
# L0 Q% n+ D+ H/ G; r" S echo __METHOD__,'<br/>';
# p& ^- b: @! F! h2 X1 r}7 K6 [; O$ ^; {! z
- a* S4 X# `+ b$ gnew \Controller\AdminController;5 Q* h4 i8 e+ ?0 l, h
----------------------------------------------------------------------------
3 N& Y3 C$ {7 k$ E4 Q05ou.php$ b' }2 p0 Z! P
<php/ j4 F Q. C% |" y3 u8 c" ?9 d% u
namespoc_e Controller;
0 |* r" A* R' e5 f# @3 Q
/ k" i& Z) ` `clas_s AdminController{2 Q% \8 A0 ^6 w L0 O( a
public functio_n __construct(){
1 m) @* G: B, ~# I) i echo __METHOD__,'<br/>';8 |' _- ]$ H$ P+ C3 I" L: u) m
}2 q8 \# r5 v$ v; f: b/ Y3 U
}) u; t' o, a- f) v- k& U
----------------------------------------------------------------------------
) s; `& p8 }) N3 F, S% q0 K
e' ]9 m {8 }! r1 ?+ n }4.引入空间成员:
, I" r1 ^- C* I% n" v( ?! ]& X- o4 Z
8 u$ P: x0 e1 {0 E2 u6 @7 V, x1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
' S* j3 a% M9 B& @2 o/ a
. K! i, J- Z2 R1 l----------------------------------------------------------------------------8 ~7 m, d' Z% d
' i# Z1 ?% G8 J+ N) @8 U3 B
04inc.php
3 ~2 y7 O3 K6 b8 n6 G/ R: @<php
% u* I8 g2 L0 R4 V3 {$ \namespoc_e Core;
; `. y8 D& {4 a9 C& Guse Admin\Controller as con;3 Y- l9 D5 ~; T& [3 S
# p N/ ?4 X6 g
include '05ou.php';" o2 ?- ?- @: O9 j( K& b
: J7 R5 \/ U# g, s' b& }+ w, tnew con\AdminController();# g4 O Y2 O1 _
----------------------------------------------------------------------------
6 a" A) p# J' W05ou.php
0 Y, ]1 O, p8 n" K! h9 w<php, Y# M' V, R3 M3 u9 Y
namespoc_e Admin\Controller;7 @0 I0 \8 Q6 k! ], Q0 s
, s3 W( a3 C' R, i9 e7 {& Z
clas_s AdminController{" y* T$ d4 x% n
public functio_n __construct(){2 B( o+ W. V: s. T9 T) E9 C) y
echo __METHOD__,'<br/>';
& D9 E, T T/ N4 B& X }
: @& L1 Z* D) P* H9 {}
5 V- E% d; x8 D& L----------------------------------------------------------------------------( F0 ?" H8 Z$ h# J8 W
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
( d) ?! w* L( I% g4 S8 Y0 [
- h8 N/ }, |& j/ i a. ^----------------------------------------------------------------------------) n0 G% ^0 e' S. G" q- X6 f9 f
3 w7 {' W5 Y) x0 s1 r% T8 {$ y04inc.php
% Z% i9 u2 [) r2 A, P+ v<php, t) s3 s; Z' V) |" [5 D4 A) J
//引入空间成员类6 Q* w$ W J& l. ]% j! X' }; I
' j/ b1 @* a: U! K4 D! Enamespoc_e Core;
0 R" Z- a i* Euse Admin\Controller\AdminController;$ f' {0 A& o ~ J: W
include '05ou.php';
+ `! g3 Z& M5 d5 e5 C" W6 U W8 p! h, v% O: E# r% z/ o: N) I
new AdminController();# B+ W* h2 c8 P* v& z" F
----------------------------------------------------------------------------' Z! _+ t( e0 F T
05ou.php
" R3 d; K3 t& p9 `3 `<php% w w' P: J$ v! V( }
namespoc_e Admin\Controller;
[5 j. c! _7 l& b5 B& N+ T9 q# H. d% f) }. s' b
clas_s AdminController{
+ f2 p W5 f0 M6 ]8 j( ~ public functio_n __construct(){ s$ t) {2 b0 Q- T
echo __METHOD__,'<br/>';9 K) D' y* G2 p) M* {) i
}) `6 r8 x7 J: C+ c
}
8 N2 \& T, s. y# j( B8 |+ \----------------------------------------------------------------------------% [: n# K+ e; q6 X& k
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 ~( V: z+ G3 r1 P/ Y
: w, r1 N* {6 Q$ }
' K; i! N; c0 l% _: ^0 |' ^这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% W" W& |% I5 [* M7 U z t! Z8 x9 b, [
$ K- u3 u4 V; `
) S; N, }3 |7 S8 J
I* H! z7 r0 X- _2 b9 C- F
& d v' b; x4 r3 {7 f7 x/ [8 y+ T$ W+ |& D/ Y o
|
|