管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:' d9 k" G3 ] W f2 f! @
5 c; g( [+ E. M# s
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ w9 @- Q. R1 a& t/ K
% [5 N$ `+ x4 W
3 o! @/ i8 P' }: `: n9 W/ U: U( {3 \& L8 `) o" {
我们来详细的讲解一下PHP中的命名空间:
! t* O# }4 u5 M g% X v
4 i; \" E% L: }0 Q% S( P- |) T" S6 ^语法:namespac_e 空间名\空间名;
0 x& p8 e. a( J" X9 {$ R! t3 |" N' V1 h1 E% s
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:- U5 Q: }' s0 ~/ ~2 q
1 x$ O0 b: f+ Z* N
----------------------------------------------------------------------------
' J6 ?- b1 t/ C% @2 O! _4 T3 o' R; B# A+ E1 d/ z
<php/ b& Z; f; |0 q" F. R
3 @ C o- E. d3 y$ mnamespoc_e AA;- ?5 i2 Q' C2 N. t. c# Q1 \2 X% }
functio_n showInfo(){% O/ [, f9 B# \: @- P' F+ B
echo __METHOD__,'<br/>';
5 F' i2 q/ L# n) ?6 @( h4 b}
1 `9 t4 ~5 L/ Z2 y7 I7 j. {showinfo();8 J: T: ]% c7 C8 S1 v2 y
4 ~$ B2 ]' L, h1 K* _1 O
namespoc_e AA\BB;
& Q& m" I; n( }* m9 T2 i& O+ z0 [( {) \& Q/ o. R
functio_n showInfo(){8 Y7 N8 T! `6 {7 [8 S' t: O
echo __METHOD__,'<br/>';! D ^8 O3 Q5 b% K
}# F/ N" i) ]; V
//showInfo();3 l& C$ ]% [& c. n( j: P
----------------------------------------------------------------------------
Q' p) i0 [* u e& z2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const) a, t+ O5 x0 x" U% R" [( V
; t' F; y t L3 S$ ?2 J
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- N0 l5 I7 F% v; X, K+ T2 y
) E; _2 e: p7 Y% V$ J, D----------------------------------------------------------------------------
5 T5 c/ z4 _1 s7 F
& O- t2 j9 m, S<php# s9 M* r l$ @! _$ H0 q. B
namespoc_e AA\BB;; V9 U! g) x7 S( P
functio_n showInfo(){. b; e6 u( |3 C" f% S
echo __METHOD__,'<br/>';0 J% R* u z$ R6 z4 I9 H/ O' T6 v$ Y1 U
}
7 n) o; P# q2 J3 _1 Hnamespoc_e CC; `9 F0 T2 z# _+ H) s' c
functio_n showInfo(){
' g. R+ t+ ] _* Q8 {+ f echo __METHOD__,'<br/>';
/ {# E$ U8 b2 f; e) n% {}
/ e9 p4 Y% _' k E$ Nnamespoc_e AA;, T6 j( P5 W; a5 b g4 P! f9 l1 O
functio_n showInfo(){4 D/ G8 P+ w* j+ _
echo __METHOD__,'<br/>';
+ {" F; H7 [0 \% X# e% b1 p; j}6 P" W5 d" P; J# v7 S3 D1 S+ n
//非限定访问:用于访问当前空间中的成员, Y D) Q/ W$ m' N, d/ j( }
showInfo();
5 c7 E" v8 P+ t, W# ?" ^% b//限定访问:只能访问当前所在的空间的子空间中的成员
# f1 c+ C- S2 |# @5 cBB\showInfo();% c# c" e9 N9 B% Z# l' l' h
//完全限定:可以访问其它所有的空间的成员; z& ?5 W* u, G H7 e$ _
\CC\showInfo();
1 q0 @0 X l$ \( L: E" R* b↑根空间标识符8 \. X# h+ N, }1 }/ _0 j. E* }& ^
----------------------------------------------------------------------------; W0 p* o/ X( i6 @9 e
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:! i* @- Z- l. p# e: F! M) b0 H
- o) v5 q9 ]/ o; F
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
3 L) P5 j: n5 i" U0 n2 H j5 n9 P- \$ P5 `0 t' Z* `2 C/ P
代码示例如下:2 u5 D$ h# L9 h8 b8 g* m) j$ `
/ G1 A1 ^2 ?9 |5 B( W1 ^4 Z+ U----------------------------------------------------------------------------2 Z j1 d; `0 s9 l& b! A$ [4 P/ M
4 s5 E, t9 r# c6 u( x2 D
7 T9 f7 b0 U9 l' P# ]3 t04inc.php
" V* [9 j) t h! w<php
) c% y7 Y; M$ X$ `2 r% m' J# S* p" I$ X/ ]6 ^
namespoc_e Core;5 l4 O$ {" ~ }' M
include '05ou.php';1 K$ B( B9 R. Q& ^3 N9 k
new \AdminController();- g9 W( f' Y" y5 h
showInfo();
( D. _+ S0 x( E. S( g
2 t( Y# b( j5 Xecho P;
* u% P4 d5 j3 z7 R2 L! }; x//根空间中的成员,只要类的访问必须加‘/’1 g: N9 l' [7 M3 Y+ p) k
----------------------------------------------------------------------------
( E1 v u, r. }- k% ?+ m. m$ j" \/ i: o* G( B2 @% S, R7 t- D& ? d. s
05ou.php
, d' L$ z) i/ W) l6 J3 P<php+ k b* c& u' t6 o7 z% X2 ~
const P=5;
+ o; E: U, v; t" R' O; L* o, ^, x8 v' i1 [6 T; b5 i# I$ e
functio_n showinfo(){
7 a7 f# ]: j/ B. ]1 W2 J3 l echo __METHOD__,'<br/>';; v* ~' T9 j$ }" i& \- n7 ?
}
( ]3 }/ H3 |) h2 W8 Z1 q! S/ B& w" }5 B% s7 A) }" R
clas_s AdminController{
# Y! {6 g; S& A4 ^% `. b public functio_n __construct(){
# B$ y2 F! v0 D2 n c6 Q2 \& Y0 T echo __METHOD__,'<br/>';
9 ^0 P% V$ D# @7 X) h2 Y }& R& D7 J2 ?/ n0 {$ A0 e
}
3 N- H5 n) V1 B$ S7 Q: `( Q+ i8 t
1 S0 r# F* s5 t+ w5 z& E% V9 ]第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* J1 V; Q' v( A0 T5 i0 Q----------------------------------------------------------------------------
3 Z2 K, A! Q9 j# I. V" |) Y04inc.php
9 t+ r+ w- ?+ L6 X4 T<php6 I7 W! \8 s! B( Q- K
4 J4 h0 l5 a* w$ T' Snamespoc_e Core;$ j3 H" m' g6 _) @
include '05ou.php';/ N& N+ A9 K- l0 d |+ m# L
functio_n showinfo(){
$ _ t+ s5 }1 {7 c' E- X echo __METHOD__,'<br/>';0 n3 n+ X9 ]5 k+ w& I: u* O
}7 J/ k$ P0 C% Z* L8 H
8 Y5 L/ ~% L4 \/ c$ D, m* Lnew \Controller\AdminController;6 O2 u* L$ e" F0 @) x( W
----------------------------------------------------------------------------, }2 R3 T. a$ n
05ou.php
, [0 r' Q% W* x! k- U3 a" X' s7 W<php
/ _, B$ G7 ?' L# {3 \# |8 Z! pnamespoc_e Controller;8 O' Z, X2 G* _& |
' a0 f8 { G# ~
clas_s AdminController{
0 j8 e; E- A% N: T3 W) i: Z; w1 b public functio_n __construct(){$ n) l9 a' s+ ~1 o' c6 T# S
echo __METHOD__,'<br/>';
! U- a! P% w, N( s6 N7 G+ U% B }
( z+ f2 ~% M% k7 i; ^}
+ f4 T5 Z, Q4 S9 d----------------------------------------------------------------------------$ D; \; i% x+ I) U: r& R F1 F5 z: _
. @- @& D6 U- f, X. H& L4.引入空间成员:9 {; R) g z) E) l B
2 Z7 C. T2 D- u5 T
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。$ B9 V6 Z& Y5 S
3 Y5 @( h5 r3 h/ H ~+ O. X----------------------------------------------------------------------------
0 c- r$ D1 [& N+ N" C4 G
# U" ]: M# i. X6 M3 N" j04inc.php
- {7 g4 j% |; v( h0 d; @( b<php
$ N, L4 f- J9 D# c! Fnamespoc_e Core;
) }0 o2 l+ S% S$ @7 e; Y8 xuse Admin\Controller as con;+ n: {% b+ a5 M: |8 k; {
6 ~: [0 ` l( }2 q- _1 Y0 W" ]( z
include '05ou.php';
6 f: ]% x' X2 G4 t! r& J
# J6 B9 J) V/ ?& z+ D h/ @new con\AdminController();/ ]3 r4 c5 l( Y- `
----------------------------------------------------------------------------
; w0 v- x, m' D# U1 H05ou.php
2 v7 {5 X* [8 o' \/ {% h* o<php
0 G5 l( c3 z2 Z# R! Hnamespoc_e Admin\Controller;
8 n+ l! |1 Y, u/ d: V' s6 n& Q9 V# H5 s# e
clas_s AdminController{0 U( l7 I, P! o4 s2 ^. W( O8 b
public functio_n __construct(){
( ]; ^6 ?1 P# N$ O( u1 I( y1 M" E echo __METHOD__,'<br/>';; L; X9 B/ @9 ~4 M/ n( a
}
0 a0 V( m: x, ^" z* w d}
" e* p3 l" `. X----------------------------------------------------------------------------' D/ H: y+ F6 u x1 \
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
7 n) c, `: d2 g3 ?! ~( ^$ b, Z6 \& P% j5 F
----------------------------------------------------------------------------6 b+ m5 f. ?% @ E1 c
+ Z- [) A; y- E: c
04inc.php& n2 g3 f8 r% U
<php! ]! B: D' z: v2 @/ f4 m$ z
//引入空间成员类. ]& {5 [6 A/ M
0 x' m* p- L% I1 N; ]
namespoc_e Core;
k, u5 c! h* |- N* f- cuse Admin\Controller\AdminController;8 j$ \' f4 f( ~8 u! {5 K$ W x3 p0 ]
include '05ou.php';% t( X8 R+ \3 |+ J+ @2 t" K
C2 Q$ n/ x3 |4 Vnew AdminController();
" q+ {# Q& p. V7 u8 `----------------------------------------------------------------------------' K$ S, F* u9 s! M% L' p7 D" T
05ou.php
* F: ]2 J) |, E8 n2 n<php
& t1 o' {- x# s+ i. N# x* b- Anamespoc_e Admin\Controller;1 @) n7 O) r- t5 y
5 f4 I6 M# E4 P- J) z! y+ F/ X) f
clas_s AdminController{
' e/ o0 S; `) l: d, c public functio_n __construct(){
6 f1 X3 ]# _' C echo __METHOD__,'<br/>';% K( s1 D* b0 q# B
}
$ A4 n4 _2 J4 J% V}# w' K3 [ ^( ?3 r+ {
---------------------------------------------------------------------------- n$ ]4 }) O# r" y
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
2 }- B- h1 K$ j5 \8 ]* G/ n: j: V- R7 F) b3 E% |! {" ]+ n
v2 T& k2 Y1 G* L) d# H9 } z这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。: ]# U7 i- x" H, q) d
A) E$ U/ L1 H$ X% ^4 S
, i4 r' T" L4 K; H9 H0 ]+ ?" }
0 o( n( v5 C' ^
* k7 V4 N( E' V0 f! Q1 k
/ G5 v" T* F6 f! H1 D% ^# o; k+ |7 b. O3 M6 \# V6 E2 y# A
|
|