管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:% j, A2 }! A6 l# i
. R9 G/ v, o1 h9 A+ S$ A在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 q' |/ ?2 r- N, F4 Z1 u. K4 n
( ~5 D7 P; Z' c2 C# @
' H( E, x! B7 r
8 g6 q0 ^1 k" z- s2 S! \我们来详细的讲解一下PHP中的命名空间:
) u2 [+ B3 A$ h( Q5 M" E4 c
; @5 {% e% l% X1 L语法:namespac_e 空间名\空间名;
- H V+ a; e& H3 Z& M
: t& m7 X) x2 M说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
' a7 t- J9 }& K& q- ]4 f4 e
7 M2 i+ O7 ?& H( v* p1 Q3 N----------------------------------------------------------------------------( L$ I) n+ L A) v
' y. X9 ~8 W# r" t* w/ n1 x
<php
G2 q3 {4 \7 z. b6 [/ m7 G& z* P; Q& G7 x# z) H- A
namespoc_e AA;
$ D( z2 x2 k! d G8 R/ dfunctio_n showInfo(){
3 e% X; R3 w9 S( B* w1 p$ Y: g echo __METHOD__,'<br/>';
, P7 s* I( |# z}
+ F6 F' v2 ?" `showinfo();2 k) _, p5 x0 x7 R( D4 l
- X4 h, d5 p, b5 z
namespoc_e AA\BB;
6 N# u; ^; q% N* z: v. l& \: k+ n+ o/ H H
functio_n showInfo(){5 e- E" F3 z5 E! [ x! S
echo __METHOD__,'<br/>';7 _ R. q! z* v3 c
}0 }7 Z: L6 I. V4 j, `5 }
//showInfo();
0 @2 D2 E1 q9 u1 d' a/ U% u, D----------------------------------------------------------------------------
' g {" _6 W. ~" u2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)6 b3 v: f3 [/ u: U( [: P4 `& h+ d
+ W% M, E3 k: v! G6 Q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
/ k% F7 x. j! {: A4 V* a1 I r) C7 Z4 Z# q5 C
----------------------------------------------------------------------------
2 ]0 Y4 k4 S, D6 f9 x# B8 _* _' U
<php+ ~9 N( z- @& \& L) `) n) h& t
namespoc_e AA\BB;0 o) P) U( V& n! L$ i5 m
functio_n showInfo(){
/ @* m6 c; K. J A3 i1 h/ ^1 v echo __METHOD__,'<br/>';
1 b, Y4 B0 r" c}0 l/ B0 P, Y3 _3 M! _
namespoc_e CC;( M0 v$ L# s( `
functio_n showInfo(){
( w, S1 n7 H+ l/ ?2 h7 s echo __METHOD__,'<br/>';
* y3 E+ _ q w' S; O' N}% k" L& K7 W! {: _# N5 ~4 X3 k& f
namespoc_e AA;
) f6 Y- u+ ]! C4 h: Kfunctio_n showInfo(){
: K6 T/ D! G+ Z: _5 A4 ?7 _5 t echo __METHOD__,'<br/>';
4 M) W1 D f2 b) i& t}
$ {2 D" F5 R2 h# ~" P, t//非限定访问:用于访问当前空间中的成员$ a1 q( i; E, k: C
showInfo();; t: B% i6 P3 e# |) M& b
//限定访问:只能访问当前所在的空间的子空间中的成员
0 u4 P$ @, a$ x5 F8 ^BB\showInfo();
U0 N9 q! B& o3 [8 }//完全限定:可以访问其它所有的空间的成员 [' w* M' {! \% V g
\CC\showInfo();
4 V# {8 j% N5 ]6 |+ k. U) D↑根空间标识符( p: z/ j" K k' }
----------------------------------------------------------------------------$ W7 j d3 s0 r% }* ?9 `* I( |
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
; v9 f7 t, F% T( L
! i7 x( l4 G: S当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ X% s) e% {1 V/ m1 _+ H) ^
1 ^! ]5 q8 A& H# v* y代码示例如下:/ b. x$ U' H+ U$ g# d' b+ k7 u! U7 g4 J# u
: j- w2 M% @5 ~% h
----------------------------------------------------------------------------
+ \/ x Q( E& J1 \. N1 {( {: G
) i. I. [$ ]! R3 b# N9 p" u& l" l8 o# G, T2 H" b0 u: Q
04inc.php
1 H$ P( g/ t. G# ?' ^<php/ e5 [* Q: f6 B
0 {( O I' s* Z) \namespoc_e Core;
5 i! U6 k: K6 ?include '05ou.php';+ K j) y4 n8 } W0 @5 N
new \AdminController();
/ a: `" }) O5 Y2 X1 zshowInfo();! B2 W& @& Q3 q3 K* S/ A, u
, }" ?2 y% X2 U/ d4 h
echo P;
- p2 D2 v6 q" s+ @) d0 D//根空间中的成员,只要类的访问必须加‘/’
6 j& _9 A% A N8 z' J8 b- f/ ^6 `----------------------------------------------------------------------------
7 P- P! v0 B5 {: S" {7 s) U0 E; b/ ?2 P
05ou.php& n. \: }- ^9 f0 z$ m( {! L
<php8 J" z* K l o- K5 Y# J3 H" t; N
const P=5;
/ h8 K. ?- Y" w1 s: e: g
% ^ c' G0 j( \functio_n showinfo(){
2 F. b5 Q% k" }/ U: f echo __METHOD__,'<br/>';/ W( j( m5 @9 E8 j! n. \
}
* ^: t/ H+ K, ~3 O. W& `2 g6 E' T( m! p9 P" T. _2 G
clas_s AdminController{
+ b# w. z1 M4 s, D4 R public functio_n __construct(){
! S* Y6 W3 I; M6 X+ L echo __METHOD__,'<br/>';
0 x9 i, n5 j( v2 P, X }
; Y7 ]. Q6 e* X1 E}
: ]' s* q3 J/ B! s
* ]8 r* i& {) B3 @. O: n4 d第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。; r! T8 Q* ^9 h
----------------------------------------------------------------------------
. Z) b& o& ]; |& z% O- K( j! k04inc.php3 u" H" b, ~6 H- l2 w8 m
<php4 J. {* [6 q! Y& t/ j+ t
2 |. F, D9 n. N/ bnamespoc_e Core;
/ d* I9 i0 R4 U/ Z% @: w8 ]include '05ou.php';
3 O* e8 n, q. vfunctio_n showinfo(){2 R9 U# R. O6 J
echo __METHOD__,'<br/>';5 h9 g3 c* E/ p* z
}
" V5 T- z- Y E: O. z6 b$ u" N: u6 u- |! T, I/ C' p
new \Controller\AdminController;5 m2 ]" u5 L8 g. D
----------------------------------------------------------------------------
% {% B$ f. d% |& f& w05ou.php
2 u4 N6 k) V; T) T% c6 ^<php
& R7 C' B- W7 z& ~6 D* K6 g3 Tnamespoc_e Controller;
% o' y9 U, M5 p) k: U# q
7 s- S. I% `3 f+ c4 Vclas_s AdminController{3 M& a) |2 `# a3 U6 |( Z k
public functio_n __construct(){! e1 M" b$ U1 h' I; C2 M
echo __METHOD__,'<br/>';3 `0 r) B; O& i4 m
}; O/ K2 D* r$ V& W1 z
}
9 b3 o$ g6 K2 G3 t+ v* K, I! f----------------------------------------------------------------------------! @' ?7 R% q9 q3 a/ u2 t8 K
, S- N2 K. Q. ?( \8 F" p4.引入空间成员:
" a/ q4 S& X+ f' k& a+ ?1 t. h, T* I6 [8 b7 C& E$ O. P* l% F* A# Y
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
% x/ Z0 R0 s% n0 B
$ f5 N2 H/ S) }2 ]" }! P% Q----------------------------------------------------------------------------
5 L0 C" _& ?3 g u+ o+ G" K! |9 m) S1 p+ U, d
04inc.php
. D4 W% @ r) r- `7 J) V% [<php
+ W! T% s# m' c) Lnamespoc_e Core;' J- h$ S9 b @ j- u) t
use Admin\Controller as con;
1 J, |# p$ }/ p& o# _! W& U! |9 I; Y. v7 g
include '05ou.php';
- S) h5 h' q5 L5 t& Q
2 n2 H1 T% j' _4 A0 Dnew con\AdminController();
1 \& }6 B/ T4 h3 m, Q7 D X9 e- f----------------------------------------------------------------------------9 A, v" y) I1 A& y8 z% C1 B
05ou.php
7 o9 R' s. K, O8 z# ?5 a<php
( f; Z E/ E3 ?* d' Xnamespoc_e Admin\Controller;7 t; {: y+ m* D8 C* z l |$ h
n$ L4 ], o- Q3 r( H1 f
clas_s AdminController{) Z0 i5 U4 X7 ] e" w2 K8 ?3 G
public functio_n __construct(){
) d. G: R: P3 g) i2 N3 i echo __METHOD__,'<br/>';# s! q% K; o$ B( F
}, y$ `# S1 g* T" U2 B+ S3 j0 K
}
5 l' }' B' R: M3 k; S k----------------------------------------------------------------------------$ ?6 N$ V8 E: I7 S4 U; x* |6 C& @
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。7 e K' @; k/ `6 o+ r5 q
& D, p2 o) \4 a
----------------------------------------------------------------------------8 }4 W$ c( X k' J$ d- G" @
' X4 o/ y9 [8 y+ R04inc.php
$ o/ h/ s2 l3 [% P6 L5 X5 K# g% M<php
& K" j0 @! n5 L" ]" M6 f L/ U//引入空间成员类
. O: y% \# ^1 g4 G' Y4 @) K+ D
1 ~$ k, D/ u) F7 ynamespoc_e Core;# t/ J: j5 t7 `' H. ^
use Admin\Controller\AdminController;
1 K7 G& _9 E% U# I3 Kinclude '05ou.php';
3 A3 e# G1 G+ F5 b/ V
. H- e2 U( @4 l5 `* Y5 |- r7 Ynew AdminController();
: J, B" T$ t0 \+ `$ C----------------------------------------------------------------------------
7 s c5 W R! U& c' E! f% p1 u05ou.php
5 I) o3 w- [8 [* \8 \<php
- e( N% G4 L. U( Snamespoc_e Admin\Controller;: i" q/ S/ C. Z8 n8 [
, A- w. q' O8 N2 h0 lclas_s AdminController{( A$ u6 t0 q+ D5 f& h: e
public functio_n __construct(){
( `# K2 G/ T& p0 R: |0 K2 C echo __METHOD__,'<br/>';: X$ H, Y7 p1 ?+ F
}% d- ]/ T4 k4 ]6 A
}
% }0 F6 F; J5 p& E p4 I& h----------------------------------------------------------------------------- V/ E7 [* i7 ]* i
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。; q/ f; B; V6 X$ ~
* h$ t- {7 x. m' g* T0 Z
9 I# ~+ c! L# I/ X这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
6 U2 w# ^: \- q3 ^0 Y! }
, Z- g1 m. x- X* _9 K' G. d5 o$ Y4 z, z2 g# n6 D9 X
, P4 p/ r6 j3 Z7 G; b( f, ]
8 B4 u- \- Q1 g+ x' k! S1 ^; {2 N5 l0 k& ^
1 w0 P1 B* c1 P' {
|
|