1.命名空间的作用:
7 N( p$ }6 J; f% l: `# g S2 e* ^9 J. |& ]3 I$ o! K4 Z
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
1 v5 K) ]$ b% Q8 {" Z- L! p
. @. ~8 x9 F1 {; e! u$ G$ @8 h
! H0 B! U# L) ^* ]& _, w4 `6 y# t
+ k8 I J, _+ l* d9 v我们来详细的讲解一下PHP中的命名空间:
' h% C4 N7 z0 h6 X
/ H J4 ?. j, S5 D# x语法:namespac_e 空间名\空间名;. R2 G$ G% z, P3 m
2 C8 w, B }2 Y9 y% e- k* {$ M说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:; j3 L7 V7 Q- q, u& P
' G U( S( P1 f6 [# A
----------------------------------------------------------------------------
" S9 o0 B ^ q/ O9 _$ x* t e& @4 _7 z# m5 {5 |
<php
! }8 ]1 z ?7 R8 E; W1 ]2 l w" w9 s2 R$ L
namespoc_e AA;
9 C7 n; V$ @6 b6 y4 ^6 D2 k+ ifunctio_n showInfo(){
% \! i7 P) d4 t echo __METHOD__,'<br/>';' \# ], Q0 S6 u0 f% P
}
+ t' @& `9 O9 vshowinfo();; G- [3 Z5 [8 z* ?/ P- h
; \& U- }/ H: I) S/ A
namespoc_e AA\BB;
2 U0 Z6 Y$ ~# U+ @, Z
6 H7 I" g2 P9 N* [$ a: E& w9 `0 I- |& Wfunctio_n showInfo(){2 K/ S2 F2 L% R; n/ }5 M- n& a9 ?
echo __METHOD__,'<br/>';9 s' v% P2 {/ ?5 i5 j
}( n+ V# P( i$ I0 n5 T. l
//showInfo();
/ k) j" ?0 r/ i7 M$ e# K/ s2 |3 {----------------------------------------------------------------------------
( {0 F" k4 |/ ]# s( }( n6 n2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const) x- w: M0 s% x9 ^% j' e' T
; m5 e0 J# a1 b3 `7 g( @1 ]3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。; N! }! s1 Q# k
/ w& B, J; w- |
----------------------------------------------------------------------------
2 {+ v. i5 A0 w4 }' [& T% B! ^, F! q) D$ a
<php
. f% k+ f( q s! X/ jnamespoc_e AA\BB;: `, G5 p0 Y0 Q' w& k: i3 `
functio_n showInfo(){* J' T1 X: G0 f J5 D
echo __METHOD__,'<br/>';
. k3 m2 ~# ~+ Y; J0 ?+ w1 { @: i, U}, w5 {5 o6 @% ^# A2 n
namespoc_e CC;
0 Y) T# n; I E$ k% zfunctio_n showInfo(){
( D' p3 \( w, ^ echo __METHOD__,'<br/>';
! W" @6 v+ o- S* f}7 r( q( M6 {$ J2 m* W
namespoc_e AA;2 f6 ]' k2 J7 i; z" {- \+ c& I
functio_n showInfo(){ `- V3 v7 L: x+ P8 N. l" e
echo __METHOD__,'<br/>';
& E) K# w" Z; T; N}
' o5 @4 I& \) @6 R9 d- m, i//非限定访问:用于访问当前空间中的成员
3 K* p6 a ?) mshowInfo();5 ^9 H, o. i {( b: A5 |
//限定访问:只能访问当前所在的空间的子空间中的成员, ?: V6 ]( X: ` T3 f! I
BB\showInfo();
5 i" D" u4 Z. i/ R//完全限定:可以访问其它所有的空间的成员
" H; Y8 ]: S8 i" D$ P, M\CC\showInfo();- m- c( v/ x( G5 F6 G
↑根空间标识符
6 a5 L- R- n1 b9 M2 Q4 N4 h7 O----------------------------------------------------------------------------* g3 ]6 ~1 q2 A& r1 v3 T! N
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
" ]: Q6 G. k6 k- O* s- A
" F) }! |5 `' t6 n3 c; D6 j当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
. W% f. V( Q" a# x5 _( P. x9 `5 A7 i% T0 r; g" J
代码示例如下:
: b9 x0 z' e- m& ]2 y* v: b. F) S# j8 I k" j5 [
----------------------------------------------------------------------------7 j/ C: y, w; F
7 q$ |$ R& ] a$ K1 n7 P
6 a0 A* \& w& L; a) N1 U
04inc.php. X8 d1 l$ S4 Y- D& K4 N
<php
8 R' x8 l9 [! t0 W( w
) ~" T4 t) r* K! R3 w; ?/ \namespoc_e Core;' x- S0 D ~' s3 M
include '05ou.php';
+ \7 P' ~& @4 D* Pnew \AdminController();& l( d5 g, N# P4 G" {
showInfo();
1 q- \; m- I0 d% G5 A
1 v% b l8 i% \- s @echo P;$ ?+ R& J% L* N9 j& U, u! o
//根空间中的成员,只要类的访问必须加‘/’
# J$ `7 @8 O0 ?. d% t----------------------------------------------------------------------------
Y2 y) `* m3 V- F4 B
/ J( I- A! S& D3 g1 P1 r R; S05ou.php% P( F5 p J% X3 \
<php* z) L3 x! ~3 q H6 x s% W
const P=5;
: X9 q& T% i+ u. F$ Y! x+ E) a* A8 V3 }
functio_n showinfo(){
3 W& V; D0 `) W% E! s) R echo __METHOD__,'<br/>';- k, E" v3 l/ L* H6 p% E3 k5 F
}% J( Y6 z8 @$ ~4 K: a) x
7 L; k. m- \- W7 x7 E* n
clas_s AdminController{
+ Z( d% P4 x( `8 n3 e public functio_n __construct(){
& x; c b: \# k, ]; Z2 | echo __METHOD__,'<br/>';
0 U: R+ t+ U, m' R `+ J }
1 `! r! z4 W6 n m4 {}. S2 F4 Z1 [* t- M( s6 a1 B( f
& f3 v3 R3 g- S0 C- h3 m" _第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! q+ b( O9 _3 x( L. y. m
----------------------------------------------------------------------------
7 o1 Q; t; v; O4 E" g3 ?04inc.php- V0 {" o# n8 A" _$ |
<php
9 [+ J0 V: ^$ l6 Q% k/ k, I8 I7 D7 Y1 d& F: c9 @* Q' Y' h, P
namespoc_e Core;
5 V8 T+ E6 l' P# e: t* @include '05ou.php';
3 y/ s* p; A8 v9 Afunctio_n showinfo(){
5 n" C+ F' t r) d0 o echo __METHOD__,'<br/>';6 r* ^6 P3 h, Q
}
+ f0 Q; ~* J- ^3 B8 ]! C, l8 ?/ |: _& _% y2 m5 w C
new \Controller\AdminController;
1 f. l6 b/ c: V! j+ m----------------------------------------------------------------------------) ^! j; x* o- F2 C
05ou.php6 b" c" U& y& [/ T1 x! B& t i
<php
# r( S' h2 t$ X" R+ I% o3 tnamespoc_e Controller;4 Z& Q6 X# z8 w: f( J
6 `& b K. V+ _clas_s AdminController{! W6 A9 W- q0 G$ G
public functio_n __construct(){9 ?6 }) U; D1 b# m3 u% \! a2 V# C6 o
echo __METHOD__,'<br/>';/ h( C0 `1 u. u8 ?/ |0 q" J
}
% w) \3 E) K o5 N}* E! t6 E$ j, _( c
----------------------------------------------------------------------------
( n. ^0 m" s; Y$ @. w. {/ z# p4 ~
+ L2 a' L/ D" w7 [) o' \1 J4.引入空间成员:
+ H8 O3 [4 G8 J- S3 U0 G9 i# W0 Z# Z, I3 w& z. @, u8 z# ?
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
2 \7 X: |( ~% |/ H( E3 ?
. A! y, G/ q, u2 f----------------------------------------------------------------------------
* e3 q" j6 O9 {: E, [+ {( E' W9 F6 z
04inc.php X: R5 s4 Q8 \7 a. V( D8 Z, ~
<php
5 \; v8 i `, Q2 n+ s" B" {namespoc_e Core;0 M8 x) x. q! i$ M& y' C/ \
use Admin\Controller as con;: ]) D4 g' w& B3 W2 n
t! d& N( s, T3 ?, q% |; e) K5 ]include '05ou.php';
, z/ F* z8 A- }' O% a' `' ] T4 y* G8 R: o {4 {2 m$ i
new con\AdminController();
: ~0 F( f4 T0 H/ C0 X" z- s----------------------------------------------------------------------------% y1 h# _( U7 m$ ]# s- Z' L6 u& V+ h
05ou.php
# H0 q2 O3 T* o) N4 T. Y9 T4 K<php
8 C/ ]3 z" B( p4 T6 U& hnamespoc_e Admin\Controller;
* A0 h7 n" m) s9 l# M0 u& R" {) w9 f) q) Z# r( c5 H% y
clas_s AdminController{% e3 j7 s9 b% A, `: @' j
public functio_n __construct(){0 o# H: ?+ G. R+ ]: i
echo __METHOD__,'<br/>';5 q4 u$ }. s) I# x9 I. O4 Y8 ~
}
6 |$ x4 u/ n) |' d}: j" Q9 {3 G, W7 D
----------------------------------------------------------------------------
- [& c# q F( n U- }) k. \2 z2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
( C$ z. s2 v' Z7 a& C
" v5 x/ L# F* [----------------------------------------------------------------------------" z( [" T h0 H$ k
" o' @* x8 z- w04inc.php
6 b9 g8 g7 Z- @) X) n- f8 T( |<php
& H ?8 v' J/ L' h, \//引入空间成员类
( Y1 }. ^- H" A" Q
3 |6 O; Y( {* D8 y' W& Jnamespoc_e Core;
* c$ b. G) |, f' g0 |# m- luse Admin\Controller\AdminController;% ]) V4 U2 j) n3 L7 S3 Y1 @2 @& f
include '05ou.php';
. J% l, s( J6 g5 r3 O' e+ G' u5 X" J3 K! i
new AdminController(); _, V' d% P5 W' Z. ]; h' k
----------------------------------------------------------------------------
. `2 D0 w3 m6 _8 G5 d+ Y/ P05ou.php
. Y' B) A; u$ c<php2 M0 d) G9 i' C, f8 Y& ^
namespoc_e Admin\Controller;
$ C- z/ {, C* m5 Q4 k/ _3 Q2 c" F
& F1 `, f* _, w$ z% v" qclas_s AdminController{. f- T" H% i* j6 {# h8 @+ X; `
public functio_n __construct(){6 }2 d& R, e: X* n- k2 h$ G
echo __METHOD__,'<br/>';& X9 }% n b9 B! T, O, a+ [
}
C3 a1 C/ t3 s5 M/ p ?}
; Q: ?! O# d! }6 ~ {& v----------------------------------------------------------------------------
1 t A8 r( u" Z5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
3 B1 O1 w' P7 I J' e5 }, C3 @. D P2 \7 V8 d7 J% l5 [7 {
" t# I+ w2 O; q! r Z6 K" R1 d
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
3 ]. _) V: | \9 x2 \
1 d8 C& V @7 c+ o5 M! w6 r
& u( ~% i2 h& P3 W: G1 t1 f
/ D# x* S9 T/ J5 @4 Y" Y' V4 V x1 F8 T% X: {: L. U7 i6 Y
) U$ R" s C3 [& f% y% C0 k
) j9 i# Z* M v* ]: Z* ] |