管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:) g( I" k6 U# ?, U# r5 B2 s" m
8 J) N, k1 N! ~1 M* [+ X$ i在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
% T* u6 z G6 ^4 q. M2 [2 o
0 ~% j& t& D9 X8 D, S' o; c
) H g2 n2 H# q. g$ {3 k4 W/ N* c
1 w4 G7 q; B4 B9 p" S. n我们来详细的讲解一下PHP中的命名空间:- ^( y/ }! v6 R/ a5 x
7 H7 M% P; F* I4 x; @; a语法:namespac_e 空间名\空间名;" m+ l) O+ _1 i, {! C
' V% C( u5 o1 k; H2 `2 A3 i说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
- t5 X! w9 F2 O3 _( X) @8 `# B; g7 J3 |6 S
----------------------------------------------------------------------------3 T. C9 S# b1 p% |; N }6 b) a
! H/ l' g4 z8 t+ A4 f8 v<php. \$ y i+ [. s
8 o3 |( E' p; a+ a- |$ F$ j
namespoc_e AA;2 Z/ L- Y& x6 d
functio_n showInfo(){
. q9 i" F. j% q0 y. W) D7 j echo __METHOD__,'<br/>';) Y9 a+ [8 i9 q P
}4 q. [/ Y9 X2 ~4 Z0 z
showinfo();
# o+ H @$ [8 A. U- r7 M
; R' l) [7 u3 D( I$ w2 _namespoc_e AA\BB;5 A: u$ F- y/ W" \ H. i+ j
# w& @0 U8 U1 ]& y" Vfunctio_n showInfo(){
8 P7 |! ]* Q# L) P: r f, a echo __METHOD__,'<br/>';2 l- N1 {3 w! b- h9 ?" d
}
/ c# Y- E! s2 {& u//showInfo();
; E; {5 M' u: C) `. l) v, u----------------------------------------------------------------------------3 }1 X% `# w+ ^. R0 E* k1 b
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ J X" X/ t; {$ a) g
* B6 J! k4 b: n+ B3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。3 [, U" b, b8 z/ Z
0 u \: L Q2 n5 h, u M* H& [
----------------------------------------------------------------------------( g' `) r( g! F# Q5 P. e
: a" B. }! @0 B; B( Q+ q<php
, Z7 C" @2 f/ U* G" }namespoc_e AA\BB;$ V5 g; L0 B4 ?2 y/ p
functio_n showInfo(){0 W9 `0 {* Y7 \; f5 h
echo __METHOD__,'<br/>';) {8 b( U) n; P @! }/ }- O
}
& ]/ Q, F* p% F. o3 Enamespoc_e CC;
- I3 u4 N0 W" P1 Qfunctio_n showInfo(){& W. H1 b" G* n) S" C
echo __METHOD__,'<br/>';
+ l% A0 [& m ?6 g: R}
8 K0 w6 V; z5 c5 t3 s6 Unamespoc_e AA;7 t3 C. }7 U0 ]( S4 s, e) Z
functio_n showInfo(){
8 d( {/ b: X: Z3 R! x s4 `. W echo __METHOD__,'<br/>';6 X3 h, H# F _8 J/ Q; ?) R
}+ p$ T) T2 w+ s3 @* |5 }! f. m
//非限定访问:用于访问当前空间中的成员0 I) G' b8 T1 H- _ o4 ^
showInfo();
) f8 R/ w* L9 x: F. J4 W//限定访问:只能访问当前所在的空间的子空间中的成员7 P( l0 n" ^* U; ]+ o" G
BB\showInfo();
4 A/ G( w9 x- e( T+ Z/ J//完全限定:可以访问其它所有的空间的成员
3 F7 E& K% Y3 h+ @# t: ?\CC\showInfo();* f; A; r: l8 v+ O% [
↑根空间标识符3 Q8 \/ a) I1 s8 c
----------------------------------------------------------------------------0 x6 a$ B& b# Q: n. u7 `
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:2 ? N9 C/ k l8 S
, ^! E$ e7 |! J当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
' m1 x2 i7 _" r5 F
1 g7 \% z% E3 O代码示例如下:
$ `4 {8 m" P) q7 e& n( C/ ~7 J6 e4 S. P' n& M# r/ t9 x
----------------------------------------------------------------------------6 u8 l; F* D; J" O" `
; @% Y& y( G, j; \" ?6 F9 s( w1 \ N% [2 o& J+ @) {
04inc.php3 @* A5 o7 R% {5 }
<php) y; d9 s/ H! H* o$ ^1 D+ m' R1 ^
3 z N% n5 I7 i! O' T( c/ G
namespoc_e Core;
3 u4 Y3 j' P) a% zinclude '05ou.php';
/ u# V% G( e: y8 W( _7 L$ Unew \AdminController();) }3 u3 `% k. {
showInfo();
% j+ E1 i( [6 y: j5 K8 S1 m- q" A2 l" x0 M5 D4 O3 {0 u* B2 D
echo P;
7 V2 _1 |# d9 `( U' Z0 S3 g//根空间中的成员,只要类的访问必须加‘/’7 R" n8 ^. O: @4 H, b4 @
----------------------------------------------------------------------------0 r( ~: X: d: r D5 Y C( k
1 V- _( ]) }4 f4 ~5 Z05ou.php
+ S1 d. s$ Q+ y8 V% C; A<php
( {. _4 ^( q& hconst P=5;
/ Z( @+ X8 S) g# a6 @' {5 X- \
5 w& l* a& M4 M" ]2 ~( D1 Lfunctio_n showinfo(){
6 z B h! z& j7 Y echo __METHOD__,'<br/>';8 L) |8 n3 T4 x8 B
}
0 l, L! ~- ? ^- k _. s& n' m' @6 `8 `2 x
clas_s AdminController{+ K$ b% m; X+ l" u' A# K
public functio_n __construct(){
/ Q/ `! X* l% T echo __METHOD__,'<br/>';! M1 j; B4 V; f/ ^
}" d$ c! j ^* p* M! m+ G4 U
}
) W4 z5 G3 L) }1 N! C. ?3 j2 P1 c9 `/ d8 A1 t, {, d* m3 R
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ b2 K+ C( o/ b: ~, z
----------------------------------------------------------------------------
( O% V, U4 t& {; a04inc.php3 ?( [: o4 X# A; L( r
<php
# }1 z4 I% h6 S2 f8 J7 [# f8 X$ \
T( i! }7 H0 x& ~, m& @1 \& z) znamespoc_e Core;
6 n, H* |2 D6 V5 T" y) zinclude '05ou.php';8 U( t* M4 e) e4 V3 U$ E
functio_n showinfo(){
5 m8 F1 p% Q0 I" }- H, k _ echo __METHOD__,'<br/>';' O8 S0 F) g7 r% K4 ]5 T
}7 |$ ^) T5 e F) u0 J7 r
8 h$ X& r" Q8 C9 Bnew \Controller\AdminController;3 }2 Y% X+ d! L
----------------------------------------------------------------------------) T7 d. j* r N9 v
05ou.php0 u# _( e# g4 Q' @4 w- y- v$ L
<php
* Q+ J9 ?/ q5 `namespoc_e Controller;5 \. q1 d# G* A4 \' q; S8 W
) d1 i) S! j2 {$ F7 P* w9 Xclas_s AdminController{
: H: h9 |) d a& V3 }$ K public functio_n __construct(){
5 W; M& Y9 Z* b, z: V7 l/ _ echo __METHOD__,'<br/>';! L C. Z) G/ x2 F* W
}
4 o2 }5 k! S) T}2 Q+ }3 O; T0 N. Q+ _9 ]: _7 j% d
----------------------------------------------------------------------------4 O, P1 N2 K4 e+ [6 u
& S" i8 ^" P, c6 Z
4.引入空间成员:
2 q" F: a1 R- b
* S9 W' w1 C5 z" C J" M' r, N1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
) L( R- X& L3 n9 ^: z& B$ Y, D4 ]1 I1 o; w
----------------------------------------------------------------------------9 i; c; W6 V1 G7 s9 H
. A8 i N% }0 e8 S! U
04inc.php; i& l" b- E# W1 r
<php& |% { {1 t8 ]" c) A1 [5 x
namespoc_e Core;0 `. y& x7 N6 ^4 Q% x% n; {& v* p* X5 b
use Admin\Controller as con;
3 G- b- A" E6 o/ x8 `9 U; y$ _' i: V
include '05ou.php';
' D5 T n* y4 a/ n
) g: ^8 p" t; K2 ?& enew con\AdminController();
, S% H% n! ]8 T1 A----------------------------------------------------------------------------+ A" d9 ^* b2 V! w
05ou.php
5 U& @# o0 r& c2 q2 X/ ?6 \<php; H/ O5 `. y4 L6 }0 {1 o
namespoc_e Admin\Controller;( Z- i1 F0 D' B& o2 R5 a
v) w) ^. S6 G1 w
clas_s AdminController{/ m! T: ~8 Y: f% X7 m% t- b; ?
public functio_n __construct(){
% v9 \" h2 O. Z3 a( O( h4 c: D echo __METHOD__,'<br/>';
* L5 g+ @4 H: x& m }
4 L' g, O( M K# w* h$ P5 J7 |. Y" U8 c}7 @* A& t; P7 U/ @5 t- U
----------------------------------------------------------------------------2 }9 W2 b! x7 ~7 i8 A4 A* _5 i/ O
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
5 O q; z) B* f3 B. G z
5 O) [0 C9 \- k% ?& W" o----------------------------------------------------------------------------
2 X: R" G6 M+ m9 ~6 ^$ Y$ C6 K4 f( ?: j# S$ q& q$ J
04inc.php
" W" C/ M* A* ~' L<php1 h2 l# a% e8 i4 a( T `- n
//引入空间成员类
F( }) ^' ^' ^5 x; k5 B1 p+ Q( ]* q6 t- D* z/ X a
namespoc_e Core;
' R1 X4 L( b! L o' v( s7 Uuse Admin\Controller\AdminController;
% }# ?, V5 S7 Linclude '05ou.php';
8 h/ j- P4 y/ ^4 k- G# w
9 W& u# {* Y. e: `new AdminController();
" s! ?6 u' i; }! n' J) P. c ^----------------------------------------------------------------------------
$ J1 P t* h# T05ou.php: ~; ~6 g) r& h$ b
<php
6 o& g) u* R2 N' s$ _ U, Hnamespoc_e Admin\Controller;
2 ~5 D2 W7 `6 A8 q- y2 I2 {- [ d8 n0 b1 U' e* D- A
clas_s AdminController{( X2 [5 ?/ s. L9 N. _; {$ P- [
public functio_n __construct(){
+ L/ z) B0 i3 {' O echo __METHOD__,'<br/>';
, `+ i1 x) V8 k2 \" O Y- D$ k9 Z }6 x) ]6 g0 I* J7 k0 b( F( X3 F5 b5 T
}
# t( U5 d* O( O; ` T# @) i/ o----------------------------------------------------------------------------
( H- f' K' O, s5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。! P' w Y) {' O5 i: \
l; ]) }6 x' y6 v
0 y7 V! E3 k# J) X这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
$ Q3 D1 @# C, B4 }& P9 g8 k- T% v, H/ u/ [3 l8 E; K
; |5 O/ D( k8 c% E
) Q B( {& y, ?9 `, T/ N% X5 @8 ^3 d2 _5 H
' J% W) c1 P; \/ |& H0 [5 v( A9 m8 [5 T: ~- u2 N( I
|
|