管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:' x* U( n. K# D
# \. o3 e6 S$ M, J
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ L' `- \6 B0 i, a
# g# b* @; n: n1 x
3 c. i2 |9 N; {
# {" E* @: G; s) b6 l4 [我们来详细的讲解一下PHP中的命名空间:2 Y. Z7 D# j2 N2 P
- b. L6 H; ?, u3 }$ \; N5 p语法:namespac_e 空间名\空间名;
1 e" @7 |" P# p: `
U2 a: t/ P' d1 f说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 |: s% x9 \+ D3 G( u9 a" m5 a i- D8 L7 x
----------------------------------------------------------------------------
# X1 G% `7 y2 X* D5 c
" @5 X/ D1 @/ ^ p<php, P8 k2 A7 D" o! R! m2 D+ g
7 s M+ o/ U* q( ?0 I2 ?namespoc_e AA;
3 ]3 P# c' u+ `& y! vfunctio_n showInfo(){0 w: C j" O2 P
echo __METHOD__,'<br/>';
4 u" a5 L/ G/ c6 g& L! A}! F" \. X$ B& s& x1 @/ G3 T
showinfo();1 l0 ~$ e9 g$ F
9 D7 i8 I+ q; |6 n# t5 @, bnamespoc_e AA\BB;3 u1 _! d2 C/ B( E& F7 @% n! b
6 U8 ~7 K7 \, c5 B
functio_n showInfo(){
9 n& `* Z6 ^6 i1 d/ J echo __METHOD__,'<br/>';
4 _: \& K# M+ U. z}9 e% d; A% O" O4 j i8 l5 p
//showInfo();
8 _: T: ?3 e# M+ d4 s$ z----------------------------------------------------------------------------# J1 B( Z/ M% t1 S* S: E* Y7 n
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
8 D6 Z/ D! f+ m% o o
P# U1 B4 W, B& {3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。) Q5 T$ z/ L U# Z0 V H* L8 i: E
5 y% i( ~0 e# {# R# Y- }+ i
----------------------------------------------------------------------------
5 L; I2 d* T8 q: u. z: M' G$ E! W Q* Q+ s4 v( E: @ T) i
<php
0 `9 K3 @) H1 enamespoc_e AA\BB;
h. E- Q9 [) C6 jfunctio_n showInfo(){7 M8 O' @+ n# s9 q" H
echo __METHOD__,'<br/>';
0 E W" n" h: k0 F* ^2 v}9 Y3 y" G1 k5 g! X' y
namespoc_e CC;4 Z+ h$ Z6 }2 ^9 m, c
functio_n showInfo(){; X7 v( j2 x/ u/ M- d* Y
echo __METHOD__,'<br/>';
6 ~; {6 W6 m9 f4 j" ?2 I" x6 S}6 R" g/ _& Q9 U! D! t
namespoc_e AA;( |" }- ^7 g" G8 |1 p8 [+ E
functio_n showInfo(){
% D; ?0 _0 W4 l8 ` echo __METHOD__,'<br/>';
I) D2 V/ p E( K' B! Q( u}7 v& _: P# y; a0 ^8 P0 i
//非限定访问:用于访问当前空间中的成员
( {. U% l3 m" j4 `& e9 [ [9 M5 b0 HshowInfo();
! ]# U: a& z6 K//限定访问:只能访问当前所在的空间的子空间中的成员
* e+ r p0 O/ B) Q* T3 F( M8 h2 lBB\showInfo();; @1 _7 t8 {! c2 Z
//完全限定:可以访问其它所有的空间的成员; x1 J5 u- F3 @
\CC\showInfo();
8 T+ |/ |8 }5 z0 f↑根空间标识符
/ \+ [* E" A4 W" r8 C. Q; x0 o----------------------------------------------------------------------------
& w7 ?; V9 [$ K" \# Z) S但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:$ h5 U0 W/ k8 } Y
1 g; E9 v9 @: A) S当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
* q7 J; G2 [4 N- Y1 n, n# R- W. Q# a& J2 I9 O& N( g9 d/ ^- j7 Q
代码示例如下:
n" n/ U4 T! Y7 N
& a0 [/ L- D) \5 u) z; Q7 h+ |----------------------------------------------------------------------------
9 r- X0 `* S) J! ]% k9 n* @9 [# B4 O( k) y& _1 h& V
: r q% u2 v- C/ [) h) H
04inc.php+ k4 F% C1 F8 K
<php
7 h/ r$ n! _9 `! O3 P
s4 Z6 ~ L( g' b6 P! jnamespoc_e Core;
" B4 U# \% f0 J7 S' w" a2 \include '05ou.php';5 T# n; V; q5 r" m% Y7 {; E
new \AdminController();( {6 ^ V3 r# t) R4 x f- o" k, @
showInfo();
. m9 \% u1 N d5 _
* L/ c) ]1 x& h. X- ^+ \echo P;
' a m) y# Y# Z# R//根空间中的成员,只要类的访问必须加‘/’! O& H' I9 n* K" l5 t
----------------------------------------------------------------------------/ k3 y1 U5 a- i3 i
, j, m' f3 ]6 x- c! K9 R! X% Y; P- T05ou.php" G# \7 b! g3 j, v, A" Q
<php
7 ~ w1 n/ q1 Z6 v8 ?/ D4 K1 uconst P=5;( r# O9 v9 h9 |1 k* W! B. [
- }0 z$ ]9 l) Tfunctio_n showinfo(){
) G, B2 B3 _' k echo __METHOD__,'<br/>';' Y, I$ l( l. [
}
- K7 n8 c& p7 F( U7 p" P4 c
8 E1 B( X. Z7 iclas_s AdminController{
& L; G, I6 h% ?3 P1 c5 T( L public functio_n __construct(){$ W: A" P* ]6 p
echo __METHOD__,'<br/>';
6 }. e9 l6 o+ A* m5 I9 ]: R }. j0 X5 L6 q$ F8 ^
}' q4 S f8 c$ Z1 x3 K
: ^2 Q, Q Q* _2 N4 d' o8 U第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
i; S) x5 q" A$ ~----------------------------------------------------------------------------; |, g" o [6 b/ k/ k
04inc.php
; Q6 M. m: x2 `<php
+ \- _( J3 S! C, E( f9 z% n% n+ {/ U3 u4 Z# q& F
namespoc_e Core;4 T7 n/ n& a5 Y3 s3 w% I+ M
include '05ou.php';) o0 g! ~6 i' k$ E# \3 y
functio_n showinfo(){/ @6 y4 Y( B! P( f- ?- y
echo __METHOD__,'<br/>';
; \9 d. ]1 w: y; c}' p o v- Y, o5 f' O! H4 [/ m
" V! w4 v, o1 }$ E% enew \Controller\AdminController;
# B8 b1 P% n' B( a$ R! O----------------------------------------------------------------------------
8 m* s& T a- ~% X- t: ^ a# B F05ou.php# t4 V" y2 n1 X
<php
- t% T+ ?6 u2 T8 M3 d+ C2 l j s' Wnamespoc_e Controller;. ~; g7 o0 @8 d2 D: e( Q
7 e" B0 q( N0 m# V0 X- t
clas_s AdminController{
% r& ]9 f* A$ A* G public functio_n __construct(){
( t/ O) I, \; s3 z% q echo __METHOD__,'<br/>';
$ @8 e) O6 n/ u' v' B }
: ~) ~& P# ]; ~, @}
: v3 h; h& A/ R8 T9 U/ @3 Z----------------------------------------------------------------------------0 ~9 j5 v& ? F2 R$ K
( r$ x4 _6 P. h1 `7 j$ g, c
4.引入空间成员:
% i5 L5 U+ ~3 m+ i0 k8 U
- U1 p7 a3 k4 o8 `: d1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。0 Q" i, j# v9 T' w
0 x! _) S0 M) R/ a----------------------------------------------------------------------------
" S0 {- s" C0 d" [6 Z: z# x, h! E8 q5 r1 N+ u+ Y5 s% Z
04inc.php) E4 z6 n7 a- T+ i% ?! e( N
<php* f: [% J) @' j0 r) h/ Y' x% L
namespoc_e Core;' {* b5 j' k% n
use Admin\Controller as con;( a4 e" {, w5 D+ U/ |
0 @/ w$ y r" N! _* F! finclude '05ou.php';
( ?! a8 i7 u% P# E* {! x
4 t- W" v; d& tnew con\AdminController();/ x J! r5 k3 ?
----------------------------------------------------------------------------
1 \8 b7 ]4 ]) V) ~ f4 m3 N4 x05ou.php; Y; H' C& z$ j% z
<php
7 T# `) m# F0 y" Ynamespoc_e Admin\Controller;) {- _8 w4 [4 _; W T+ w3 k- T6 j
+ P9 B `! l5 x: ? J
clas_s AdminController{" `8 w6 g% r2 i3 R+ C% @
public functio_n __construct(){
, j' E# F" e) Y, L( i# ^ echo __METHOD__,'<br/>';
' }, N0 K* x/ v8 A0 N/ h% Y' j }
0 ~" L& v+ H) R/ a# ?}
) f* I- }$ k8 F, ?----------------------------------------------------------------------------
9 Y/ B% ?. c6 _* Y# \; a# F/ R2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
# T, o Z& r3 {/ g9 `" P
% g. E2 F* I) [, ]----------------------------------------------------------------------------% [$ A- d2 l/ u5 K
. p: x# c; d2 |
04inc.php
* P$ W% j4 h3 }# A; p2 \<php
) S, r* C3 I( f6 R1 ?//引入空间成员类
6 o# J# H* ~; P) L- y5 P" Q2 l# K6 ?
namespoc_e Core;
; t: b4 h' X8 G8 xuse Admin\Controller\AdminController;
; ]' ~# K4 f( x, W4 c) Uinclude '05ou.php';
+ n4 D$ A: y5 c i) I8 m3 C! v. y U+ o2 ~0 F
new AdminController();( e" f2 ? q3 G
----------------------------------------------------------------------------# F# u/ D0 W7 ~
05ou.php% T: B, ~3 I* j% V( y
<php" K* ]3 [. z1 `
namespoc_e Admin\Controller;
& ~- l$ P/ R; C' d/ a4 Y3 J& z* O+ {! a* c: g
clas_s AdminController{% Z$ E7 D$ x2 o4 u( ]) A( v! ~
public functio_n __construct(){
7 K) G/ a, }, v N# {! \ echo __METHOD__,'<br/>';
/ P& r" o R1 F }
( e7 o# R) C) T2 I" ?1 ` h, L}5 Q. z9 L6 `4 F: Z, T
----------------------------------------------------------------------------
9 i- L# B8 q8 a5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
0 A8 o- c2 x: V1 B3 x" n" i
: P/ K7 c6 x7 r! h0 C& d& T8 f
5 t2 W4 y I% _7 y! p' G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
" z8 Q8 F9 T3 c+ }+ W+ I8 }" a+ B
. d# y7 J1 v/ v0 c0 Z( ~0 e+ ]( R
% [& D! ^# a! {9 {
! X7 Z% o p" \9 q4 B }2 H9 t, M* j1 N6 e% \2 @
, v B; |( D1 S! A+ j- d) D0 w
|
|