管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:; b/ r; v# J6 c& p
0 n. v b" N: Q+ S: J7 T j在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:0 Z. z1 v% ~0 G+ W
& ^9 v3 g" d( F5 p# w
! O6 S2 k$ \+ c3 i, u+ ?! n- t* ]+ \0 V* K; \+ l6 u
我们来详细的讲解一下PHP中的命名空间:% q0 A& E) [, ?! g9 ?
* c3 |0 f# m: t& v* V2 M
语法:namespac_e 空间名\空间名;
- K( _& S) D7 \/ N8 P5 r% S4 u
* C7 ?8 q7 w4 _" U- {说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
! z' ?) x# s: J8 c+ U, c2 H/ F4 [8 T$ a% Y
----------------------------------------------------------------------------' Z$ U4 F% i! R2 [
8 x9 c: R0 u% r3 K
<php
4 F3 t! _! M) [: }/ W; W4 r7 u% f3 W0 @
namespoc_e AA;/ }- @8 k/ k( b9 m7 ~
functio_n showInfo(){) a8 i) K. F" N' h0 w2 l
echo __METHOD__,'<br/>';7 Z4 h+ A7 f8 X7 \
}
& v V) m7 _3 U" \, K9 F0 vshowinfo();
% P y4 Z) Z% r8 _- x. e1 ~9 G; X, R3 c
namespoc_e AA\BB;
, o, L2 U$ D: P( W0 u
, e* G8 m3 ]( J/ c) U+ tfunctio_n showInfo(){% w+ Q9 m2 }" e% Y+ J% \- q
echo __METHOD__,'<br/>';9 ^! Y8 S# `: z- G1 }( u
}
. r8 [, F0 `& A//showInfo();0 |2 ?6 X }6 R9 \4 s; r+ r
----------------------------------------------------------------------------
' ^0 x& H8 s+ y0 t% Y5 b2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)8 T* {0 S( I% r( `( O
% U7 _$ ^( B. _" s% Z3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。! j ` ]; r" b5 [6 a6 s5 {4 R! T0 G
, |9 E2 N. @8 I
----------------------------------------------------------------------------4 l( d. s" M2 c! x6 f, ?
# j- r5 K( w* y; D9 @7 o" K2 n8 }. w
<php
* I" |/ t/ M# E* e& V( enamespoc_e AA\BB; }( }+ U* a2 e; ?, w
functio_n showInfo(){8 a# q& L5 [+ g: }: i2 y; i
echo __METHOD__,'<br/>';' } z' k+ T% P) m: Z7 ^4 U, ?
}7 v, p3 D6 E+ ~3 Z) m
namespoc_e CC;$ q, ^5 p X6 X1 C; ^- h/ V* Q$ M
functio_n showInfo(){ f1 R2 m1 Y. n$ _: b( ?
echo __METHOD__,'<br/>';
6 Q, D0 k+ |$ Y* T+ G; V# ~}* Z8 i3 ~* `$ s. m, R: i
namespoc_e AA;; g- I# O! O( J0 L/ }& T# ~9 ?0 }! R
functio_n showInfo(){- C4 p/ _) G0 I: @# w. f
echo __METHOD__,'<br/>';
. r; t4 _3 t: K$ V3 ?}* {/ Y# `+ d& e, Q% W
//非限定访问:用于访问当前空间中的成员
! c) a6 O/ Y$ |) IshowInfo();! o4 x+ k& \* e
//限定访问:只能访问当前所在的空间的子空间中的成员
y2 K$ o% O) F# S* J5 UBB\showInfo();6 d& d6 C* B6 P; Z" u
//完全限定:可以访问其它所有的空间的成员# m) D. _! C2 y) A+ x
\CC\showInfo();! O, Z' x7 q7 D) H! I9 o6 c* h
↑根空间标识符7 Y9 p9 y, P+ {4 v T+ z5 K+ I
----------------------------------------------------------------------------
& V5 t# V! y, \+ D; q- t3 }' ]- {8 P但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:* _$ t- H* X0 I& S, N) P, q' P
& J0 G7 j) O- l* N @* Z6 w
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间); c, u+ j* c1 h' z, k$ e4 q- @
2 f/ d- Z: ~7 Z代码示例如下:
3 q6 r2 o d: V9 x: K$ v% r9 i" T) x" J& X
---------------------------------------------------------------------------- a8 I* r( s, Y2 |$ x2 l" {% }
4 D% U. |; a$ k* s8 ]* ~- c) }
7 q9 q O$ J0 F6 C, z2 l* G4 r' S. ]04inc.php
! l4 F L6 p( d<php. m% L ?! x# K3 u6 ^
u( b) k1 z0 C. _$ N, L2 Hnamespoc_e Core;: M% g9 u" X, P! [8 k. z5 ~0 ? c$ o
include '05ou.php';1 b) q' a; s' A4 o; u* d8 b
new \AdminController();4 Z4 d6 i% a- p% v
showInfo();: X8 A% ]! z; ?9 c
/ }& `* ^7 n S, i9 y4 i- y+ Techo P;0 B$ m3 |* q& h& f8 L' z
//根空间中的成员,只要类的访问必须加‘/’
8 s) S3 X4 q0 p% [3 `----------------------------------------------------------------------------7 S) B/ e, P: X8 Q6 u
& J" Y) f- r: O05ou.php
5 O1 y9 R! U0 Q' G<php
$ q6 d2 F- n0 ~8 j+ g" W; h0 K+ Q$ cconst P=5;) K* C2 D2 G2 G) b2 e4 n
$ {1 O5 A2 O1 z3 ~9 ~; y5 I: J2 rfunctio_n showinfo(){2 X. `, p. H5 r: X* w
echo __METHOD__,'<br/>';! h# g- w5 Q3 _, H
}; v* Z% z4 R5 V
2 D8 @8 c" b0 j' y+ r- pclas_s AdminController{
; [+ l9 v6 U D/ z7 y9 S; E public functio_n __construct(){/ ^+ Q9 }9 @: n
echo __METHOD__,'<br/>';
/ f; a: x- o! I! F; B) v- q }
3 B) w1 z. }. S0 m}- t- k! R0 k. w0 C* C, E& U1 d
) P4 o1 v3 c* o第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。$ V/ E1 U. s x4 W. h0 p
----------------------------------------------------------------------------+ }8 w) {! g4 r0 ^5 t
04inc.php4 }! E5 B4 _ F
<php
/ h+ G* M5 c3 M) q$ W& K
" Q0 ?. j: ~- j& n) Onamespoc_e Core;
& K5 K% H) w2 U E% q$ Iinclude '05ou.php';
/ `1 x% C& ~1 o. @; bfunctio_n showinfo(){. A$ f5 x! c8 T
echo __METHOD__,'<br/>';/ l5 L- U( q# A5 u4 Q
}8 Z3 p8 J# l Z3 Y7 \" F- y
# P: C8 W7 O4 P: C8 wnew \Controller\AdminController;" s6 F3 B2 R1 `8 ^9 f- d
----------------------------------------------------------------------------
; |: u" N9 ]& s ^05ou.php
) U0 s4 S2 Q. C8 a9 e<php9 P" q4 ]$ k. g; Q1 z) r
namespoc_e Controller;
" h! z6 w% S0 j0 L7 s% G. ?( }9 A$ F# E( {; W c
clas_s AdminController{2 X6 y- b7 O k% G9 c. w
public functio_n __construct(){- N9 D8 ?' b% _2 P G$ [
echo __METHOD__,'<br/>';
# f( O g- B6 t }' A( d# Y& o5 n! \% X! y$ m
}
6 p, o) p' k6 }, Y----------------------------------------------------------------------------
' \$ J9 @2 R) ?7 ^+ ^, C2 J# o: R4 j
4.引入空间成员:& \# X: {7 O2 X$ {3 z
/ s/ D' W1 x' e) y. h1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。6 k- D& J) T( h% Y: {
& m2 r. o" X, ?! s
----------------------------------------------------------------------------7 \# S5 a `& f( }# M1 C
4 C2 q; i# U9 V/ I8 v
04inc.php
* A, ^" N8 l, J! k$ {: p' R* ]: ~<php2 o+ D3 W/ f- x! M
namespoc_e Core;1 t3 x3 B/ D0 @+ P# g
use Admin\Controller as con;
9 ^' y: Q, j _/ B5 v* c! f% H9 X2 c/ M5 ?- r, H
include '05ou.php';
# ]5 j- ~3 a2 L
& v/ U7 k7 r* T8 ^" B( b$ onew con\AdminController();
9 t. g0 x3 Q3 J# f' d" u----------------------------------------------------------------------------& d" M: u$ V( z2 T
05ou.php
6 D7 V5 O1 z) `+ f# G<php
: u- V( j0 ]. S8 Y+ ~$ }namespoc_e Admin\Controller;( B% y! E( m- U+ }8 k; R4 k
' P) D, g* p7 h3 i$ b* r, }9 p: `clas_s AdminController{
7 P/ G1 O, ]3 A; _ public functio_n __construct(){
0 P8 n, K7 \+ w! S% G9 U* ?- g7 t echo __METHOD__,'<br/>';
4 ?: `6 C* X0 }' A% E& \$ ^$ u4 e } b+ W* x! R% m% H: V/ t$ R. S
}6 a% I& Z3 D$ A' U3 w6 f/ X
----------------------------------------------------------------------------
' j6 r* Y" A5 z1 w5 H I. C2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。 p# w3 `3 U; B; m ~3 y
) f6 w5 Q( k" O8 u6 m/ L5 T
----------------------------------------------------------------------------) K! j: F, ^' }* P4 z, p: x& p; \6 z5 A
+ \1 E0 k0 J. G) m" d$ x: a" i1 q' t
04inc.php
8 G+ T% @( l8 T; w8 P3 J<php
* f& N7 h; S, }! ?: _//引入空间成员类( h( P. b) H# _: H- P. y
- w# H. {' Z- Q+ H8 R$ O$ j9 v- nnamespoc_e Core;
9 ~7 Y1 m4 M6 z" r2 A5 Kuse Admin\Controller\AdminController;7 f1 ^+ ^7 L5 |9 _: _& h
include '05ou.php';
$ H) ^8 l. ~. e+ B& W
y+ R5 H) D' A% X" snew AdminController();
& A9 }8 a; v* b* H8 v! w----------------------------------------------------------------------------
1 |1 z& x: Q' |05ou.php
9 E" l- }# T$ }" q2 E2 z<php
S0 X0 x3 J% x6 ?) Nnamespoc_e Admin\Controller;
6 m9 I* A r6 m# l
- c# J+ O% n) ]! A, Z0 g/ T. {4 z3 n+ aclas_s AdminController{8 r6 i" e. B3 I$ T" a7 L
public functio_n __construct(){: m$ _, s n8 R
echo __METHOD__,'<br/>';2 r$ V( F+ ~9 X5 o! t( x
}
2 ~$ i: A X; [5 n} K* X/ v8 _" ?& ^1 y
----------------------------------------------------------------------------
& n: S& r) s8 U! n5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。; o4 h( f7 p; q! J
6 j% g }- ?8 I: C# g
8 V6 H1 K" Z) D0 P" w这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。: a$ S: c. W* k; T. _; ^2 D
4 }- s% Y" T$ }, Q. U2 W
8 i+ }# r( ~# ?' a. I
8 v( n9 c- d+ z D
) t7 @- }' r4 x
$ P1 P! i# l7 i L% I9 K
. f& s9 a3 {, ^# n |
|