管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:! [9 @2 O5 P* W( t3 C
0 K2 @* ?; g5 X6 n! J& Z
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:" t" h0 j! [6 k2 |! t
) b7 e8 v8 I7 D$ q
8 P; S$ L$ q# b+ ]* `9 ]
% d9 N" T: I* q" I' t5 ?我们来详细的讲解一下PHP中的命名空间:
1 M9 {9 O% T% J! E$ F3 M& m) g2 b( u' i! O1 s7 L" q
语法:namespac_e 空间名\空间名;
9 P6 M4 f" q! m' }3 E- p- ]& h
5 s' a' x- I1 X2 {$ l- O& y说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
* v" h* u3 [& F( P7 [' y5 K* z
( Y/ O' ?9 }/ E( U----------------------------------------------------------------------------3 k3 V0 Q# M$ S/ N
, j# ]$ X$ h `<php
) p- Z6 Y6 }" p7 ^5 _) h; p" k8 A
namespoc_e AA;9 ~- U9 _7 m$ V( M% D5 W" O
functio_n showInfo(){) D _+ H4 G* O
echo __METHOD__,'<br/>';, l$ _3 ~4 k" ~: L
}
5 }6 {' M2 ~" B6 b9 ~showinfo();2 r3 y8 t; T+ v5 _$ m) S! @
$ t' c; j+ A' p, |# b) H2 n" T
namespoc_e AA\BB;5 z# q, ? A; v) }/ }
+ `" P2 y, A. jfunctio_n showInfo(){ D1 e- |2 {+ A$ j! B1 {3 q, }1 b0 n
echo __METHOD__,'<br/>';
, z' q- e ~( E8 _: F# p4 o}: X1 l) I% K- e9 @2 u/ f
//showInfo();- H' F2 j7 k( p' j) c5 d
----------------------------------------------------------------------------
# [; P! f- D3 |7 P# U* c& p2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)( ?) j6 a7 V5 {& |2 F5 P& d% ~# ]' H
5 _ U8 Z `9 r5 e% J# Q$ O5 `
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。7 N5 g# a6 V9 R& R3 l$ y7 {! }! o
+ Y8 s0 C- F4 U8 T
----------------------------------------------------------------------------
$ d* ^/ m. L( j# P0 E
$ A, A2 j* z, E$ g<php
# q2 z; M8 [4 U! t8 ^7 X! Y, \) S# {namespoc_e AA\BB;
- W6 I0 q2 `0 d/ ?& M7 {& S: o' Y9 }8 [functio_n showInfo(){
6 Y7 U2 G# J' F, K9 U# H echo __METHOD__,'<br/>';
: v4 |7 J( q6 ~" E/ N}
1 b6 F6 ~( ]4 X/ X0 Cnamespoc_e CC;0 q9 P6 ~9 n- d6 z9 w _
functio_n showInfo(){% t7 e+ w6 `7 F
echo __METHOD__,'<br/>';1 V" a- C) |8 [, d/ y3 E- W3 \& ]
}+ I2 b5 B5 @$ z! a
namespoc_e AA;# z! N0 ` G7 l- W1 k" w
functio_n showInfo(){% f* R& a6 s. N
echo __METHOD__,'<br/>';
+ U- @5 W, \( ]4 k: ~6 b) A( L}
# I1 u6 P' m V& e//非限定访问:用于访问当前空间中的成员
% ?- J" P" H$ f( Q0 UshowInfo();
! w0 \7 ?% I% w1 V! h//限定访问:只能访问当前所在的空间的子空间中的成员
, r! q5 A8 y: ^7 hBB\showInfo();
`* @( G$ L2 _3 v//完全限定:可以访问其它所有的空间的成员 h* o$ }. ~; L$ J9 K! _. N
\CC\showInfo();
! |0 M6 N' Z3 O0 Z+ e# A' }↑根空间标识符3 n: |. @3 `1 v4 ^3 ]/ v) }
----------------------------------------------------------------------------" U! k+ K$ B/ W( g1 r
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
7 B1 a' x# b! H. F% h9 _$ x3 N/ C
9 S% [3 h8 r' I7 T当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
# h7 H8 S, W, p
' [7 f2 }4 o F% i代码示例如下:, `6 @4 s I/ V; u5 X8 u
) R" H4 R3 b+ K M# L5 x
----------------------------------------------------------------------------
3 v3 R% i6 w. R& ^ ]. J4 ~3 J8 ]0 M8 [/ i: n; S
8 o4 f7 B8 x( Y04inc.php
# t$ o; Q8 i2 L; O- }<php
- g, A7 N n$ ]: ?4 s+ _8 m! s3 O; ^6 L% L( S
namespoc_e Core;1 z, C* B- p0 c9 X0 a# y
include '05ou.php';
5 H" U4 t: U3 w7 {new \AdminController();
- s u7 L- `/ T. tshowInfo();
8 N9 n1 K+ [$ K; J( t. M- L+ C4 R/ Y- i$ P0 q; a
echo P;
% ^ s# g8 G. g0 W' w//根空间中的成员,只要类的访问必须加‘/’
6 a# G9 n# G$ r----------------------------------------------------------------------------9 _6 I1 a0 b3 Q) v- M
, j. N. f/ X- F05ou.php
9 F( Q: Y% G" c9 q5 S<php
, C7 L6 [! t2 A/ r Hconst P=5;4 P, u U' P$ }
* n( ~ ~0 y/ mfunctio_n showinfo(){9 S0 q e* r `) Z9 _
echo __METHOD__,'<br/>'; f0 i/ A7 L2 V- \" W
}
9 }7 G8 w2 D) J. f+ c" M3 i4 [8 W- \0 N; ^
clas_s AdminController{3 N4 ?, M/ u- U! M4 `
public functio_n __construct(){" ~- L' X7 A, Y" R! ~, {
echo __METHOD__,'<br/>'; {. t# k6 s, V8 |' U
}9 @$ e0 s/ k$ _5 m- l. }4 v! A
}
% U& b4 r. N) Z, m. d
: ]+ z, u( ?" u3 ~第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
* e! q$ x+ {* e$ Y! d----------------------------------------------------------------------------
% q: Q& X$ T) f. O# V04inc.php
: K! R' G; ~: L<php9 e2 _0 y' q0 q# w& ]
) q9 z, u G& J |* R) j
namespoc_e Core;; `: e/ ^& S. U% v8 ]3 T
include '05ou.php';+ K) K0 i/ C5 h& I% U- W8 a
functio_n showinfo(){8 h% [3 E$ \9 S5 C. j
echo __METHOD__,'<br/>';" {: |0 y# |8 @" j, S2 d; v/ `8 [
}
% G. f2 u0 t! V- w, i. m% g& |4 j6 P* r$ _
new \Controller\AdminController;1 N- H! s# O7 N o, T; O
----------------------------------------------------------------------------
. A3 G' @1 S8 g2 r4 V05ou.php
( _6 P/ b7 L/ H- I- c<php
; |3 D( q0 F1 O$ `namespoc_e Controller;
) g% d- O& ? ]# u* H
) z& G9 [* d* tclas_s AdminController{
) q1 G7 z- n# |/ c8 N public functio_n __construct(){) \1 S+ \0 c6 U* W" g# f, `; h$ G
echo __METHOD__,'<br/>';# `6 G5 k$ b3 W: l
}/ ?. r9 \$ q! E$ Q
}
1 h' Z9 p5 ~: c+ ?! W----------------------------------------------------------------------------
! E% j. v* U8 |% H- B" h: K5 c. @, x2 N( M: g
4.引入空间成员:
+ }( [ O- U7 D' {% |2 d& f x" \7 I9 O$ [& t/ r$ p! t
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
, x$ N* k, |3 j$ q! N# e$ S( z9 m; X
----------------------------------------------------------------------------& K# R+ G1 C8 N$ g' Z# T5 N
: _+ C2 r2 V: `6 o04inc.php9 l/ F& t6 P1 n' G- ?( V5 ~* L- H
<php
- A& Z1 Z3 F. o) Lnamespoc_e Core;2 q! C9 k2 v8 F4 f/ C
use Admin\Controller as con;% L( ?7 q3 c1 y2 ~: [
3 Q& X4 p. y: u, j
include '05ou.php';: k: z9 P# ]) s* }) D Z; _! z$ A
5 i+ {8 |% N: I* ^$ o) ~, c3 lnew con\AdminController();* u( {$ Q; ^7 o; r. H; ~/ b% L
----------------------------------------------------------------------------- p/ F# g/ z. \$ M! B
05ou.php
# a/ d4 j6 s; X9 O<php
2 f4 c: v' j b! m( w" _. B% znamespoc_e Admin\Controller;
9 z+ c, j4 b* Z3 c2 ~8 C2 x3 e G9 A- O" ]9 o1 F
clas_s AdminController{
" ? T/ T! y+ _ public functio_n __construct(){( f2 u- m, S: }
echo __METHOD__,'<br/>';
4 ?6 U- t; z) W: M( E* n }, T1 p% n7 D2 f) q: r7 Y9 D
}
- k( @0 j' c; z9 z, e----------------------------------------------------------------------------
$ ` x1 o# p& q& `9 V3 [! E* U2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
1 \: {$ x8 }5 Y% i; z/ O2 U' m8 Z8 h) a' Z
----------------------------------------------------------------------------
* X9 D; ^4 `0 v. ?. T) ?
( p: ?; T. l' K+ o! w04inc.php9 L, W, Z5 M! G8 }# a+ j
<php
& |9 H1 p1 X; t. L' B//引入空间成员类: g' z) @- M. P# b( s
4 X2 Y' s) H4 \! t% d$ Snamespoc_e Core;" ~+ p# [$ V7 W! W
use Admin\Controller\AdminController;5 Y3 t5 Y: C$ J$ Q% k& l
include '05ou.php';
5 O2 [# W2 O8 E
6 z- v) U z8 n1 c& ~& B- Nnew AdminController();
% a! Z$ n8 g2 t+ \----------------------------------------------------------------------------
6 \5 F, I5 J- M; [0 v# ]4 y05ou.php
* w$ U4 _4 {& t<php
" @& ?8 U* V" L) e1 D4 f, K$ |' ]namespoc_e Admin\Controller;; P8 G/ X/ |, Y
. S5 I i& s1 }/ t8 ?4 V" N
clas_s AdminController{
3 j- `$ a5 z) j9 |) P/ A, M public functio_n __construct(){
( b0 |2 u% F9 e echo __METHOD__,'<br/>';
" U' Z: b1 y% z' k; G }
" K/ z7 S" @3 D, D! f9 Z}8 L- `& |( h8 q+ M ~- \
----------------------------------------------------------------------------
" u2 E( R/ V& @6 Y2 @# m: Q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。2 A9 V. d) G/ `5 l# Y
, w4 a, H1 M/ }: _/ f6 ]
: |' Y9 \7 j! J2 q! Q这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& w/ d0 `3 }. Q3 W. z
2 V/ V. R4 _& \# T
/ Z2 b+ Z* i! M m1 F: ^' a& D0 ^
1 M* G* p% l- u' }. D' h! G* r& t# U, `& I2 O8 b/ @9 c$ v/ {: U. [
+ y1 q# `" _ h) _9 G
- }9 s; [9 t$ W% c! \) V) K
|
|