管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:8 ?: g2 }! G0 V5 o5 r6 a
9 x% F2 u) z4 c. ]$ {
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:; O9 C V4 [8 _: M; {# F
# ]1 p. S l4 I! E
5 L5 I. i0 z) i/ ], [) o' F
* D6 o1 Z3 k+ X# @0 g% ]我们来详细的讲解一下PHP中的命名空间:- L+ P* z( f+ G8 ]$ G$ g
/ y* L6 ~( |7 o+ a: R4 u/ W1 T+ \
语法:namespac_e 空间名\空间名;" P" Q3 X0 F& P& Y+ I: [6 F
, ~- U% u+ C- Y, N说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 Z3 |# p0 @0 z) ]: f7 T2 O; v+ j* q! I
----------------------------------------------------------------------------9 P& j$ g4 k7 z6 J- r+ B8 `# t
8 g6 C0 i. Q; B
<php3 p2 c1 x1 N4 ~( r Y
; Y0 z( o# k; o2 z! A- F' rnamespoc_e AA;- M. N8 ^( A- @. m3 D
functio_n showInfo(){' x0 f( w! g4 }0 k- ]( D' w" {
echo __METHOD__,'<br/>';+ \+ e% U- b. }. m. \8 x7 @1 o) D$ D
}3 `3 m' f% b3 ]& G; P
showinfo();
& }* J1 v) s5 I( t0 ^, T" D- M7 K/ c
namespoc_e AA\BB;; q ^( g, W. i! \) P6 R
; o, I4 ~% [7 ?" ^$ ofunctio_n showInfo(){
, u% ]7 Y6 T$ o _# T5 O/ a echo __METHOD__,'<br/>';- ^8 o- B( @. P4 N& \7 O! e
}; Q, D& z/ u7 [
//showInfo();
- W3 c! t# b' R----------------------------------------------------------------------------
, G7 k6 c5 p6 m2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
0 a3 [9 [" A& C9 T( n7 k5 X' z. c, O2 \: G
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
( m% v0 U' L% [# E1 l3 A8 H" m' \! S6 |2 V: c) J5 f/ X6 t$ V
----------------------------------------------------------------------------3 m! k6 Y1 [4 n8 q3 c) P
- `4 L/ I ^: P$ w4 }1 r
<php8 B0 w# m- t0 x) P) l/ p
namespoc_e AA\BB;5 i! g& t( n5 v& n. ?. A9 V
functio_n showInfo(){
3 G$ l% S. a; L' n echo __METHOD__,'<br/>';
( g- r$ ? c e6 `/ A}
$ `( b! D: R( |2 }4 p# anamespoc_e CC;
4 c9 X) f1 g2 a6 ], a+ {; tfunctio_n showInfo(){
* y# E1 n0 `0 v echo __METHOD__,'<br/>';
$ G3 i- l* K. z" u6 ~1 T! x}$ F0 n$ [" L$ m- C9 ^# W
namespoc_e AA;) S+ x" h+ l$ g5 R% _
functio_n showInfo(){. l2 H* A6 ]1 I/ N v
echo __METHOD__,'<br/>';
+ Y8 r6 S' N; c3 O6 E}% {3 g8 k5 _* s u
//非限定访问:用于访问当前空间中的成员& s9 P# b4 ^$ ?, Q/ u& r
showInfo();
2 N# N0 L# ?% i1 s1 l0 _2 O//限定访问:只能访问当前所在的空间的子空间中的成员1 t z4 @) i1 d# ]) A
BB\showInfo();
& y$ h4 {5 b Z//完全限定:可以访问其它所有的空间的成员
2 f$ K5 L# S' Z\CC\showInfo();
/ d' {0 g# c$ R- I" t↑根空间标识符1 c8 |9 M: r ^/ c
----------------------------------------------------------------------------
( Y, ]) {" t- C. F* h0 u$ e但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
% I7 c/ k9 b% z' F1 _& } A' b# X# t# r0 z
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
: a# G8 m& s. p; _
3 B! r3 J. W% }: F5 S代码示例如下:
& o- g5 j$ h8 b) n
2 ^ Q$ v7 ?$ T----------------------------------------------------------------------------
: `9 b% k9 k* J6 t: K! a, `! x9 m/ g3 Q- ` L/ E
( g2 L* @( n8 ~, Q9 p, |7 T* _04inc.php
- m7 G; _* `/ Q4 L0 y<php
: ^4 |$ G" M& x K
: G6 Z# A4 |! qnamespoc_e Core;
' d% |! A8 ?4 C5 R1 @3 g5 z6 G' E3 pinclude '05ou.php';
; N+ ?. f5 Q$ h, \& ^. l& I: mnew \AdminController();
, l* h5 a, ?2 f6 W' Q/ pshowInfo();
3 u% X g. y$ }( \7 U4 Q; {# K
4 B9 b2 X% v3 `3 o8 i a: {7 Q8 Becho P;
/ u6 B: w& K1 S( t//根空间中的成员,只要类的访问必须加‘/’
- E6 l3 w% }5 r8 y3 M6 S----------------------------------------------------------------------------" G8 Z- k) O/ R8 S( \- Y8 C% J J
G) M8 I; {- a, z9 r5 P; y
05ou.php
- F9 y% R" _6 ]0 U; \; {+ I4 v' A<php
! k( x& T% S3 W; P# Cconst P=5;
# W/ R$ A9 b! c9 q; C# n1 ?. ^
& P/ P9 w: e1 z- H# M- l4 ffunctio_n showinfo(){
8 N) I3 k& a8 {" ^9 C echo __METHOD__,'<br/>';3 _3 z* I8 O* \; l$ L4 \! ]
}: i$ t9 s2 _5 s! s7 o) r. y
" n6 Q/ J& _$ V) ?1 S- v5 S# P
clas_s AdminController{1 l9 z7 Y7 f; |+ t& u
public functio_n __construct(){
/ k; ]4 s. x8 C- E# \- d echo __METHOD__,'<br/>';0 n3 W/ T8 y) y3 q; ~; h; v
}: \/ i" u; r a- i
}( }5 l% }+ R2 g* f
4 @5 l" X9 ~- _
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
8 D7 e$ j" H' T+ [----------------------------------------------------------------------------
4 K2 d- A( F8 g {# C- Y: i04inc.php
% I/ e" h1 n5 Q% ?1 _<php8 `8 ^) F( z, ]0 g
# S r9 U5 J% Q! h0 g+ jnamespoc_e Core;9 j! Z2 ^# z2 F8 k: n
include '05ou.php';
% F5 w: F0 d4 @( k" _functio_n showinfo(){4 G G' F9 j. c3 q
echo __METHOD__,'<br/>';# ^$ x" E0 L B' Z1 j
}' H8 i. ?& b" s9 `' K/ F0 P8 S
! P& A+ {* M! A5 A- p* lnew \Controller\AdminController;% g1 z" _$ y1 T( f/ H/ G
----------------------------------------------------------------------------
$ r( W5 g/ [& i( s2 F& s6 X05ou.php
; \, i. H4 p* |6 F ]+ A# m<php
( k z+ A' v2 j6 V/ u: znamespoc_e Controller;% ]6 p2 A: z9 ]: @1 R$ ]
. i/ Z. K1 m: R7 [4 d+ Jclas_s AdminController{
$ g" Q9 k6 e1 c" m) ]. G1 K( h public functio_n __construct(){% j; h4 g% @% C" y
echo __METHOD__,'<br/>';
9 I" @$ p# m p# l6 O }
0 _7 D9 q8 o3 Z5 L}
; \7 e- Y/ e1 v- U: ?----------------------------------------------------------------------------
: A, C: l6 N% ?7 k9 H" ~
5 k8 j- w; }# E4.引入空间成员:5 f+ i3 b4 d0 k: D/ a6 `& D
6 [; a- A1 v, i1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。6 t m A4 e/ E( b9 L4 g% ~# c3 y
# S+ V8 ]4 i- {' s- J" e----------------------------------------------------------------------------5 `+ A! x5 K3 N- T3 g; D
7 m6 h" V% D2 y7 N4 k1 `4 K$ `
04inc.php% L% q5 x2 h _" g6 ~9 L6 `. `2 o
<php K g( {1 E; U( `4 B# H$ i
namespoc_e Core;
7 `! u* l* F6 ]- Xuse Admin\Controller as con;
1 }" q$ N! p7 X6 T0 ~$ } l' a$ B$ Z+ T! `8 y3 D% @! U" x
include '05ou.php';
) E1 w! d' b0 R& O
8 ] \% u" X' x- Y" r" e( w4 ^' z9 jnew con\AdminController();3 t( d$ e2 ?9 A" A
----------------------------------------------------------------------------
! Q5 i+ v# N7 E9 }: E1 c/ j6 r: t [05ou.php
4 |$ u1 G/ F' Z! v7 ]4 ~<php
" x+ ^! A9 D# x! _namespoc_e Admin\Controller;0 p6 _; {6 T5 F: _/ A& b) [
) v4 J& J8 ?1 t0 w' F
clas_s AdminController{
; b5 `; P5 w% Y5 H5 t6 N public functio_n __construct(){# o1 {3 a% K4 L' J, ]
echo __METHOD__,'<br/>';5 t b8 ~3 F5 K4 Q/ C
}
/ x8 a1 a! b3 q2 n}. p& R, G/ v7 o
----------------------------------------------------------------------------+ w9 R1 p7 b# I, l
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ \. v1 h- [, e. g/ I, o# e
/ m: [0 x1 U; y----------------------------------------------------------------------------
# I4 s# u! a# b: P5 u. F; j
3 z! T* b0 m7 ~3 v04inc.php+ M5 C+ ]% B6 G) U2 G) |' H
<php
. Z8 U. Q6 c! ^1 q- U, f1 |, n3 V# B//引入空间成员类
$ m4 S+ a- Y# s) A% B4 z- B% d* v0 |# U+ B% p, f( p J- S. X3 P+ k7 A
namespoc_e Core;
6 S! K' `& W9 S; e- \# ~use Admin\Controller\AdminController;! ]. M6 E' K' A2 q ^
include '05ou.php';' [( K6 b. B3 {
+ X# V5 p3 Y# xnew AdminController();
! T) H! ~% J* n( E----------------------------------------------------------------------------& q. H* _* K3 Q
05ou.php: u7 G0 r% z. [& I1 S( Z1 Y
<php
0 K3 y: @: j4 b& W+ K. L7 Lnamespoc_e Admin\Controller;5 r6 ^9 m2 [3 r9 C+ e* Y8 X
" Q' q7 j3 f$ @: b2 N- i
clas_s AdminController{2 L0 v F* R4 n
public functio_n __construct(){
2 F8 E3 A! E5 m. t# e) J echo __METHOD__,'<br/>';# O+ n- z' e k/ W
}
' ]+ f* V$ y* K}; a6 i4 m+ j, k* p: A- }. t3 R
----------------------------------------------------------------------------
+ o, `, `2 _& e5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。1 p+ n. X7 V' F) x( r: Z5 \0 x5 }
0 p; f' Y7 N6 X: {. o3 k& N, J7 p& P T
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' u" W6 ?; _$ G( i% O4 h9 V7 u& g. i6 R
R' u' {1 w$ c3 g- C) n6 D1 R# g4 Z Z, \
z$ r& w I& E! V' u# B% c" e( X, @8 @8 Q. B" y2 y! g
, Y, w+ `. q. O6 w0 U |
|