1.命名空间的作用:7 `' Y+ c5 F l0 J% L0 }6 Q: j4 p. F
& ~/ D! e. U8 y$ ]- n: z) |4 f' w( x
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
7 Y9 e4 X0 `# f/ g' P8 a; r
, T. t% T; ?- u
: w! Q" `; ^$ s0 i
- X. o" ^% S& D我们来详细的讲解一下PHP中的命名空间:
7 i$ ]. g% a# k2 @2 M9 S3 k. u# x( C1 e% w' U" w' G
语法:namespac_e 空间名\空间名;
; D% e- E7 s- J! {1 j+ W( V: m2 j
% i; J- x; F X说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
% d+ n' `4 H- l+ m& G' p% \5 X6 A
9 A6 m) r' ?" C4 M+ |6 O----------------------------------------------------------------------------, s- v# {0 o" @9 j7 |8 {
/ F' y- u! ^ f( M: u; r8 t<php/ A0 U5 w0 w( h" e
# P9 B7 }5 W4 ~2 M* }4 ^
namespoc_e AA;8 C- h$ z h1 w5 q. l
functio_n showInfo(){; n% [$ P0 i5 q; G$ v
echo __METHOD__,'<br/>';" {! I) e- Z& f4 Z7 |- ?
}( e; B- k4 r! Q, ~, w
showinfo();! h- ~1 m0 x$ b. f. j9 s
0 H6 T% X/ s' r4 H; q. u0 anamespoc_e AA\BB;) t0 m7 \( g, ?' u
3 \/ W7 @+ e+ O( o5 F d+ }9 ofunctio_n showInfo(){& {" _) N6 D- X, j
echo __METHOD__,'<br/>';5 U4 T6 F' O" [+ r
}' M2 |" W2 q! c& i9 m+ b( L
//showInfo();
5 Q1 N/ s- T" Q; O3 ], U" a----------------------------------------------------------------------------$ d0 I# p5 O' i2 s/ {2 @1 H
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
- d/ y# [ H: { I) `
, v9 @) v& p- O/ z! M ]3 Y3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。/ C4 P! r: M# i( M
! B" A( Y/ A0 k. Y- p. R0 x----------------------------------------------------------------------------) k& j; o+ G. a, ]: I6 M
& y/ d: O5 Q: l' {+ z) K( B5 U3 a<php
% e9 i! @% c9 z& t3 K7 U* anamespoc_e AA\BB;
( R& H7 ?1 N# T1 @7 dfunctio_n showInfo(){
+ q. n: w: R' a a echo __METHOD__,'<br/>';
0 C# x0 a1 l c" V3 t}
9 V o; Z- {3 r2 D, o, B( b5 Znamespoc_e CC;1 Z5 S2 c, t* w3 |4 _# E
functio_n showInfo(){; c! r0 G+ X' s
echo __METHOD__,'<br/>';
9 Q+ y3 F" K9 r6 y% O1 _}
: X- @: n' x p9 p$ nnamespoc_e AA;
/ A0 O6 [! |% i5 L% u' e# vfunctio_n showInfo(){2 E4 x8 j3 H8 R0 P% a8 M0 F* j
echo __METHOD__,'<br/>';; E# [' m$ N8 ]" c( Z
}
8 m. Z; u0 |& ^( R5 {//非限定访问:用于访问当前空间中的成员 h, K* o$ i3 E( |2 d$ t( l
showInfo();
1 ], T7 j/ ` ]# U. M, O//限定访问:只能访问当前所在的空间的子空间中的成员* i1 R4 I# }2 {9 d3 G
BB\showInfo();8 P+ I( P' F5 `; `/ U
//完全限定:可以访问其它所有的空间的成员8 F+ A# _9 k0 P4 n2 b
\CC\showInfo();; B \0 k7 W9 F* }1 X" [* N
↑根空间标识符
5 I3 B7 P! G+ i4 \% p& x----------------------------------------------------------------------------1 I5 \+ I8 `" ~* d% {
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:, m- h( e4 v/ T: C) e: O
9 L" O2 @; l1 R, g% w当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
2 h8 R( s7 A/ Y6 ?8 Y; c7 ?# Q' \8 R r! [4 V
代码示例如下:1 {6 I- u A. A& Y" \
. q" l3 `) b; j1 t----------------------------------------------------------------------------
# U/ k. C0 v) J! \% \) Q9 |, Q6 r3 X
" L% s0 m9 w5 F4 F/ x8 p04inc.php
$ E+ a" Q/ _: k9 k2 H/ C" R: g& J7 W<php
5 ^1 z U3 b. ?4 p8 [7 J
9 N# ^7 A5 J! m2 u. unamespoc_e Core;0 p8 d5 s- ?) S1 e
include '05ou.php';3 }6 z( x3 E4 w; _: z U) G3 A$ g
new \AdminController();! h3 d% X, o" ]3 A h
showInfo();
j1 v# G r$ z$ Z7 I9 {% Z( o
' ~ U) c) x8 ?: J! q5 xecho P;3 d2 }$ Z4 R0 P% W) I
//根空间中的成员,只要类的访问必须加‘/’0 n# q9 a( i, I) }5 f
----------------------------------------------------------------------------
$ l- {6 D4 o% a4 L1 w
# z/ J6 C' }) @3 l05ou.php
# d* _ G2 Z$ E" J' n8 C% K0 w, e<php0 o0 j9 V$ N9 |; E* q. _" t
const P=5;
" B* w3 J" z0 k0 N y% Z) G, w* j7 U- v! I+ V1 z4 t
functio_n showinfo(){
9 ^) J* B# C( q4 H$ T5 c echo __METHOD__,'<br/>';/ V( e- j6 @% F# H
}
3 s; Q* z$ ?+ I; Z* |; ?! Y D
0 ~* f" r/ p' \5 J: Uclas_s AdminController{
) o" i' I: Y5 j1 v2 B public functio_n __construct(){5 U, x) c" ?" v' O7 L) g: M
echo __METHOD__,'<br/>';
' M$ i6 |+ B$ y7 E4 V( _ }
: ^; L" H* _9 ^- r& s: B' U m}
. a( f5 L5 J/ S" N: C8 I1 Z! l) T4 j8 g/ ]. J- g' f r' G8 b
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
# p3 M5 @+ a. S& `1 Z5 f) @' G----------------------------------------------------------------------------+ x7 h0 n0 e. z6 U$ b- N% f0 j4 [8 s
04inc.php
5 y0 [- u$ e1 n) M1 D<php$ }# `5 q* I+ L/ j5 Q0 i9 Z0 Z4 n1 F
1 Z D$ K; z3 a# r+ V; t
namespoc_e Core;0 H/ m3 y" {# B5 w% F
include '05ou.php';
2 D( K) t! ?' Z/ Lfunctio_n showinfo(){* z9 a a9 ^7 w* k+ C3 Y7 {) K
echo __METHOD__,'<br/>';. q p. k; e! j/ h( j6 L$ B. I) ? Z
}2 c* r. L5 M0 X: G3 [
8 {$ h8 r( a6 k* v# r, o$ f
new \Controller\AdminController;
) M1 ^3 }& U+ \" F----------------------------------------------------------------------------
1 h7 f2 w2 M# Y9 e. |8 _( X05ou.php
0 |( O$ f7 L; \8 e) Y<php
+ w) ~* g' M( znamespoc_e Controller;/ V6 T3 j. O8 A) x: {) d
2 O h! z5 H- A$ Q" y
clas_s AdminController{
( h2 B- Z. E2 m ]- r public functio_n __construct(){
; m" i2 C+ W$ O' V echo __METHOD__,'<br/>';
' e {6 ^1 [/ K6 { }9 V2 g: O% W% o/ L* N
}
2 X' D: a3 N' Y" ]: O* N1 n* X----------------------------------------------------------------------------
$ f: I9 _3 x$ ^; C; I4 I3 s& g6 m3 \% R1 d
4.引入空间成员:
* s, G' }: c- k7 }
: a. G8 t/ k+ K5 s1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
5 m/ I- H. O) b
$ A9 d: H* y- s! i8 i----------------------------------------------------------------------------
, h* @$ A l" p2 F2 _
+ L: j K4 Q* u" H' \. a04inc.php
2 Y4 w% V) f* j) e' c2 X<php
0 o5 d* `8 c8 ^: Onamespoc_e Core;
' r! a7 E5 \6 E0 quse Admin\Controller as con;/ J f3 p& }. _
8 }. E1 r3 f3 b& G2 j8 f u
include '05ou.php';
6 X7 ]" O) Y9 N% ], y- i* i/ S
" E9 L: E* H* @: dnew con\AdminController();
! D, b, \' @% k& e& c3 n! C) m----------------------------------------------------------------------------4 P% I8 b1 v0 o0 e: f
05ou.php/ ^7 I2 ?# u0 K9 c5 L/ u4 F
<php7 q5 l+ m/ g' @3 u
namespoc_e Admin\Controller; b; @ p& r4 u" Y* m1 q
9 L+ z8 C& [- M) i _' V% \8 Q
clas_s AdminController{+ P2 g1 c9 j/ s% S3 ?* Q
public functio_n __construct(){
4 _0 V' g3 n: H. O. m6 B echo __METHOD__,'<br/>';: k: Q% u; `$ f' @: f7 ]
}
* U! E2 {7 X j7 l' T}1 w3 _& K. G. S* o2 n6 H% u- E- p
----------------------------------------------------------------------------
/ }' ?: y% |+ x3 }2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
2 x3 k$ I( F* Y; q' q9 M* W$ c, v9 }
----------------------------------------------------------------------------
, c& @( U; { {# |4 F6 @) P" p! _9 h$ R( a
04inc.php
- e8 g& R- b, m9 [/ z- o$ K: Z! |<php9 d: s, Q4 l2 f8 x$ c! u1 h) G2 p- z
//引入空间成员类- E' N8 v7 p( n
! Z* S- D3 j' w: _7 Jnamespoc_e Core;5 ]6 ]( a. v# ^
use Admin\Controller\AdminController; i7 a, P2 G; R4 ?9 P9 `1 @# n
include '05ou.php';0 R/ c/ e, E- m
0 c; m& N8 u0 E" e
new AdminController();5 x: q& ?- g" _* X6 X0 r
----------------------------------------------------------------------------
" H! r3 _0 \: @ b4 X5 Q3 x05ou.php# j- X- b6 w1 b8 ~* T: q- v
<php
. G: ^5 d( p, Y& ? O1 gnamespoc_e Admin\Controller;
1 c5 z' {/ _, M, Q7 x
! Q9 g {4 {& l3 \clas_s AdminController{
, J/ d* j% }& p( P0 J5 ^' J/ b public functio_n __construct(){" t5 K: F t9 t, b
echo __METHOD__,'<br/>';0 u* f; p2 d; t! L3 J* {
}% g. D# f# h9 |0 |8 q! h- u' K2 u
}
# w# J; y9 |3 a1 Y----------------------------------------------------------------------------
" k4 h9 Z5 }0 k$ ?5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" F/ {* A0 ^! {) P1 t
; B4 ]" E3 k0 c/ [5 m9 z# B1 } t
8 Q8 [* f# ~5 r/ G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
1 Z! ]0 O2 T) q5 D
\/ \6 V" }; X
) d: D: w% L' A8 V8 j% f, K
/ e9 D: v) N& x9 P( H
$ L9 m5 X& e" O
; M) o( x) I' Q0 B# h: p4 f+ Q G# ~) k
|