管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:9 z# S- `3 b/ M
8 F6 b0 e- k7 \7 M* }4 Q4 i
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
+ w* n; o( d# _4 w4 ?) q$ E2 {, R2 o
/ h: k; a2 |9 ~4 ^ T+ v0 D
" Q- M) i5 ~9 D1 {, Y我们来详细的讲解一下PHP中的命名空间:6 N/ z3 ]& |+ `; B" F }9 \
8 x: a. A% D& F" F语法:namespac_e 空间名\空间名;
+ C* v/ z( x6 R- _3 t9 B+ Y' [5 m" g, e/ G
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
. K( _/ l7 `. F& T( k) I: s; v( Y( V& Z
----------------------------------------------------------------------------1 B# M g7 v4 W9 x2 L
9 h* @. P$ P& s$ Z* c, U, y d<php
3 H0 K( |/ y7 W% s$ e( w o+ _ z! m- i3 P/ t+ V9 @
namespoc_e AA;9 w6 i2 `$ t& d$ G6 Z
functio_n showInfo(){0 |7 H* k: x+ J: @+ m2 g6 t
echo __METHOD__,'<br/>';
* h" g0 Y5 E. y7 }}" Q; G6 C) c0 \5 |8 F
showinfo();
" a. ^. n" r2 O7 H1 Y: M
0 t2 t- r! W8 i& t: ? }6 ^) S. nnamespoc_e AA\BB;+ o% q% d! u9 ^- d( m P
* d& W6 h; [- U( \ T3 \functio_n showInfo(){
; N* `# J7 Y" q& g+ h echo __METHOD__,'<br/>';8 m( c. x' X, u7 x) c$ r5 g
} A! U7 i0 w1 v
//showInfo();" e: L7 G6 r# y# m% t' ]5 h
----------------------------------------------------------------------------3 e1 C6 ^# w1 D9 ?1 x+ X
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
( g! U5 t+ Q8 F5 ~9 Z' Z) x- ?* }% _) E" c
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
' X" C7 H& K* ^7 Q$ H8 L9 Z6 J% r2 S* {+ z3 k- [
----------------------------------------------------------------------------) p- z; _! Q4 m+ J- N' h
/ | ^6 y+ h0 w3 p* `( ?8 {; i* z, ~
<php: V) B$ n; E, n6 x8 @$ Q2 C
namespoc_e AA\BB;
+ K- N2 [) D5 A/ F+ qfunctio_n showInfo(){, E6 A* _ ^* U8 P
echo __METHOD__,'<br/>';6 Y; H- g: z6 Q( }& ?8 v& I6 g
}* }$ d; }1 I! b+ ~- P9 n; E+ [
namespoc_e CC;
: a: m) y3 s) q5 P/ l/ K* ofunctio_n showInfo(){' w3 K: A1 ]: X+ }5 ^( J' c0 k
echo __METHOD__,'<br/>';
" a# O# ?# l, X- M+ X8 I9 A" p* x. ^}
9 A0 r2 d% Y& m7 H( nnamespoc_e AA;: ^- z. s* w; T' L1 y
functio_n showInfo(){
- R1 W# z) f. A" ]3 {# v echo __METHOD__,'<br/>';
+ b8 ~/ J) `4 S7 J, L5 K}
# K; X( r# F; Z3 I, T! W# C//非限定访问:用于访问当前空间中的成员
- k5 e: |" d1 w9 g$ q0 i5 IshowInfo();/ T6 [# b% M7 Z! L: r: n
//限定访问:只能访问当前所在的空间的子空间中的成员* Y( n) R- p6 M8 h0 g
BB\showInfo();
5 h" w( `1 s7 h' T//完全限定:可以访问其它所有的空间的成员% c1 m' Y1 P8 m
\CC\showInfo();& n) I# O N7 T! S4 `1 H) y
↑根空间标识符5 V( s3 N$ p, n4 j! d. O7 T
----------------------------------------------------------------------------4 M8 ~+ B2 l( o' j: l$ k( j
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:/ P: c5 X4 |( @
0 q" j4 u% ]* B) X+ {
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间). Z5 h! ]* T3 g1 U% y
$ p) T" j# w! c! I8 C
代码示例如下:
3 a" g. S0 n. F3 R- K
. [. N2 T- [9 D5 ] q8 f----------------------------------------------------------------------------* v& b" P* w& q1 G+ n
: f( [7 o6 S. M- o
0 F' a) Z* k3 G7 m& i% ^8 z. }04inc.php
7 {* x9 q m* O, S9 P0 s& C<php
3 |+ a: u4 x3 }' z; x; P D! I% h" k) Y' _$ N' V s \
namespoc_e Core;
: y: ^7 t' X9 V, r* Iinclude '05ou.php';
) v8 H2 I- q; Q$ K; Q S* X x( m8 wnew \AdminController();
- {2 w* `* s' B y3 sshowInfo();7 w% U9 R8 `3 f* s6 ]
7 S* y. K( ?" a7 secho P;
- v; N9 M9 g. d* f6 e$ r& N//根空间中的成员,只要类的访问必须加‘/’; W2 z( F/ v p% ]" _! f! q
----------------------------------------------------------------------------
# X3 r7 m4 Q/ l4 o' w( q4 B
% Z& [0 @( Y6 E05ou.php# F# F9 j0 T: I$ S& a( E
<php; Y% o5 |$ t, r: C
const P=5;
2 D+ v4 n% I9 t$ ^( B) e0 n
# @+ c* j. T, L f6 i# B' jfunctio_n showinfo(){
: m% @! \: z* v* R: S: v3 y% F echo __METHOD__,'<br/>';9 g: [9 a; U F& G' Q& z
} L3 `7 @& e! q! L& t+ p% c+ E* c7 j; I
* |& y* j* W( E% ]( d% Q) y* jclas_s AdminController{2 r0 u" G- b( w
public functio_n __construct(){
! d0 d9 `/ Z( A" Q+ U- D; R echo __METHOD__,'<br/>';
- Y$ v* C) k ` }
4 z* p/ `! f$ b}- z6 s0 G& {' }! y7 ], D! j
* e# y0 _2 ]+ x0 o* e
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: w2 U7 o% k) |) j( m
----------------------------------------------------------------------------5 s) l1 N4 {5 |7 c
04inc.php6 a, Y) w! a( y T7 f
<php1 l5 P% M9 n9 i6 F
5 f, b' N6 ]% o; b1 U% R4 c9 Pnamespoc_e Core;7 {6 _: U7 I* p% M d
include '05ou.php';
! j/ s& ^- Q& `4 Nfunctio_n showinfo(){8 ~ l0 X+ v3 }6 D/ d8 U4 O( v
echo __METHOD__,'<br/>';
5 q9 `: ^, v L$ V; {0 k; Y}
* B2 x9 r# ^ t4 n! R! y
4 D; V' e6 L z- wnew \Controller\AdminController;3 ]+ @3 P, h3 T2 j, m
----------------------------------------------------------------------------
) z% m1 G4 P! k& R. o05ou.php
, z& m A+ s* G<php1 r2 w- {5 g% P; R2 S
namespoc_e Controller;
- L) S; ?: t7 }0 R) o6 g" q% F4 I5 C& e0 |( I/ l
clas_s AdminController{
# Y0 h- D" t7 X U8 h/ h; L1 [0 { public functio_n __construct(){
/ z# {" G$ W; n/ k2 t- f echo __METHOD__,'<br/>';5 x* X* S' F0 @/ U0 K2 X
}; j5 i" b z; B6 V7 D8 V
}
) p) ]6 n0 B$ X; r6 i1 T----------------------------------------------------------------------------7 x5 r# M6 v, i& ?; r! m; s" i, p r
$ G2 Y8 l! {9 g; V
4.引入空间成员:
+ h% X: h `' \* B
) r2 x e: U) Q8 D; ^1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
" q% [0 c$ f7 `/ Q5 M) N& }. @/ n: e0 R& g8 Y2 R
---------------------------------------------------------------------------- G1 M& e4 `, E# j5 N( \- D5 g
0 w. o& l0 w8 N6 t
04inc.php
9 a' t4 ^" i& q: b% _( P<php3 o$ B8 X1 J6 |& W. n7 R K! }$ K
namespoc_e Core;2 t$ C$ b, Y3 Y% k
use Admin\Controller as con;
# {- ]3 \1 k- d0 s$ Q+ D* h
9 Z+ K& g. H* m' u# P) H6 pinclude '05ou.php';8 l+ ~' L u! E) S
7 o) o# {& t( ?8 ]# Enew con\AdminController();
) I$ q, ]0 h B2 f----------------------------------------------------------------------------
6 O$ w; ?1 L# ^5 }05ou.php2 `! z; ]' a& s
<php
6 T2 a% O4 M* V) Gnamespoc_e Admin\Controller;
6 e- w' y7 Y) f% v! v6 A4 w! Q7 Y- G; Z. K9 N
clas_s AdminController{
" x8 u3 s* g& g- F public functio_n __construct(){
2 N0 y% X- v- J- j2 z echo __METHOD__,'<br/>';
% p' t; ?9 T1 I }
* X1 `4 \7 p" F' J4 ]4 N9 J" Y0 {}/ z- b0 H% R, m
----------------------------------------------------------------------------
2 m$ F6 A$ ?0 H$ ?5 [+ A# d. ~2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
. `1 [) R. K9 b" k" v. F* Q r
5 e; ]+ Y, I! l a) A) ~6 H4 q----------------------------------------------------------------------------
; a/ ^ l: R8 h5 m9 R# b/ g
5 p8 P/ B N7 [04inc.php
- I& X- q3 f3 n3 o7 ^$ m<php; E6 J: G/ k F. X2 |
//引入空间成员类
1 m8 A2 M k) E! u6 {( q' |' _2 C3 {- }5 n
namespoc_e Core;9 X6 d/ |$ V9 v( I
use Admin\Controller\AdminController;5 i8 d- K' T8 s1 u( [
include '05ou.php';
9 Q* \. |& B; A8 h6 s0 q y9 z* ?( u n8 k4 P8 h, K. |: _
new AdminController();0 A) J- U2 |2 H5 c) {8 W$ Z' E* Q
----------------------------------------------------------------------------1 A3 w# Q0 d& f' F8 A% R* L7 }5 U
05ou.php3 _7 M2 Z7 L3 U' Z6 Z9 M* X) X
<php" j: {$ K% u8 h% e
namespoc_e Admin\Controller;( \2 |9 |( F5 O" f4 S
/ C! H( a. d K/ f, T" Qclas_s AdminController{8 e8 O3 a! ]4 B( x
public functio_n __construct(){$ K' D* t0 T1 Y1 M
echo __METHOD__,'<br/>';, _6 F# F% w3 P( k& @) m
}" u( V6 m. d: @. L2 e& `4 u) b
}
9 q. `; B, s& [8 q5 I----------------------------------------------------------------------------0 _( y" ~/ J* b/ T
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
$ E& q5 {, S( p+ R1 _# i0 _3 W9 ?8 w6 a" }# E: \
- E! F# I/ R/ I9 F$ |
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。8 d) u0 d5 S' ` m& I, `
2 E. U% g4 p2 m7 W, _
# @) F- q2 A( R, z* t. ^5 k) F `
" i4 i+ s5 \1 N7 D6 k2 L% b' n& O: n8 L0 G! Z
8 N1 `3 f: Y: J; q* D1 a& O& @- ^
|
|