1.命名空间的作用:* P$ K: K: o8 u1 \
# [; g, d/ o8 Y( {在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! |0 h. \5 o' e3 o: h6 P' Q- f- Y `
9 p; q( u+ a, M" y1 q2 c
8 Q/ h2 Y5 K1 N5 V! M% N8 }; p' m
5 ^1 L( u8 w# S. B ~7 \+ ]* w我们来详细的讲解一下PHP中的命名空间: A/ W Z& M8 _3 v# L" H# M) T7 \
- n3 v4 Y( R% i; h+ g' G语法:namespac_e 空间名\空间名;
7 P8 _8 A, n2 c6 I' K. N; ~( D2 o; k- h3 @
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
6 c: x6 Y, z* j$ |/ ]1 I5 K- K% ]4 S5 `
----------------------------------------------------------------------------
8 o3 y8 s; O, }) Y/ S, p8 N# ~' J3 e+ ^/ u$ _! e$ f9 H' [9 C' B
<php
( Y3 i2 |( P$ K$ H$ S, i. f0 H, m4 V% x; W( t% g
namespoc_e AA;
6 q5 g3 h5 Z) Y9 P$ S' Z1 pfunctio_n showInfo(){' ^4 D0 `9 H& f# |+ |
echo __METHOD__,'<br/>';' s# W6 J: {- R, B; V$ f
}+ z. O; `: A, m
showinfo();: U& d6 L4 v/ @: Y
( x% k4 g W N/ T0 }& ^
namespoc_e AA\BB;8 t7 `" z$ m3 g
7 Z+ {: t w1 F$ cfunctio_n showInfo(){* I5 w. |1 N! ]+ e
echo __METHOD__,'<br/>';* b, g, q) U3 I3 ]/ n
}
, A: G6 U2 k3 @: @2 d) O- f7 t9 ], a//showInfo();
4 C: m' J J7 l6 J' ~9 A) M----------------------------------------------------------------------------
a! K9 \8 z6 h+ G/ d: S0 |- Z" y2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)/ Z+ Y' b2 L/ t# {
T6 D+ o* L. s2 ]+ u( `
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。) |; P8 F9 a0 m
, v; X8 ~. J$ q* x# p4 L9 \* Y----------------------------------------------------------------------------! j/ _. z# ^: w9 @/ ~8 ?' [- ]
1 t/ U$ F6 W0 J5 G1 T! A8 _+ [3 B
<php; w0 {1 l0 i. ]3 y2 `+ H3 H8 R
namespoc_e AA\BB;) s9 ~" ^3 j! [, t7 f* ]
functio_n showInfo(){% t$ `8 g% P+ y& c; u. } }
echo __METHOD__,'<br/>';2 y. L9 F' o9 F: c/ x! w% C( A
}
9 d6 X+ {- e% K. h0 M. anamespoc_e CC;9 M. ]( C! c8 N/ [
functio_n showInfo(){) w% Q4 |- O3 i- \' X+ }: w; d4 [5 e
echo __METHOD__,'<br/>';9 w( l( V% C+ a; z7 H& ^
}
$ v9 }- q; p8 k$ I7 @namespoc_e AA;# N" B5 O& \" ?7 o4 x
functio_n showInfo(){) v3 h/ M: h c+ p- k5 I
echo __METHOD__,'<br/>';7 l3 o: s0 N: C% o
}
3 C; r- h7 X4 \) z7 r+ U//非限定访问:用于访问当前空间中的成员' y, F! ~$ ^) E1 K# L8 D
showInfo();
+ h. l* n+ o- P1 M1 G! z7 o//限定访问:只能访问当前所在的空间的子空间中的成员- w1 D6 B7 I6 A4 t1 D
BB\showInfo();
, O. }1 p& [7 @: [6 E6 Y% B//完全限定:可以访问其它所有的空间的成员6 O5 _& |7 C6 W' M# f O, H
\CC\showInfo();
7 E u: M6 u7 T$ E9 P↑根空间标识符
9 z- |) F6 p' L----------------------------------------------------------------------------' h% `/ u Z1 w. E* P/ E
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
4 }# t/ k, \1 o( n/ i) y3 ]& {, M0 C8 h; D/ b
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)3 t, D2 @% v4 C& x" L9 r) m* E9 ^
: n& n$ g1 |. [5 \! L6 x0 D代码示例如下:
. S1 [0 |' q9 v& N e( l6 X G. h6 J/ j7 Y
----------------------------------------------------------------------------1 d& D! d! W3 m5 |
2 P, G# |) V* r; a3 a+ L6 c
: q: f5 c" G9 |1 D2 M7 a% C04inc.php& ~6 k: ~# X9 g$ t9 z; h7 p1 k8 U# D( L
<php
1 J. u: V4 b/ Z' u( g6 e1 n5 H6 }' @
namespoc_e Core;
1 t0 j! F1 j1 Hinclude '05ou.php';
0 t; R0 e3 f4 ~% t( [% Fnew \AdminController();
8 J% X1 T8 J$ VshowInfo();
" m4 T" Y7 I6 Z8 C9 d4 R: X+ N* e8 K! f) L
echo P;
. Y" W+ A H' _* n! g C" I# U+ `//根空间中的成员,只要类的访问必须加‘/’9 W# ?: m, o' s2 p
----------------------------------------------------------------------------, t6 ^' E% `+ v2 G4 W9 J& N* \
+ i* w' b5 d6 z( F9 y- A
05ou.php
% m) ], C3 z6 q# e<php% Z4 c8 ^# p( F9 r( Y$ u. ?
const P=5;
$ p0 W" O `7 j* T& T, J: E6 Z( }
functio_n showinfo(){
/ G6 G9 A: X# C/ T- c7 a9 i* O" \* { echo __METHOD__,'<br/>';4 ~/ ]7 p2 ^# Z; Y. A
}$ ]( T, M& [: r. I! e
2 j. Y5 a) j8 d# O
clas_s AdminController{
/ M/ d0 B) M% Y public functio_n __construct(){
! u4 ? S9 n4 d- | echo __METHOD__,'<br/>';
% P8 z3 D( D$ f }
) x; M- W( T" ]}& x+ M# d% n8 b( O1 u2 N/ j
" B7 ]+ q- o8 h" ]第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。9 C z9 ^/ m- |# f1 P
----------------------------------------------------------------------------
# @8 s0 K/ Z- Q9 U7 z04inc.php. S/ |! @6 e: }6 c# A. C* l
<php7 h* Q2 ], [* L0 H8 x' G- q2 r+ |
& C, j, y- m, K0 B, z
namespoc_e Core;
# u; i. l. J E* |8 Minclude '05ou.php';2 t6 r% O* M1 }2 i
functio_n showinfo(){% f8 e9 X+ p5 b: Q; a3 ?
echo __METHOD__,'<br/>';, ]/ S- A1 L' a$ a& ~: ]
}3 Z7 }% |3 v$ P
+ m- C) h+ K2 m& @1 X5 a& o- y. O% Onew \Controller\AdminController;
: }& z6 N! d" v7 s----------------------------------------------------------------------------
6 X2 l6 h% g; f% p9 j ]6 L05ou.php2 e% L- Q& [$ J3 X# x
<php
, {. j4 L* M/ F: f6 w. K7 ~$ onamespoc_e Controller;0 A; m: j; A7 X/ U# e
) x( K9 z2 U6 i7 ^" v: U; x
clas_s AdminController{
) P: v5 b& D2 d* e9 p4 J0 n- C% L public functio_n __construct(){7 o4 D- w! O+ n/ b7 n1 ^
echo __METHOD__,'<br/>';' _/ g6 A7 u- H& J; n6 C! t$ s! S
}
+ L; r+ [+ B+ W; y# o}8 [+ {- [: r/ R7 B
----------------------------------------------------------------------------, _; f, c1 _) N! L
. u+ E6 t {( {+ w: ]& ~' i
4.引入空间成员:
; P- r: H+ k0 p2 u8 a* G9 H- ^( Z5 }% A- D0 X
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。+ z8 l3 N7 N y
@- c; U' j& K0 s' o% r6 ]5 Z% p
----------------------------------------------------------------------------( C/ F2 o6 O- m- [& Z
4 @( H/ X* R/ I3 f% {04inc.php/ ?! W7 B$ `' R5 q/ A
<php
5 q7 \4 `* C" N, Q& B' d- Vnamespoc_e Core;( V, a7 A: k! Y4 {0 R
use Admin\Controller as con;% d: h8 R5 {) ]& E" N6 y" k0 i/ F
* ?4 q. Y7 p, z0 {4 e
include '05ou.php';
( y% C O+ c% A$ V7 a
p5 g9 K5 n. [, n* Y* Qnew con\AdminController();
" G$ f3 U. v. z7 c9 ?. O, r----------------------------------------------------------------------------
0 q0 P. D9 l- K+ k05ou.php# v" a$ Q& s" b# ^ S
<php( k8 }. m; |. W' N" f1 X/ q+ o
namespoc_e Admin\Controller;
* U( K/ z" c. z3 Z: R- ]% q
" ]& x Z }" }clas_s AdminController{
' c0 H# F/ _) l% d7 y public functio_n __construct(){
# ]' N1 R! e7 v/ y echo __METHOD__,'<br/>';' g7 w- p- S+ g
}5 W5 |: {; G- S/ Q7 e$ D6 I+ d4 A
}/ w A. M* O1 g$ V r! Z5 c8 _5 ^
----------------------------------------------------------------------------4 m9 {2 o4 t' C' `
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。& z" C3 u0 _# o# W% ]
/ k: f0 c# o6 l/ t& X8 h7 o0 J
----------------------------------------------------------------------------
) R$ Z% X' u' k; K
7 ~$ e! B2 c2 ?4 ?& K( Y% K; G/ Y04inc.php
/ k" m- c; {/ n<php
' x) h( T: ]8 b! L# T+ g//引入空间成员类
( Q) ]7 H& v. Q! J% o% R
9 M5 }* x6 o% h9 f* y: e1 anamespoc_e Core;
5 j7 j/ K9 h/ Guse Admin\Controller\AdminController;# p/ Z1 M9 a9 a6 X6 [
include '05ou.php';' i3 g# y! i3 \; W
# ?! M4 F- ~! j/ \2 }/ u
new AdminController();
, S, I3 a& g8 I9 t, Y; U----------------------------------------------------------------------------: }5 ~5 E! ?0 n, r- r
05ou.php
T* l2 [7 J& G) f<php7 m+ t+ h5 a) C$ j( U* G! V
namespoc_e Admin\Controller;
9 F5 z0 H3 z5 w8 g% H% h9 @. t- T* |% f9 d! I& n8 f; ]
clas_s AdminController{* X4 Y2 T- N9 Q- n, ]: A, m- K
public functio_n __construct(){) C3 j! M. s# G! _- s5 P, m
echo __METHOD__,'<br/>';
* T' |5 |8 N$ n2 V$ a) e0 c }
: E5 }' V* _2 s% D) w& b* b}, V; E, R; }6 L7 q
----------------------------------------------------------------------------: j) a7 |+ `& @0 ~$ l3 D
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 P5 E% _ i* _8 l- ~9 e+ N
( a* K5 R9 O# Y" H
- }1 E0 L/ z* W, A这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
3 i' j, K. I6 ]/ j `! {% D
/ J' t8 W4 L. C1 v* _( v
% L# w. |3 y. Q$ ?. I
0 H/ ]" E' O' a0 E( R/ ?0 n( ?- K0 G- x
9 M4 m5 m, D/ z
" p f3 W# Y( r: e0 `: G |