管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
5 u' z6 m1 ~8 W) S) S& p
0 t& u- L* o% c6 |% e在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ j' c- q: k" t* i# s( ^ x4 `
( M8 d) n5 _: t, s
8 C' ^ I6 Z# X
6 _% ~, o3 V/ ?' B我们来详细的讲解一下PHP中的命名空间:
' V) ?& T! r& k9 @: [$ X# P: h
1 O6 K3 i: |& K; s6 A: K0 D9 ^语法:namespac_e 空间名\空间名;( ~7 r# S: `- F& {
4 e5 h1 E; a$ \6 {3 m: w说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:3 l: t$ A+ z; d) _; D2 d5 z' F' U
: d. s, T+ y. o. p) p
----------------------------------------------------------------------------+ p% i2 u0 N: u. i) e
2 Z2 ?# y) H& R& D* _ u
<php
* W) O( Q2 r# a4 g' y
0 k, \" V: C) W+ F' U( G9 ynamespoc_e AA;
* T( k6 t( n/ C# Lfunctio_n showInfo(){+ x; `& S7 Z$ d/ p
echo __METHOD__,'<br/>';
( R, T5 D- F$ Q1 K8 J! @) w}
: ^5 D- A& f3 zshowinfo();! T4 g$ R' E+ p. d( \9 D
5 r/ W$ z- }$ t3 U6 Y4 g, L- k/ K
namespoc_e AA\BB;
) s4 J4 Z/ |2 m+ J& Q" O
K: s. B9 | O" k& s/ Gfunctio_n showInfo(){
! `1 w. `# D9 c; ]+ i+ t+ j echo __METHOD__,'<br/>';
W! B7 w8 B3 p- A: Y1 p$ q7 i4 r}
3 d# u$ t, _1 C) J0 u: ~//showInfo();8 o1 k9 }* T! K# R( _
----------------------------------------------------------------------------4 @0 d3 ~ W) @6 N: B. p. N; y
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)- }6 C- c- `# h! J$ ?2 {7 J) G, |
! P, F" |" J6 V N8 ~9 ~- X
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。( X7 y2 J4 X1 J5 i1 }
9 r9 Z5 k1 F% j6 g4 e+ r* P& F----------------------------------------------------------------------------) G% i8 u/ `5 R% R
e/ V1 W0 {& ~& y/ t
<php, z% ^- a U5 L; p0 j0 C
namespoc_e AA\BB;6 i$ \9 y1 M% {+ ?" @; E
functio_n showInfo(){
1 T+ R2 N7 u( d echo __METHOD__,'<br/>';/ E! D8 j: I8 h! G
}4 t" N2 P" E& D" Y9 L1 S3 ?
namespoc_e CC;
: \: ], Z! B: @functio_n showInfo(){0 ]3 K/ Q* E& U& N
echo __METHOD__,'<br/>';
& Z8 a6 R' }4 q: z9 }}
, a$ Y3 }3 U, Z7 ?- r" ~. Rnamespoc_e AA;
" S' {# |! X/ B9 u5 q( Pfunctio_n showInfo(){
, S9 G/ L" u# C echo __METHOD__,'<br/>';
5 H4 g( K4 M( X}
' f4 b& O T" C) }0 _) {//非限定访问:用于访问当前空间中的成员% T" A# U# k1 G# i5 ^, G9 r
showInfo();
$ \" E3 o3 z' i" A, S0 J; e//限定访问:只能访问当前所在的空间的子空间中的成员+ t" W3 ^/ c9 I' M7 v# m9 X
BB\showInfo();
7 P2 U7 s5 F/ n; f- h//完全限定:可以访问其它所有的空间的成员5 t2 i& A$ U a$ i. `. I8 f
\CC\showInfo();
; P- h, a z! t5 x7 p↑根空间标识符
! a- u/ ^- A. Z+ ` R$ Z. e4 I7 {7 O---------------------------------------------------------------------------- Q: d$ S- i" d w
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:! G" r( p$ A5 v: [- D* ]0 R
! J+ e5 N! X0 R' ~0 o. }. Z" {当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)& X& j, F( T+ |0 v8 E8 T8 X7 X* _
$ l4 I( C3 |. |9 E: \
代码示例如下:7 \9 A- C- [" ^" {8 e0 W* a
( J! @4 {; \. o
----------------------------------------------------------------------------
! ~. O& o. h9 |6 r5 N* Q
/ O5 S3 {8 Y6 F% @( i1 u
( V& B# p J1 m/ z+ H8 G' a04inc.php& ]1 R, H+ B+ Q8 A% a
<php
/ ~5 C9 k: h+ S
: ^* ?- j/ _; W1 x+ O& _% \namespoc_e Core;
. L6 [. v$ c! W# Y, `include '05ou.php';# ]* M2 H7 D" M4 Q9 \9 W i4 A
new \AdminController();6 l- H+ ]+ c3 @# S. `
showInfo();
9 b, t; @0 ^; O0 W; K5 X) a+ A2 K9 W3 H( Q9 o5 G5 |, v
echo P;5 a+ h; l( h. M4 F" q' O7 K0 N: z
//根空间中的成员,只要类的访问必须加‘/’5 D/ \. ?* f( z& E* p
----------------------------------------------------------------------------1 T6 A8 V3 R' m
0 D0 U, x" t+ B: z* b, d
05ou.php! C* Z) K# w( e! z9 y. ?/ q
<php
# M% U4 x( ?; Uconst P=5;2 f! ~3 k: a. j$ [; ^9 T
0 d; L9 ~$ U$ d$ n/ xfunctio_n showinfo(){
% [+ K. @% S! N& w2 `* Q/ \ echo __METHOD__,'<br/>';' G+ b4 E% r7 O, f- S C9 s* L" l
}
5 T0 r G1 h8 U* u
' ~( K, @1 c) h4 O, nclas_s AdminController{) U L j. }3 E9 n
public functio_n __construct(){
8 D/ a- D+ l+ M5 \ echo __METHOD__,'<br/>';5 l( M1 C8 G/ T/ ]
}
: t" p) D% H, r$ P, L( ]3 I8 ]& r}+ _2 v8 R! y) h% I6 V
& F- D5 W; Y( }0 P
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。9 B7 w: A$ X8 J4 U
----------------------------------------------------------------------------
& X: _. r9 h% t. n9 j4 R04inc.php9 ?! E# R. |( r9 w& @' B' D# A
<php7 _$ r! j% u$ Z/ Z% n
" P( U) y' w6 j
namespoc_e Core;
" Q7 I: ^6 X5 l3 minclude '05ou.php';+ m" b% [; z' s
functio_n showinfo(){$ O2 @+ q5 _& Y
echo __METHOD__,'<br/>';
" d! Y0 J1 N5 `}+ m7 \" P$ m- p t! P8 s0 i2 W
, r% T% u+ S$ t# E. G
new \Controller\AdminController;
& ?0 d2 S: O, A" X9 `----------------------------------------------------------------------------) m' |. G9 T) l$ z
05ou.php! d, d" |# ]$ Z& Y" d* M. Q6 _
<php% ]9 I$ f' p+ r1 L6 K
namespoc_e Controller;8 J# x( u' q$ |( q; A1 Q
1 y3 k6 y* V: S# Z1 N! F% j7 \
clas_s AdminController{+ @- l0 Y1 j$ i: p' b( r8 H
public functio_n __construct(){
/ l+ H6 A$ M! x7 s% \8 a; H echo __METHOD__,'<br/>';
0 ], R3 U/ P* v6 ? }
9 ?2 T2 d0 [ L2 Z( U- R}
" [; s5 s/ h+ @# \! L* s----------------------------------------------------------------------------
/ f! ~! o9 u% x& ^
& I+ g- o4 Q( L4.引入空间成员:( Y4 q! L0 t/ H2 g0 }$ ?
* ~- e4 k5 i& k3 a* c7 b1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
* N4 q1 l' u# b" v/ h/ l2 r6 ~7 }; m; ]8 E
----------------------------------------------------------------------------
7 i( w' h, B3 _( @9 K" [/ S, H
& H J0 `& }3 Z9 @04inc.php0 }5 J* }4 G* J' _' s& [
<php
8 ]5 ^) k _) ^$ O& jnamespoc_e Core;
- _. W3 U2 w) }, b- Ruse Admin\Controller as con;
, k: K" [' k6 t& f3 k; n7 g
( ~9 [: {( g, ^$ [include '05ou.php';
1 |5 ^- v: J. E9 z3 \+ w5 g. }$ M2 C" U9 P( C5 M6 c4 H. I$ X
new con\AdminController();
$ g7 \1 o+ Y1 U7 \ U! j" |----------------------------------------------------------------------------. ~& e. q8 |4 `' ?8 a9 j1 T
05ou.php u4 {8 q" \" `2 H
<php2 F$ x8 s$ x: h8 b) d4 V
namespoc_e Admin\Controller;) @, P& G) h5 s B8 e5 t1 `" \
5 x! z$ ~' v8 {5 S5 j
clas_s AdminController{ p/ t0 D" k, A8 I( Z8 ~+ s# w3 ^2 a
public functio_n __construct(){. L0 `, Y- R) ~, Y
echo __METHOD__,'<br/>';4 c0 s& w2 a" z3 m7 ^
}
3 m! N6 i7 t6 G* d% O0 G' V}! _ k$ I0 Z3 K5 K# Y3 w, r
----------------------------------------------------------------------------
/ z& {% w: E' E+ z) V/ I3 h2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
' D( h1 t; F" }* |) g9 l# B
% h. B; C. c+ n9 V( B) H# T----------------------------------------------------------------------------* W; E/ s, X" z' |
- l- J' V+ L" \, A; {
04inc.php8 y, D1 Q. a- N- S3 V
<php! C0 e/ o' _$ K1 K
//引入空间成员类( ~3 I$ y; z7 r+ P3 O& X* F# v5 C
. Y- g. p }' R, Z4 x, h; R- rnamespoc_e Core;
6 b- t. m4 `7 x& r% wuse Admin\Controller\AdminController;
6 ^1 k% C3 w1 f( S% ?include '05ou.php';
8 Z2 L9 y/ P( v* O6 f/ J
% Y/ ^* T A* q' Lnew AdminController();4 p0 `& Y8 R5 P! ]
----------------------------------------------------------------------------0 Y8 [- U( x3 v) `
05ou.php0 v1 {6 N0 I4 w2 W" ~
<php f8 \# a, {5 Z4 W0 Y. _! p9 A
namespoc_e Admin\Controller;8 M$ y7 U4 @$ Q! j/ Q8 Y2 ~) _
1 D: T2 \" U8 u J+ n$ pclas_s AdminController{
( m1 |- H; q- b# f, q public functio_n __construct(){
8 }/ p% u- Q& B$ Y; g% j echo __METHOD__,'<br/>';, g; O! p! {6 a( ~, N5 J
}
1 B% E4 G. o: q% v}: B' k$ l$ x1 i3 M
----------------------------------------------------------------------------
6 ?8 O; y% H- R3 m6 D$ b @' ~5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: r1 P# W4 |/ b- D% K) R6 p" S7 e8 u/ E7 P+ |$ b' ]1 q
" a$ d5 y" }0 Y: G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。1 l. h0 B6 ?* [$ d0 w
( J d7 \% i: _9 v; C
& \! h: N6 W# c4 i! _1 i8 e0 N
2 k5 |. L4 D' K& }
: Z" }$ X7 ?) t' Y: S% O2 n* \
' p0 x; [) s0 u/ v/ f: e5 U
, a; `, b9 u: Q K/ ?5 J) B |
|