管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
7 G' ^" \) v( d! [) p* H' V
% U: t$ {5 \/ ~在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:2 L+ y$ _ ^% C, ?) X- ~$ H
* V& ~9 A) D$ m F7 _3 r
d$ ]0 Z8 C! q% k% ~1 `& L a+ q
" w, w: }* [$ M6 T0 R我们来详细的讲解一下PHP中的命名空间:1 Y% f' Y6 }- q3 m' `+ t3 _: e$ ?
# l9 A, C) T, Q/ k* }4 }
语法:namespac_e 空间名\空间名;
9 U9 c* z _+ X' L# b/ ~# P" j
0 A& f: q* s7 ?* |; {( F说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:# d- a$ j0 f' c1 a( B
! l4 P. a/ X# M3 {6 C, w" C
----------------------------------------------------------------------------& x3 D3 _. p! v9 W) n# `3 p
# A B9 ?1 ~) @$ J& e<php
8 M1 C- C3 { J/ f0 Q& L: x6 A6 K5 m( a* h( w! {
namespoc_e AA;& r6 c+ t/ F0 H$ u4 w9 Q
functio_n showInfo(){: t% ?, D$ \+ h
echo __METHOD__,'<br/>';9 B! s j: y' G7 l( Z& }
}6 I0 y' N; r3 S* s5 K3 I3 ?
showinfo();5 p/ g' J7 a, X5 S9 K3 I$ j
, u6 L1 b6 Z; J$ u0 b
namespoc_e AA\BB;
$ s1 X0 }) ]5 p( i% U/ a) C( O
X8 _% S+ |9 c$ D6 o4 Xfunctio_n showInfo(){, Q$ d7 t; j0 @2 |( ?
echo __METHOD__,'<br/>';
- m, T6 m* X; K! C$ Z( a}
8 v) x1 U& a- I3 q" t. z* o& m. `//showInfo();7 X) }4 ]1 I0 A
----------------------------------------------------------------------------$ Y9 P9 C2 ~, L7 F
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
) @0 P8 _% w9 F- ^0 {% p2 M% T
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。' X: D1 a0 P2 `! r
1 Q9 P% l$ J- L w0 ~( @5 y, O& l
----------------------------------------------------------------------------
* `7 ^! f/ T! j4 c! `( P% Z; V9 n6 n* Z1 V
<php
& F+ Q6 n/ Y" F/ inamespoc_e AA\BB;6 c0 j9 h0 F: W& Q0 `: D
functio_n showInfo(){+ `& ]2 L" H2 x# L* s4 Y
echo __METHOD__,'<br/>';: Y1 w. I5 u5 O- }; Q
}
# H( P( X1 I' L" w. inamespoc_e CC;% Z( ^" ?9 M; u/ f& V1 f
functio_n showInfo(){1 P" o$ e0 B! i) d
echo __METHOD__,'<br/>';
& T' U. G3 g7 ?( v* E: G6 ?$ Y5 e" y}
8 k# I2 z) x% H6 mnamespoc_e AA;
5 F/ Y( y$ Z' V) _functio_n showInfo(){' N7 b( A$ Q& \% T, V
echo __METHOD__,'<br/>';
: Y" k& `! y0 v- a+ ^ D* `}
* `/ d F* G2 |//非限定访问:用于访问当前空间中的成员0 F& @- N/ N8 V$ v$ w% ^
showInfo();7 E$ j2 Y; }; w" [& A. _0 w& v
//限定访问:只能访问当前所在的空间的子空间中的成员. {. r% U! o; m
BB\showInfo();
/ W+ x) K2 |* U8 O0 _1 t( Z: v//完全限定:可以访问其它所有的空间的成员
8 |, |. x/ k9 h1 D\CC\showInfo();! Q* s* c9 Y4 C
↑根空间标识符, T& e G5 R$ {* a2 U) I
----------------------------------------------------------------------------8 E" E" v- y( p k2 f" n
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
7 d; k7 ^" n7 i$ R( s8 W8 t
" F& g* k6 |) B当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
- W( |; g2 z6 m* b& p# e) j* g( s4 H, r) _+ X, j7 {
代码示例如下:# ~: M, K& A) X+ w. D1 U
8 C" g( N" \5 L( p/ P% j----------------------------------------------------------------------------
& c1 Q+ G5 D3 y2 [! }+ [# i, |% d) N0 W+ W
0 [0 E [" F0 F& ^+ l) ~04inc.php0 P$ V. X+ V0 L0 k! S+ b) A
<php
3 q: a1 {! z/ w* p v1 \. U9 ]& {; Q8 u
namespoc_e Core;
+ G3 |/ ^7 P4 Z# f9 Minclude '05ou.php';
& Y# \, L/ W r( Jnew \AdminController();
% t7 J6 p' H: @showInfo();
8 K: e' }; l# m1 B) f; O: ]6 U% Y' K5 Y+ C2 [1 i
echo P;
0 D' D$ k9 u" ~2 s//根空间中的成员,只要类的访问必须加‘/’1 y7 P1 g5 T5 s t
----------------------------------------------------------------------------" Y* g. p3 Y" _9 O8 q8 I8 y
2 m2 \* j* }, M4 `1 c- S; z; A05ou.php ~4 E9 m1 v. ^; Y" H# r
<php
E2 D F" |5 M. l/ X7 ]const P=5;3 v) m6 f. k8 }+ M! h# f7 \: m
, u' D" H0 h1 vfunctio_n showinfo(){
$ l3 P' _# {) p2 ^: b o- S& Y6 N& Y echo __METHOD__,'<br/>';. {$ l- ]% g7 o3 ?! L
}
1 q3 \0 G% z4 `6 l4 P' U' D6 Z
1 K/ H( y7 e' [& bclas_s AdminController{
+ l# g( V& V0 N+ Q: [# X2 J public functio_n __construct(){
' s$ Q( l( B8 k! E; U echo __METHOD__,'<br/>';3 @4 C0 ~/ X% e2 K. b
}. E8 {' F0 f; q9 Y0 H2 J& i
}) u& q% ^* w- Z+ V/ z
. t- ^. v) v' Z6 k, C5 _9 v
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。3 s" ^4 ~% C& v* v$ s# A1 _' \9 h
----------------------------------------------------------------------------. `: T; a8 E& I$ h
04inc.php
6 |) F: ?1 a1 z) R. M3 M; C<php- D, g! J7 F: X8 m% W7 N
$ M/ w5 ? f4 z S# w, j2 T' S; V
namespoc_e Core;6 a. J% L0 _1 c, p$ R
include '05ou.php';5 f6 P; E% X; E0 F* B
functio_n showinfo(){
4 P6 i; p1 _9 u echo __METHOD__,'<br/>';& e. o" j$ ?6 V F$ w9 X! t" T
}
: k' X( L, I/ S$ m& O" t+ f5 {
: O3 i. z. t/ o8 ^& A2 Onew \Controller\AdminController;
1 z& o) D8 A; U4 e4 L+ m v* a' q( p0 f----------------------------------------------------------------------------( K! L2 a% o% J; @% V
05ou.php! z7 l2 m0 x0 M- ^0 b: v- ?( v
<php) ^2 _$ T1 g& V& w
namespoc_e Controller;+ J7 B" {- L# t, ^
% ~5 P. C! n( k& Q( [/ p* p
clas_s AdminController{
) g. ^8 @1 g' I6 x9 o- D' D public functio_n __construct(){
0 Z* \: k' Z h7 F0 ? echo __METHOD__,'<br/>';
$ H/ g" ?( @! p }
" ^/ S' {$ C3 P/ \" l}% @4 v) K" _9 P& J9 G
----------------------------------------------------------------------------' o7 X5 ]4 D# M" t0 J' b+ B
% e, H3 h# _; g b; I! I4.引入空间成员:
- \; _9 c& i7 Q3 t; X
! Y. f& K& H# c. ?; @1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。. ?8 J m! I( A5 ~
( U' ?/ d2 {; V- ?+ G
----------------------------------------------------------------------------
6 H4 C. ^. L' f2 n7 A% j- D+ ]' x3 G# p) b9 L- ?
04inc.php$ D5 V4 H& R; b
<php; n& @3 s% F+ L; V
namespoc_e Core;* I& _2 j: a& o: V. t. o7 Y" c
use Admin\Controller as con; r7 a! A* w+ z, G
* b; m- j7 G5 `* f6 G6 p
include '05ou.php';
" P# H! W+ J5 Q. t" r4 F1 a3 F. `* ]7 M! E* n5 `
new con\AdminController();3 v, R1 C7 Z& W! Z
----------------------------------------------------------------------------
; `) |+ ^% t% L' [- x4 e05ou.php
: E u# O+ ]! g+ s; d4 O$ x: @) A<php7 [2 P- C) W O4 m) K- q
namespoc_e Admin\Controller;" L( b- A; U8 V4 ]- |
2 ]* w# P! ]5 B9 A+ U, z+ |
clas_s AdminController{
/ f5 u2 f6 }9 g public functio_n __construct(){
. q v0 y' U% ]& U9 Q echo __METHOD__,'<br/>';$ e' C) B9 A7 S1 O( P. |
}1 w! n0 u; g2 S; U- o1 m$ r& w
}
5 f. C- c1 F/ }1 ^+ \5 m" V----------------------------------------------------------------------------* o" ^6 l6 m' v/ t3 T6 S
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。2 n# M5 e6 n" r
+ c0 w- h# n! }. g1 E7 A" K----------------------------------------------------------------------------; V4 h* k) P% D4 k
* J: ]3 V, W; ~. |% ]# v
04inc.php
/ Q7 G9 m: e! K<php$ U/ P3 T% K; H6 r, _
//引入空间成员类
1 g1 P, B0 a; O9 v9 L) `9 @0 i, I
namespoc_e Core;
% I% G+ G" L' k Huse Admin\Controller\AdminController;
: V6 Q; E9 a4 Y0 l4 dinclude '05ou.php';( C* b: ?" S8 Y1 ~1 ?
- B) a+ Z2 o* c9 n, y" dnew AdminController();: z% k6 ^0 [7 f
----------------------------------------------------------------------------1 Z Z' _3 R4 S+ P" H5 H$ Z
05ou.php
5 h7 H7 O7 f3 L o6 H<php
0 n# s! _( V8 |namespoc_e Admin\Controller;
- \( ?: y& I) b* ?: Q7 ^7 x; K; h7 s4 M. g
clas_s AdminController{
: Q. D- D! I: F3 V) B public functio_n __construct(){
, _- R# [2 P" _! l, |0 R echo __METHOD__,'<br/>';
3 y- ^& o7 H( g# c1 T* Z }% q( d; v% D7 ]6 I: [+ C
}, }8 @) _. ?+ ~6 s+ j, s
----------------------------------------------------------------------------
3 U! F3 @ x4 f9 m# _0 v" I5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
. f, @0 B5 h3 d0 ?. Z/ x) u: A- y
- ?" [, G @$ U5 f' W# B5 g% c( l+ ?+ @; u% Y8 _- s
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
( q/ g+ t2 M$ y" U8 C
$ g8 W6 A& m }! _) T
- z6 Q5 S; M& W/ r7 ]4 V* e% N2 T1 E$ j O7 B% \
" K, P4 c' T! e
' V5 x8 |$ \; o' y8 ?8 u
8 c5 {( c7 _2 m, J$ r6 v7 V |
|