管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:( s" v! P8 M6 l
. L( I0 I6 }, i8 p( ^在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
( R$ Y2 C4 B5 n+ ?* I i+ H) r# |. W" }+ w# D' G- Y* [$ c3 [( a/ t
5 b/ a& _5 a( a% G( A& l& Z$ s
" I$ j5 x' o" L0 N
我们来详细的讲解一下PHP中的命名空间:# m2 x i) w! g: {$ V: m
, z& N/ Z9 E$ p! ^
语法:namespac_e 空间名\空间名;$ T% F+ H5 d; A; C: ?
% _5 T" H* F0 `; |说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下: s* m; s3 S2 z
9 {: G# B2 w) E0 F" x/ V
----------------------------------------------------------------------------
& H* o: `: M) y1 J
& V" g; |6 \$ S6 h" b% P1 f1 L<php
; a* R+ I Z, i. D; w4 \; H* Y" Q
9 U s# Y7 R( ~7 R2 |& vnamespoc_e AA;
; D# U' D) ~& X6 @' m5 Kfunctio_n showInfo(){) L* I5 j" W) H4 ~$ H) _8 z+ N
echo __METHOD__,'<br/>';* b9 ?' ?* u% F: q
}
0 }+ Y5 ^7 z4 \8 S& Fshowinfo();. a0 s# b0 n+ z( P n/ `
* q( g& l2 P& M- O/ X! z
namespoc_e AA\BB;+ A; }7 M, L& K6 Z" s( Q: f5 k
2 u S O3 L0 ^2 P
functio_n showInfo(){9 Z6 c C, S( }# h
echo __METHOD__,'<br/>';
- C7 @" |0 D8 Y9 g; E}
# c5 O8 F' Y- U+ g! }0 ]- z//showInfo();
7 s* w C+ p5 ?1 Y0 x+ t& A----------------------------------------------------------------------------2 x- s2 r" Q3 \2 |1 J. }7 S
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 P3 V+ `+ i) s+ l0 K1 A' }2 C, }
3 x- w7 Z1 X+ d+ N3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
+ w7 R P# o3 w9 o
5 i+ }/ `* ?' i----------------------------------------------------------------------------2 |8 ^5 Q( V" S! U. _
( |' D4 k3 `8 z* i) k<php
' o- s- d" n0 I1 E! Bnamespoc_e AA\BB;* X) g* V9 @& m3 `% I: R4 i" ?
functio_n showInfo(){8 K. T3 v5 J* p
echo __METHOD__,'<br/>';1 Q. U' N% ?* @ _
}
4 Q# [' @1 p8 |( o, _7 S; Ynamespoc_e CC;8 e3 X& D) A4 W% z- ^1 o# d: B
functio_n showInfo(){
- @$ H+ X" ~8 e8 S5 h+ B echo __METHOD__,'<br/>';
5 D) [: G5 @+ P9 q+ |1 v3 c; o}
( k. t: M- {- b+ i! O9 Jnamespoc_e AA;
# @5 ~) @% J: x! Jfunctio_n showInfo(){* w9 D$ W1 U% h* U$ K2 M/ Z
echo __METHOD__,'<br/>';8 l* _+ s, I' S9 r
}
, y; l6 _- j4 b0 R' Y//非限定访问:用于访问当前空间中的成员: L& t! z7 L" \2 X# U6 k+ I+ w
showInfo();* O% X% {7 [# P" W: I( [
//限定访问:只能访问当前所在的空间的子空间中的成员( ]. G: j$ I* @4 ^% M/ @4 |
BB\showInfo();
0 T3 J$ R9 z: A$ y, c. z//完全限定:可以访问其它所有的空间的成员2 R. l! @% B0 Q# ?2 K
\CC\showInfo();) d" z# ~- D6 z6 S ^7 ~ [
↑根空间标识符/ l8 n& N: i3 c/ S
----------------------------------------------------------------------------, E* |* n) L6 x3 g! F
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:, {5 B, A" e: h
5 J0 B1 G$ L2 A6 L1 ?当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, y: y Y( u. e) p. i4 b
0 [3 Q- V+ s8 x& B- Z$ W+ S& H代码示例如下:$ Q( q3 a# B9 M
: e( D. _' P' i( o+ R----------------------------------------------------------------------------+ Z% U, r! O4 P$ @+ s) R
0 k( n8 @$ e) v) M
9 U: ?5 m6 P; d1 Y* A04inc.php
4 X9 W9 |. S7 i<php- J3 ^9 s) x8 u- }& K
( ] p0 I* s9 o# J
namespoc_e Core;
" y; d! J% d) }% N1 }include '05ou.php';/ O; b2 I6 `* n |. Z8 X
new \AdminController();; \6 Q" z |: s3 U
showInfo();. o$ y6 r1 E6 i) y
6 x+ `1 P- L. Qecho P;# s U0 L& G1 E: L5 h* ]: e/ e
//根空间中的成员,只要类的访问必须加‘/’
( e; C6 ?8 @9 x I" B9 H% q: R----------------------------------------------------------------------------
0 u" _. \: X" g! {, ~7 r# h+ J3 ~8 [5 J/ K' L. z& V; a
05ou.php7 M) w' {) s9 ?5 M6 O3 R+ ], T4 P0 z
<php3 f! }0 _& |7 t* r0 t
const P=5;
$ n: k3 J! \7 G
, A; Q1 z6 Z8 u4 a3 r) [functio_n showinfo(){% R# W% @0 s3 S. f, w e6 O3 W
echo __METHOD__,'<br/>';
+ `; Q0 D# R3 m( T}
& h% k; h7 I- x7 Z1 P* e. a
9 s1 `" f1 W, E2 R5 S m$ J' }clas_s AdminController{
$ M8 v' a+ E7 Q4 m- v% U/ x public functio_n __construct(){
- K, d. _% w0 G0 C; G* V echo __METHOD__,'<br/>';
( F6 ?+ Q) x' t' y }, S* D: j6 R. ~) I1 n& e" Z/ Z
}- ~. W* P+ O5 _: W
7 v( { o: w4 ]) a$ ~- P( S- Q第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: }' m$ a: M, K- ], v& @1 k----------------------------------------------------------------------------: d \- o; _7 j2 g( a9 t( o
04inc.php
4 k% f" a3 t) A% F4 [" \1 A1 f0 O<php' ^0 x9 V3 x, N- T# Z
& E' p( G6 H; [namespoc_e Core;
. b" U$ E3 I4 _include '05ou.php';
2 i+ q4 N$ r4 mfunctio_n showinfo(){! s. f% [) M9 L8 x( J
echo __METHOD__,'<br/>';! q) ~; v5 ]" [, h9 k5 O" e& {5 G
}! Z C, h8 }' \4 Y2 G% w3 q( G m5 f3 n
9 d* H# |0 E9 }/ u& K8 X: W3 Knew \Controller\AdminController;
, [) Y. u/ [* V7 q6 m% C4 D----------------------------------------------------------------------------
; B! }. v' E% f/ Z! \05ou.php
1 P9 B1 F" Z6 `3 n5 I( N7 u2 c<php4 x3 U! u: z4 ^/ M2 p
namespoc_e Controller;% b8 G4 H6 N( K) Z; f/ v! l8 e! F
$ V8 x8 e( i5 rclas_s AdminController{5 E/ h' M" e5 B, ^9 z" c" h" c
public functio_n __construct(){
) G3 _. _; E( ~6 N; b echo __METHOD__,'<br/>';
8 i* Z/ Z+ K8 j7 b8 \ }
+ N+ A- B" w- f& s+ H7 p% \}
/ t2 {. r$ p5 I8 R; z# L& G; y----------------------------------------------------------------------------
6 H4 M; i( a, l7 H0 d9 ?% f. w4 N# a# Z/ @& ?8 I% S6 F9 L5 A; g
4.引入空间成员:
# k2 @7 [8 Z/ z* J- p) B- O6 W% D3 U) @9 @* k* E5 g$ a
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
0 {) K0 ^+ ~# i" D+ @: q3 E- L2 E/ p' L4 O" R6 E
----------------------------------------------------------------------------" C: H, j9 x/ m5 F2 z: u7 D2 |' ?# T
8 q6 t/ n# X' P6 l% s04inc.php
! {" i2 R$ P) m<php# K& W* P e& x! a' A# F8 A% @
namespoc_e Core;
: Y1 P) t8 C1 v3 h# r7 Z+ fuse Admin\Controller as con;( f, T6 q3 M5 k9 r k: i
( n- k% C. e# P; pinclude '05ou.php';2 ~/ Q: J8 G. }# y* B7 k
; x7 e( J: y1 }. p' y$ P
new con\AdminController();
( T: s/ N0 V) b' f! i8 V----------------------------------------------------------------------------
" {& F9 H, @/ O9 `9 j. p S05ou.php/ J% a% Y$ y: t6 J" T0 a
<php$ p3 b% ]( D5 u- }/ x( Q ]
namespoc_e Admin\Controller;
5 {8 ~. r5 s. @+ K6 G, g
, L5 c4 t# T0 i) q$ U3 @7 \clas_s AdminController{9 f; b2 L4 [! E% _
public functio_n __construct(){
N& G1 H% Q2 y$ A! L$ @7 n echo __METHOD__,'<br/>';. K v' k: n& U) B& v
}
, J& r7 F( U/ W6 z% f8 B) B}7 N- v3 c! M2 g- U3 Q& C
----------------------------------------------------------------------------
) E5 a2 c) t5 g s- k: k; k6 {2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
; v# n4 r" a4 [7 W# b& q9 e n& j I% S+ k+ o
----------------------------------------------------------------------------
8 V. ]# l& H6 [! s1 G, x k
2 ]0 ?; L8 m# @# I0 ?% E8 o* {4 q: z04inc.php
U/ c' x0 U4 r: u9 E1 f! H<php" I6 Y% F7 }; |5 P% w* r; L$ C
//引入空间成员类
: y" `1 g6 Z/ J! n1 G& [. o' }5 {6 }( P; y5 l0 s
namespoc_e Core;* \ x, z0 p( n: S
use Admin\Controller\AdminController;
/ L0 l5 C+ }( o _$ x, [1 n1 I3 }include '05ou.php';
/ R4 D5 G% [6 h& s: X, S1 \, A. ?8 j+ `# s
new AdminController();
% \8 }1 [3 ~# N. B----------------------------------------------------------------------------% Q7 [/ q+ j8 r, W- h i( Y: i6 v* R
05ou.php
8 @0 s4 q$ X M! p' V: Y<php& ]6 ^6 T6 G F& P( i& k
namespoc_e Admin\Controller;
' p5 C1 B" x2 a( f: e
4 g: P) c% Q) B( z/ J& c. {clas_s AdminController{/ t& {( ?. x% a4 c
public functio_n __construct(){. ^% K3 h/ n/ L( u7 O2 A* p+ h
echo __METHOD__,'<br/>';) X# x7 {8 s& E
}% b$ t& a! T, D+ \! U
}7 Y0 @% K. f) V( D# j
----------------------------------------------------------------------------; b+ i" N' G9 w0 Y8 C1 N( H
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
1 g$ {) h3 b: r3 N) j- \5 L$ ?5 Z5 v; L" O/ M
3 w+ Y$ ~/ y0 D- i" K. v
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。3 {2 b0 o/ y4 e( k1 z! m, o
j. f( { E e! x, V
9 Y! n# V% \" u2 l- T, `2 K* v. [, N+ M0 e# \' H- T
8 J9 L7 i7 z5 Q* @& T( E0 A2 P
9 Q/ D! I2 `0 f
# a) f) G( B. Y* c7 k) f
|
|