1.命名空间的作用:
+ Q- g' ~, G' V$ d9 O; j' d3 w' k- u; {
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
% {0 F* U+ I' N( k+ }) F: r* e, u, e2 _/ s- B
1 F, X. v4 J- }) U/ t
8 l" w' C/ w3 q我们来详细的讲解一下PHP中的命名空间:7 M# i- {% S' o0 \5 g5 D/ a: j
4 {$ @; g& V' o% f8 @1 r语法:namespac_e 空间名\空间名;
) y+ f: d n! y6 _% x2 G
1 B8 x p! s5 }2 x说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
2 h2 a6 a4 Q8 O8 L0 t T _
" h, ], x3 d* w7 F----------------------------------------------------------------------------
/ Q, B3 B! O/ w9 C. ?
2 O1 _+ |2 V6 ]. a<php' ~# Z% o( Q, L( T
$ H+ J9 d6 I! l- B4 ~; mnamespoc_e AA;
) c. d8 J j- F: A4 k# s# D- |* s% `8 Pfunctio_n showInfo(){# s4 V9 @. k( p) U7 z. J- X
echo __METHOD__,'<br/>';; d( C5 K2 q2 R. x, a* b
}
8 z, g) \& _9 X# ?showinfo();4 Z; G7 V( X( I3 b. y( W
0 S" |7 L, W K. ~
namespoc_e AA\BB;
* W5 j! D' l/ s8 W/ [" _- J5 N9 D" A }2 l4 y0 A, s
functio_n showInfo(){
# Q' c w& d) R5 R echo __METHOD__,'<br/>';" L3 w, L* x' d. U& |/ O4 h
}
; a. p7 j3 m+ v6 N; Z, B//showInfo();1 y, q, A R. Z# Z- M
----------------------------------------------------------------------------. }, S) G$ V& x
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
" R1 w X9 X' L* s/ c
) r/ c: ]8 o* f# ~* e- s3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。# q* t- {$ s- d" i6 F( ?9 I9 L( U
3 Y3 x% y$ \3 j
----------------------------------------------------------------------------$ O0 g' }7 \! @ }- T
( G' y3 A6 s/ F F. J
<php. v* r. E6 ~/ ^- t% z# p
namespoc_e AA\BB;) m7 {, X, ?) e0 @4 m
functio_n showInfo(){
7 S" ?7 v7 |. x% g& W! c0 f4 K echo __METHOD__,'<br/>';' e- M0 y$ m) J. }& P
}, e% S$ ] i/ J& [
namespoc_e CC;
% `& ^2 a& ]1 R: s3 vfunctio_n showInfo(){
4 O s; L9 T' m+ x9 I7 D, n9 N7 i echo __METHOD__,'<br/>';/ P# _3 K% t/ z2 E5 v
}
3 l5 F$ a6 X. O' Pnamespoc_e AA;
% r+ N \+ A+ rfunctio_n showInfo(){
. Q# j D1 i# S2 E: ~+ s0 h8 q echo __METHOD__,'<br/>';+ o8 i4 A. n5 V) x# d4 r* P
}+ H, p6 f% N' y5 u# h
//非限定访问:用于访问当前空间中的成员
) Y1 x4 q0 `" f! f( z4 sshowInfo();0 ` t0 P( p" x
//限定访问:只能访问当前所在的空间的子空间中的成员/ X8 I* Z; ~% w( ]
BB\showInfo();+ \3 P. p+ s( `
//完全限定:可以访问其它所有的空间的成员' S% X! F1 V1 E3 H
\CC\showInfo();, \- i7 [: ] _5 z* p1 D
↑根空间标识符
1 x7 o# l6 j1 `* O----------------------------------------------------------------------------2 }/ \. W- l5 R# N
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:4 _( l. Z/ x- Y: z$ E
! k: x( I/ I f/ Y当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)1 Z% {0 q% B- ]0 P5 x6 R
Z( _2 n) V* G代码示例如下:- Y8 m5 X7 o K b
" E# J& g' B; `* G& \
----------------------------------------------------------------------------
9 |2 W$ z) \# v H" |( g
/ J1 v" A* O& q2 n5 a1 u# m% Q, J8 O3 j. ?- d
04inc.php B' d/ y: A- _( Q% e
<php
4 U# X# M7 a5 p& i6 _+ I! d
9 I. `8 t2 N! A) r% r6 M/ n, R5 jnamespoc_e Core;
2 \1 I2 m, d3 C' Cinclude '05ou.php';
" r" A5 u' A9 d; }# Onew \AdminController();
4 |: j& O: G9 h. G! GshowInfo();
; S& O0 p" S6 X. T" S* W# x
?2 ^4 _- b8 ~' y6 {6 v, qecho P;5 ]' Y6 W' ~! q5 q6 A
//根空间中的成员,只要类的访问必须加‘/’- P5 ~" K( k$ o. X1 v
----------------------------------------------------------------------------
) \9 t. d0 \/ O2 t% l% |, t' E2 f- u. `2 U) C. }
05ou.php
) E- k$ e7 C. u& O- g<php
' c" f) q+ J; T# j5 k- wconst P=5;2 }% ~- j* \* E) {
3 [: N2 N4 ~' }, P9 |: ufunctio_n showinfo(){, C+ O& G e k+ x* h
echo __METHOD__,'<br/>';$ `! m$ y, t6 D- s- O7 T u
}3 k3 b0 B( m. y) p3 u0 m) x
) n9 w8 d7 s# V- K& s4 uclas_s AdminController{3 N$ |- q" k( ?) N! n: S* m
public functio_n __construct(){
2 F2 u& j# c$ c( G' [1 ~* n echo __METHOD__,'<br/>';
/ R2 w, n9 J& I }
+ r. L D5 q: y% C, F' `}, {, C7 Q: Z: A6 O! @. k, k
- d! }& k" o: |第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。; J |. v+ N: G$ w! q7 @
----------------------------------------------------------------------------
3 A+ r* b/ m4 I, f' h04inc.php! {2 T" R; }" o1 Z6 p, K
<php
" ^$ y9 w- G7 p4 B& o# d4 {7 E% z+ `
1 X$ x2 I$ \+ O! Vnamespoc_e Core;# a" T4 N+ A2 @* o. t; c
include '05ou.php';% G G9 u! r, Q9 h, K% C
functio_n showinfo(){
/ _4 _* V7 z. i- D echo __METHOD__,'<br/>';. P/ J& ?+ b( `; V. ^
}, z8 p) f6 {+ w. h+ ~
; q, D( b7 g: p9 s8 p
new \Controller\AdminController;
: _' y5 A2 {* y----------------------------------------------------------------------------- {; E0 x3 x6 C8 A+ O' L8 a
05ou.php/ r1 b+ t, h1 }) d/ y: a
<php+ V; M C6 u5 o$ A
namespoc_e Controller;8 t: A7 O/ B* w) Q5 }5 Z( g
' M6 k$ d$ h) }! v& z5 T' jclas_s AdminController{
1 J5 {: A( b4 k7 r" T* d public functio_n __construct(){
% w3 j* A1 ^, f echo __METHOD__,'<br/>';2 o, G: Y$ j6 I
}0 E! I1 m8 {4 x6 T
}
% P6 I m9 @* U( z6 ?----------------------------------------------------------------------------/ Q2 Z0 m+ L$ `! ^. M: M
9 F1 ?# T0 \2 P0 a) f8 h4.引入空间成员:
! X7 w% w1 a3 x6 k/ m, l6 \
9 r( G9 `5 f0 R5 z @) {1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。3 _! B- ]0 }; q4 W
! E, T* W+ w }# Q! [
----------------------------------------------------------------------------
# [- _8 Z* k8 l0 T: f
! h! Y1 W; j- u4 ~% a+ \04inc.php C7 ^7 h6 |& ~, f0 E) ]
<php
7 } I( z2 T% x- fnamespoc_e Core;" C/ S- J7 ~2 y& X _- p# k
use Admin\Controller as con;
+ t' V B8 K- f6 y, c! y- h& z8 p! ?/ O
include '05ou.php';1 j+ ~6 [# V: R2 G0 @. O' w4 e
. l/ \0 r2 h7 Q4 E7 R. P) I" H
new con\AdminController();. @$ S3 K! `* w m5 j7 j- D' S( h
----------------------------------------------------------------------------
' F6 U7 S. v, u9 i' ~05ou.php
" R; j, \( {3 r5 [7 s4 A' ]<php: @9 K% ^: n3 `% z
namespoc_e Admin\Controller;: g. b8 L" W& e9 x
# J8 {! P8 R5 J( Xclas_s AdminController{0 l `3 D8 G% g; O% A
public functio_n __construct(){7 U) O9 }& P7 k8 _4 C8 a4 l* Z1 Q
echo __METHOD__,'<br/>';
/ g, ]; p3 Y. D! \7 m6 u, N8 K w }
" X) y3 ^0 u, k2 V9 a! i}
: J+ i& S9 x2 P% v5 Y2 R* |----------------------------------------------------------------------------
" g8 Q' Z# y" f9 e% ^ n* V8 D2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。2 b- J; z: Z$ }0 j) M
( ~) @0 B# @; d
----------------------------------------------------------------------------
6 u; n3 \9 D) y& w% U. i# s
5 l! }# d; _) G9 I04inc.php9 w* ~( K' \6 s/ ]6 ~8 J
<php
! z. r7 @/ {' ?9 W6 e! I//引入空间成员类
6 b% u: Z9 k* @. B
5 H$ o; f/ l& }6 r6 @! A* H s# _namespoc_e Core;5 t1 l- w& {3 |* Z- H# q* z9 c2 r
use Admin\Controller\AdminController;
% f( U# ?! H, \2 G2 o. [& kinclude '05ou.php';& @* h e) ]- c- I
8 E. O3 ~ G4 K/ d/ R
new AdminController();
, \3 X) t: G. A2 t( ]9 e----------------------------------------------------------------------------, M0 K6 P! `8 F; Y0 X, T
05ou.php( W/ Z @1 A v1 A( L5 i
<php2 j; _4 T1 W/ P4 |% m
namespoc_e Admin\Controller;% ?! e, K4 d* d) `( B+ A+ n
" s1 _' g$ M, Y! {7 W: h' K
clas_s AdminController{/ ?3 U, d ~9 T/ N
public functio_n __construct(){
8 Y$ H5 j2 W5 N `( Y echo __METHOD__,'<br/>';
S. r: o( M+ K+ L }
K# Q0 V; E8 v}
1 e# U7 l8 `! E7 M) E0 i$ f----------------------------------------------------------------------------
3 a) w/ a9 ^6 F3 S/ f$ M5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。" O0 s+ g$ q7 M# f. N# A- I
% T7 D( G+ k2 o
- p* w5 [8 ~' y+ \2 y/ K. i这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 |; U- n& U6 @7 S, z( v6 X* E& U) o& t
+ t0 h( o9 t3 j4 Z( X
! F3 ?* \2 q2 B0 @4 K- Y3 \+ U6 e
/ g* A- b1 a$ z( k% n2 z. B0 ^2 y: _% [& E- F1 P s* u, V! H
|
|