管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
* S- X7 n) L3 [- T/ }# z" X9 u; p- Z3 S$ H7 H/ R$ b0 _2 a( Y" I
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:( U% t4 c4 ?" F1 @7 Y# C
+ i/ h$ M7 x6 R: a+ a+ l$ w! f
3 J: `9 [" p. W. F4 V. m9 t! E# h) Q. I1 p6 \
我们来详细的讲解一下PHP中的命名空间:0 J; L" i) f. l5 N7 m) ~, B- Y5 I
# k/ ~2 N& F* `( H语法:namespac_e 空间名\空间名;
n6 B0 a9 ~ s/ e- o! \7 Q; j0 D1 o& ]8 q; [. s
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" L7 C; _ B/ ^( h7 J* r1 r
8 L/ a7 i, P; r2 \. A( Z$ A+ D4 |----------------------------------------------------------------------------
3 ?6 M2 L( h+ c0 S! s. ^4 L# G, F0 I3 L$ w! u1 X
<php6 p$ s" n. t4 c- i4 K
& ^# L+ j; x* y, O0 hnamespoc_e AA;/ p% }, C/ v# R! X. g9 X4 Q
functio_n showInfo(){8 K( ]- I4 f H
echo __METHOD__,'<br/>';
1 \2 u' @! N" m% r2 @9 Y}7 K9 p) Y" f4 x% s! v4 Q
showinfo();
" ], C; x, M' Y2 ?! V' j* O9 d5 Y
$ `: E! y# `% k, b5 Z; [0 Inamespoc_e AA\BB;% J+ \( @) l; J9 y8 e
$ B! p$ ^) k% ~7 P5 R" y. X# hfunctio_n showInfo(){
2 K" o* ^/ g- Z3 V* c2 w" F; ~ echo __METHOD__,'<br/>';
/ a$ A& _( g) t; m/ B4 U}
. `! N: z# x! H# ]2 L. I//showInfo();
4 o# W, D& g+ F: B4 a. ^3 }----------------------------------------------------------------------------8 J/ C2 M7 n4 w: r- m
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const) P8 Y5 S! m' j' [2 c/ v5 } v' y* X
# d) ~5 ?8 U& `; i0 [# @7 N3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
7 i) T5 D" e7 a e( E' l5 \
. _& n9 g+ K/ L7 l----------------------------------------------------------------------------) E$ b, X* }6 U
: ^0 `% d @2 A; f/ y<php3 R$ E+ c( s8 Y3 a
namespoc_e AA\BB;
7 i. [$ M( H+ D9 T! S: y+ k7 m- _functio_n showInfo(){
3 W" a' P& ^8 F$ T5 R. o0 w# K echo __METHOD__,'<br/>';
- ?9 i0 H/ f9 O; e; y: O}# d, s/ x! G- L8 p. }* }& m
namespoc_e CC;4 T7 ?- d W. T& L, c: e
functio_n showInfo(){3 u0 ~0 M6 f: Q) r4 h& C. e0 p
echo __METHOD__,'<br/>';
0 c- g3 z. c# f% r5 A" ]6 L}
! O* C6 M, t3 L8 Jnamespoc_e AA;
1 ^( r) [( |5 Mfunctio_n showInfo(){$ f0 u! @1 Q+ {; g0 o$ I. _
echo __METHOD__,'<br/>';7 m0 A* t! v( z4 M2 J8 O
}
- K+ f" L8 X/ y//非限定访问:用于访问当前空间中的成员
3 g2 W( |# l* G {showInfo();5 n; C& R7 h- K1 \. E
//限定访问:只能访问当前所在的空间的子空间中的成员/ {2 c6 o" D! y# K# p
BB\showInfo();; b$ Z9 {7 x9 C
//完全限定:可以访问其它所有的空间的成员/ b$ U' ^, Q \6 Z9 h8 {
\CC\showInfo();
$ \% |2 r4 ]6 j( C2 V: E! I↑根空间标识符
+ ~/ O0 D% Q4 U; a& T# T- W----------------------------------------------------------------------------
, Q, h; Q* l, w1 C) J但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:6 M9 I1 Z! K% e
+ v% K! i' m6 H, J当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
K1 R/ P$ f& h3 N& a4 u! Y
5 O0 _5 g9 f8 |6 a# j! R! I代码示例如下:" T7 S' r Q1 m4 q# V. T
+ t' |: l: [" Q, N
----------------------------------------------------------------------------0 S+ T4 w& D$ |
9 N5 \3 L% {! [# ]) |- J7 X: Q
7 | h; h4 }# y; d* j04inc.php
, ~4 }; i0 V K. u5 Z% s2 \+ {<php/ S3 R" \5 o- |1 {1 V7 s/ S
' O# L: y; Y2 b, ]
namespoc_e Core;
* W0 q( @4 e: jinclude '05ou.php';
& N- Q) F9 u* L* f% G( l, `new \AdminController(); ?+ O% r ]. J
showInfo();
- m, m% @8 p6 w
: J5 Q0 F; u. @* v# T9 v) q4 W6 @echo P;
0 V# w" s; }% L/ O9 m/ E8 g# F//根空间中的成员,只要类的访问必须加‘/’
5 V @, J. _3 V h2 N----------------------------------------------------------------------------' l3 p& e/ z' ^6 U4 I
5 B4 Q2 S5 W$ u05ou.php
' E: r [$ |0 H4 N! X! ^<php
$ W) ~9 M1 B9 E0 H" hconst P=5;
8 h0 S) M2 r: U7 p; \; ~8 q; I* a, F. y5 b! h
functio_n showinfo(){% ]. M) r2 p6 E# N D
echo __METHOD__,'<br/>';
3 d, t: z6 {! X}6 d3 j1 s7 S2 i
' o5 p: h4 ^/ l% K, ~9 V4 q9 e% Xclas_s AdminController{
& t0 h1 C" x& [ P+ S; p8 E public functio_n __construct(){1 D- j# u7 ?& K" a( C% c* _
echo __METHOD__,'<br/>';8 `& ~2 Z F9 n* t1 {( E
}* b1 H" W1 ?; u) h \! t) g6 _3 t
}
" e! x! X) G/ M- A3 P. u& G# Y; x! R8 W' m. v- z: y+ d+ O' w
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& D( {) F G5 [$ d
----------------------------------------------------------------------------
6 _0 n% h- W1 I" C$ _5 A% j04inc.php( m& }0 w3 `/ O' A* o" y
<php1 ]7 {# ?. w6 K2 s
3 z: n4 q* A* D% n; s* rnamespoc_e Core;5 @2 b* p7 e; q L0 |% ?$ r
include '05ou.php';# ~' m' J5 I( t1 {
functio_n showinfo(){9 x* k- X# n$ M9 ]% _
echo __METHOD__,'<br/>';
* _4 i/ u' ^9 T+ R- E+ q3 M}7 b$ \ X0 {, G: r
" k+ ^/ c# S2 j b/ h( pnew \Controller\AdminController;( V4 n. B* C$ G W5 d
----------------------------------------------------------------------------9 _* Q' F# {, U2 K
05ou.php
9 u( D _6 D1 ~+ a6 S% \<php
0 q' _" i$ [- c- h6 r8 K4 fnamespoc_e Controller;
* S5 a# A3 f% j* G- T' f% V! \* a
5 C( B/ G, [. e. U8 x* eclas_s AdminController{
5 C$ j9 l9 Z. ~. Q, g( ?! e: g public functio_n __construct(){( b" q* { O; B& M, F
echo __METHOD__,'<br/>';+ n6 L& v) q6 C5 _! H
}
' B* u6 c" L( z' T F/ H! V7 m T}
$ K$ n: g/ T7 r) L7 |" E, d----------------------------------------------------------------------------
! g9 l8 u5 J2 L+ N2 ]% k$ X/ u5 Q" J6 r. P" W# W5 r
4.引入空间成员:
6 s5 o6 R6 M) l) D$ I m
* g1 ]0 q; T! C& R( \ U1 i1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
7 P& F* b8 ?. l4 ?4 w3 m6 c( }0 k8 J' {& d# H1 o* G- i
----------------------------------------------------------------------------
$ e$ F( ]0 ?5 y
2 F6 R0 [$ {/ Y6 L# J+ ]04inc.php
& c( d6 O5 H- \<php: b8 g+ o. Q& P9 R
namespoc_e Core;
7 b2 N# _& V: j! D3 L! d/ h% Iuse Admin\Controller as con;
/ @* j# I0 h5 E& C, B' H( D6 Z
& [( i5 C. ]0 @' g1 K( {8 winclude '05ou.php';2 s( f+ \$ v! L# ~1 Q" H+ D( Y
i$ j H9 W; \+ u
new con\AdminController();
; n. J* F$ Q! f7 `% Z+ Q----------------------------------------------------------------------------! c7 i0 `+ W1 H g" D3 i6 ^+ Z6 h
05ou.php
, R5 f; _* e0 F0 V5 U3 U+ X<php
, @- d3 q- R- w* t7 \' b4 Q2 Xnamespoc_e Admin\Controller;* n4 R ~5 v$ d1 R4 J) x
2 m' U. a8 y6 b) ~. N) }clas_s AdminController{
, |. _ M5 y, f! L4 ~ \ public functio_n __construct(){. R! n* l6 i# l
echo __METHOD__,'<br/>';0 v2 t5 c( N; S" C! B2 K
}
+ g$ S' k6 w5 p; g- {" O( K! x}
' E( `& Z7 j. L: y4 y# |* n----------------------------------------------------------------------------2 E8 M3 g) i$ h
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
% P2 [- ~8 s/ \3 ` _% v
( R7 K- A( M' h3 y8 u6 }. t( y----------------------------------------------------------------------------
& }% {' I! s [* h, e( B* X$ ` }! Y2 E$ f5 G( A
04inc.php
: ], t* b6 P- y) P/ y<php- k) s! ]4 Q {# X: C
//引入空间成员类9 W) z! x% [- O7 t
& z. H' k: d4 e' Z. O+ @9 J/ j2 R9 X
namespoc_e Core;" v) N6 Y. H; ]2 u* O% g% q- Y
use Admin\Controller\AdminController;
% y7 [7 l* ~3 k3 }3 x! c% o0 @* ]include '05ou.php';
" L1 X' C% Y& {' z! z! D3 O1 |( m
7 s6 D. S( N! Z- N c* [1 D* \6 W' {new AdminController();
3 f6 P; \# R' ^$ }----------------------------------------------------------------------------
/ f# r7 I% e% G v05ou.php
+ {; @0 x% k# R- L; \% l<php
5 j0 `% ^. @' x @' rnamespoc_e Admin\Controller;; O) X! X7 k3 k
% H* p/ W1 u5 X* L, |clas_s AdminController{
9 q' ~, M; N, G/ e8 w public functio_n __construct(){( t0 e( \& a0 T" U
echo __METHOD__,'<br/>';- d* M- o2 l- l4 w8 e/ w
}8 L, V$ N# ? a3 s" b$ C( @
}
/ r% |9 K6 [7 a' {3 C4 h# f4 T8 F----------------------------------------------------------------------------8 }2 A# A, U1 n2 p
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。$ Z: \8 l# W+ ?' U/ \
8 C# g/ S, R, T, C; L u8 |0 s* Z: v" u2 P1 S# |* r
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 m9 L5 R6 T0 R" k) O( S( N1 V- D* _; M; G' b
d% G& Q/ ]* N5 o
0 S% h0 C( d, h6 _/ x: ]) ^' f
}$ _, p) K, h5 M
4 j+ I; r' |! u, E: f' f$ }7 ?0 r0 e3 X# g
|
|