管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
& h7 g- y* |. g) T* E- o6 D. O
. J" S2 I& ~0 J9 w. s Q在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中: A1 B# c" ^* f5 s! }2 t# Z& z# a
; B6 K8 M1 J6 W) d; h$ D1 m. ^
# r s) e9 d, {* d9 O
o# x& Q- ~& S: e4 ]9 }5 q6 W
我们来详细的讲解一下PHP中的命名空间:
; Y1 N/ f y/ m* ^# u2 P3 m( U# P$ F( Z) X I
语法:namespac_e 空间名\空间名;% Z$ L4 j) M$ H e$ ?+ F2 J! f9 ^
, ?: S% F3 L1 B说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:* ?, ^5 |9 c7 u0 i5 W8 C: [' d
% b/ i* i/ t9 ?; U----------------------------------------------------------------------------+ n" d' h! d9 c$ {+ T# L
- Q- [1 `) r) v$ l2 E<php
7 j5 r' d3 \4 x* K2 u2 |; o5 d7 I6 g& ^' n' k1 I4 P
namespoc_e AA;6 s, U+ L. W) U. b
functio_n showInfo(){
& w: L) a: l! J: a echo __METHOD__,'<br/>';3 t. `: o1 ^* e2 ?; I
}4 P# z5 ~' v8 _+ e) B
showinfo();
% L$ L6 p7 x+ R& G B' g/ X8 l; s3 t9 |* n- V
namespoc_e AA\BB;0 J; f0 i% c( j; Q! e; h
5 p- C# H# W. V! T8 f1 pfunctio_n showInfo(){- O" @$ ]; j- F- D& P# f. G9 S
echo __METHOD__,'<br/>';
( \8 l/ _# C- D* q}" R/ `+ K. A. D+ M
//showInfo();
+ y( G$ b' s6 }" t----------------------------------------------------------------------------
% M m& w" s9 Y2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ X3 R; n+ ]/ W
4 f" Q. E M, r3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
" }3 D% M. ~/ }+ V& {6 v, W2 O% ^( S1 v
----------------------------------------------------------------------------
2 G% Q6 s" t9 M" V
4 E+ ^6 U0 p6 P" N. U# m6 N<php$ b$ }3 o2 x7 Y7 B/ ^. W
namespoc_e AA\BB;* p( t4 N+ q" M$ i
functio_n showInfo(){+ s; g2 U9 R( B8 m6 z4 E3 e7 h
echo __METHOD__,'<br/>';
; W' k$ t. c9 j/ j8 u/ X2 u+ o8 E}
3 `8 U ]2 v1 R0 @4 ]' Vnamespoc_e CC;
& g, k+ z" S# T6 Ffunctio_n showInfo(){
) i/ F8 w/ n5 Q) B% J# i1 i( s5 f echo __METHOD__,'<br/>';
2 \6 T/ s+ R$ u( O5 M}
0 z$ f+ K' q6 |. z, r( cnamespoc_e AA;5 `( s' r# F$ r8 e" g8 K0 m
functio_n showInfo(){. u; q5 _$ H# C6 Z
echo __METHOD__,'<br/>';& h" R1 I+ S3 j& D8 ~2 e
}
3 L9 N0 H) n/ l9 _: |% R//非限定访问:用于访问当前空间中的成员" Q- V) z5 L4 o7 R* P
showInfo();% D1 ]- I3 t0 [9 l! m
//限定访问:只能访问当前所在的空间的子空间中的成员$ d3 ^" p* F' Y1 G+ \
BB\showInfo();
5 n) j- E5 c0 c# h6 [( L3 i4 r. O" ?//完全限定:可以访问其它所有的空间的成员
5 q4 k8 h* v4 b" G; d\CC\showInfo();5 v1 z& A! s- T. m7 D) } _) z- N) B
↑根空间标识符
" p! [$ x# J! z! |' V1 j----------------------------------------------------------------------------; d6 | K5 P6 ~. E
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) L. y1 K* n/ W( n+ ^* r4 i1 S
5 _- F* ^' v# }; T4 m
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)3 }+ X+ d! [6 `5 R2 ~5 H) g
# _7 q' T# `1 i1 g
代码示例如下:
. K( \, m" J1 Y. B) [6 @; `, x) F4 T% ?8 }4 C1 z
----------------------------------------------------------------------------
$ z1 V$ X2 p1 v% p0 ^+ L, Y/ e* r! }* g0 s, E
, E( F. A! ~% U0 v, u) ^! o
04inc.php
! k6 Q! O# C7 k) m) o<php: S6 R6 N) |' q' J J2 F' Y, n0 _
, u" n' ~1 `3 i3 m
namespoc_e Core;
) T( r$ Z$ M; s4 r; d2 Ninclude '05ou.php';
; v2 a) a1 P/ C! tnew \AdminController();
0 R/ m1 k' p0 l u5 y0 U: r7 bshowInfo();
2 Y S& [8 `: k" ]+ ^# b" F$ r) ~9 I3 w% Z, c
echo P;- \5 ` ~" f8 B( {# P
//根空间中的成员,只要类的访问必须加‘/’ b( }& J9 V `5 Z
----------------------------------------------------------------------------
! o/ q. \) Y8 \0 b' j
" T# X; `+ a$ y05ou.php
" N2 A$ @" N0 S; l3 [<php% l. m* O6 ?( l
const P=5;
& Q0 n: Z$ `* f, G: N/ |) d/ F# e8 a$ [: m
functio_n showinfo(){
9 E/ L$ g \) H3 f echo __METHOD__,'<br/>';0 @& W! Y" y% x
}" Z* \' D1 V% A
! K0 ?, ~7 S) `& D) u
clas_s AdminController{
+ g3 h& s l, S* P1 Z public functio_n __construct(){
# K1 s/ D. l) o3 u echo __METHOD__,'<br/>';$ h2 b* m; l. x* H
}
+ F; u2 M* V* ]' [}5 y8 Q( P9 P0 c( ]: V+ O
1 A8 l1 w# Z9 F+ m9 w- D9 P' Z
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
/ m4 E8 { l6 T$ J8 \& G2 ~----------------------------------------------------------------------------
7 ?' k, {7 ?. D* L2 I- i* s4 ?04inc.php% ?5 G) M8 I" `
<php i8 ?# C, N; m$ G
0 s! x8 A! R1 t2 knamespoc_e Core;; M2 _* \4 L3 [" w Q
include '05ou.php';, [5 c1 R% |. H- ?$ b
functio_n showinfo(){) f: G. z" N8 o: B2 _# O
echo __METHOD__,'<br/>';
3 h" s7 c+ Y v I. h* ?* [4 {: _1 q}- C: M7 ~' A* N
& z- a& R0 E, E0 w5 onew \Controller\AdminController;: q; E2 `7 A% S7 w8 Q
----------------------------------------------------------------------------5 Y* g( p2 j1 a. F# O
05ou.php
! j) _% A" p: \/ g% e<php% c( k) G2 D" k5 d. n( {( \& u" c
namespoc_e Controller;/ ^9 {; |5 g8 I9 c, n# C/ {
9 m" E! z5 `4 j* K7 S4 Xclas_s AdminController{
! p+ }9 j' x/ D6 b# @8 s/ Q! H public functio_n __construct(){& k* m+ n: a: L
echo __METHOD__,'<br/>';) j; L2 j+ g6 v' F
}
4 n: n4 \. T8 ]: ]) J6 t2 N0 h' e}
- N0 e2 B0 P! t0 K" T----------------------------------------------------------------------------
5 D+ A1 B3 n7 i ~. g: D _; ^6 v" q4 ~2 A; f
4.引入空间成员:( E3 F7 x- ?/ [5 |5 h
4 L6 w r( S! o
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( _) |4 ]. k% f# V' x9 }
" [; L) L! G2 [! P. f3 k----------------------------------------------------------------------------
- I$ ^: P/ b( [0 o% U+ M- d* I" P* u9 b& E5 b0 S
04inc.php
6 N# g N7 J* z0 T" N) q" R<php
: x- n- m; U. X) X& m% snamespoc_e Core;# O0 P5 }9 X' y+ f0 k/ u( D
use Admin\Controller as con;5 J0 a5 U3 W+ B- t- _$ a* L! k P
& p0 V3 f6 Q9 I8 r9 n
include '05ou.php';+ J2 g! I# Z5 _% L
; k4 i* Y" w; c8 pnew con\AdminController();
) ?' _* v. q- \8 w; N----------------------------------------------------------------------------8 [: P- N3 K: ?! L
05ou.php' n( h( B9 g6 y9 {9 U$ O1 |
<php, C) W1 e t% K ^8 B
namespoc_e Admin\Controller;
9 Z4 S W2 R, y
9 D4 c: [) |! |! W: w2 lclas_s AdminController{
' B! H, @1 t0 S$ h, d7 f+ W public functio_n __construct(){
8 K7 Z. D( C- S% B" [ echo __METHOD__,'<br/>';/ _6 n* @9 P' U* ~
}
8 H: p5 I8 _9 e6 m# ]}& h) ~) R8 B5 _# ]4 }
----------------------------------------------------------------------------
7 t$ \. @* I3 W' R) U2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 ]# f- o- {( s# \3 J7 [; W4 D8 v% G% i3 g/ B4 H( W7 B
----------------------------------------------------------------------------
, {1 {1 [! c& @2 _2 O$ K7 I5 o# r1 e! D G* @8 X" l' o
04inc.php( [/ Q3 c+ o- L9 t! Z- l
<php3 C, x! J& u$ T! N$ D6 A
//引入空间成员类4 |* T, b& h; a% t# b9 D
$ f" @& z7 \" R" t* w# z* X
namespoc_e Core;2 f, o! U; D" t! n
use Admin\Controller\AdminController;
) J7 ^6 R2 b; e2 A9 Z7 s( q7 ?include '05ou.php';
$ M8 J8 h3 x8 F1 \: H" ^8 G6 b- F7 D
new AdminController(); m: W# ]8 n( y& _
----------------------------------------------------------------------------
' H! Q7 T0 y6 ^+ Y05ou.php
" t) o6 p% M% K; n<php' i) x9 i, b: |& C) M J3 Q5 ^
namespoc_e Admin\Controller;
( [' ~6 [6 _9 Q" H5 q' w# Z2 i4 @. k0 K3 f( \$ D' ]
clas_s AdminController{
# I- O& T; }, x* X public functio_n __construct(){
3 f2 g) m2 c; P* R echo __METHOD__,'<br/>';
) S, M' L0 y I( @2 w3 n/ K2 C }0 e' k; c6 `4 } r
}$ K Z; B s5 U- \
----------------------------------------------------------------------------- D, O) M8 x3 P( [) H
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。4 j1 T$ B5 x! R( M; o# |, h- D
l) ?; T7 n: S7 N7 u
- k; g. _& j5 A$ q这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 P0 u7 r R1 F7 y; X7 @$ E4 w
; y' g, H% Q4 p' V7 G- c2 P1 o
7 m( ?1 }" l; n: B, n8 Y
" J ~1 l. b0 W' ]7 B9 d
3 d, g p/ y: M& B9 t# g
: j! ?3 k, V* ?0 }5 L- J) m' P" H* p* e! t% R+ U
|
|