管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
+ E3 C4 `. L# q/ l) N [2 `' l0 B
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
! C: k8 Z1 [% O7 W& R
4 a. h7 [' Z* O: M' }
3 ~+ F/ t3 D/ W- v5 g9 T, o" }$ m% \9 l* f% a+ Y: w; z' x
我们来详细的讲解一下PHP中的命名空间:3 _$ {; B4 p1 B, R
5 V) ]7 X* I C/ W3 C0 K语法:namespac_e 空间名\空间名;
[) P3 Z: e- C0 `" x; ^
3 y7 X8 j8 V B$ g, \- L6 S说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
7 ^6 c& V0 n l+ A
9 F; [5 X9 c( u; Y3 L/ ^----------------------------------------------------------------------------- z/ A2 |& J1 o. L7 Z$ G
6 y" s! N* s" Y0 i7 x<php
/ O% J, c4 H. _7 I# o3 o+ y& H- @2 |0 b
namespoc_e AA;& g0 ?7 x4 Y: v k
functio_n showInfo(){3 p s' i, J/ q
echo __METHOD__,'<br/>';+ q$ f7 h o# v" O' c; R$ z, _
}
- T& e5 a1 \: _, {9 w$ ishowinfo();' `' C, u% C- ?+ v
! V7 I$ e6 a* t% vnamespoc_e AA\BB;0 h' T2 r- \9 V+ C0 h& Z$ p+ K
& h& V m# N/ z5 z( F& \
functio_n showInfo(){
( g/ m( `( L. c9 c1 E% A echo __METHOD__,'<br/>';% k& S7 n; b# z* i) x
}; i0 k5 e' {- \% b. x7 V# T
//showInfo();
: R8 a3 O6 b' ?& H# k----------------------------------------------------------------------------( q; c6 _' ?- @$ c
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)2 P& c; x$ Z. I! ^
( ]% i* _2 I- J* x3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
' ?% A' n8 x% _- G$ ^5 R- B
3 r! X. x: c- b; Y, x5 C/ q; P----------------------------------------------------------------------------
6 L9 s/ A& Z- s2 W# y2 f2 { H6 b1 i
<php
1 g) i6 u: w$ ]8 B7 `namespoc_e AA\BB;
6 p, k' y G* b! }; B4 Rfunctio_n showInfo(){
- z& T( _/ @0 J/ P, B B echo __METHOD__,'<br/>';% d9 c& D7 f( y8 w
}7 \9 S& _: \* F9 w7 a
namespoc_e CC;
, s; |! y6 s& U/ Z7 l. Hfunctio_n showInfo(){
( n/ k7 q/ V* x: f1 A" q6 R echo __METHOD__,'<br/>';
5 l: k/ Q# U2 B* R6 R, i. {}
. M' k( ]) Z2 u9 q$ y/ m! i$ s& ]namespoc_e AA;2 n4 c! j8 O$ L% d' ^2 j3 e* F! o# v |
functio_n showInfo(){
2 g2 D# Y5 |3 Q/ L echo __METHOD__,'<br/>';
& {$ E7 }7 Y& I I}9 o9 U' I5 X! B& y+ u9 @' a ~
//非限定访问:用于访问当前空间中的成员2 E, U( m3 {, j/ F7 |: y
showInfo();4 t6 I2 \0 e' U; b
//限定访问:只能访问当前所在的空间的子空间中的成员* a0 S+ L$ p: b
BB\showInfo();6 a+ a3 r" C: ?2 A$ F5 m
//完全限定:可以访问其它所有的空间的成员: z6 \( s. w7 ~6 y) v& O+ C
\CC\showInfo();. Z3 H9 g8 E. ^1 C( K# n
↑根空间标识符4 Q( h$ P0 U; A6 M" i: D
----------------------------------------------------------------------------
! g+ k6 h5 U! G# r, r7 Q但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
' ]$ v6 D$ C g" J: g( _4 ^4 }
6 B/ T3 q) \# Z: J8 v- ^当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
! F }% ~, l$ X" O: _! O
; u* G+ [. P. c t7 ~, h+ }代码示例如下:5 l+ m" c' ~- F- @
% |+ i9 n9 R. Y' o7 Q- R
----------------------------------------------------------------------------
* b$ |! {$ }% L& {, p7 D* x5 p9 m
' n P! X5 N) J9 x/ Z04inc.php
7 Q0 P" Z, z0 ?" }; y9 R; p: m<php
, b/ X: s$ K, m+ J% M; v8 ^: G
# ]0 _- c7 \% Lnamespoc_e Core;
5 h+ U1 E7 y" K" K: N% s9 x; `include '05ou.php';
, y5 K! D7 j( Y: Z0 ynew \AdminController();: h/ q0 a( N$ X( u, [
showInfo();$ N8 ~2 }* ]5 _1 ~: @) _0 }3 h3 u5 l! r
/ R) \- g# w$ I/ U& r4 aecho P;
0 n, @7 F, ` ]+ h//根空间中的成员,只要类的访问必须加‘/’
( P3 x+ j3 S1 j1 J; d; U+ ?----------------------------------------------------------------------------
# i j8 L0 d5 c1 u
" r) B; y$ D4 Y3 x6 M05ou.php
8 N* e/ w, p) c4 y" P8 }<php, H3 n& T% x" e+ L
const P=5;9 v' j! C; H+ G# ~% S2 |
4 k/ N) ]3 r4 Sfunctio_n showinfo(){
6 A# D+ l w1 c" x echo __METHOD__,'<br/>';4 R5 A8 J& o* b( b
}
. V; ~8 [5 ]5 L. g8 D6 a) C$ [
clas_s AdminController{& e6 c: S. P/ e; U I8 d f! J
public functio_n __construct(){" V2 ^0 x) f: z+ ]4 a# b
echo __METHOD__,'<br/>';
; Q) v0 m) C% m$ x }( G# J( U7 H6 X1 w; o% w9 o- Y' h
}5 z4 v: _- d+ ^7 u
6 g: Y9 J; O2 D; s. T$ X$ \! ~第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
2 b; m( v# A% X3 d----------------------------------------------------------------------------5 ?6 y( Y. t3 t- A) h& q
04inc.php/ l9 u7 B# S% A# l6 t
<php* Y* |/ [' i2 R: ?
2 i6 C, S- H9 Y$ w6 Q9 [namespoc_e Core;4 q/ B8 }& d) Z5 Q: u- t
include '05ou.php';
" q4 c0 V6 j& }# d- ~$ N- Q# ]functio_n showinfo(){; @4 Q4 T5 V4 A) o( p
echo __METHOD__,'<br/>';* l- x- ~4 J4 f$ |
}8 F6 @" I. l7 m# P4 x% x! K
# Y- X1 q% t# V2 wnew \Controller\AdminController;% T7 b# V% I4 @6 v9 T
----------------------------------------------------------------------------
% i2 Z P2 \% {$ a6 O7 K, d6 t05ou.php, Y/ T4 e% G3 w* R3 e: F2 ^
<php
1 L5 t- [1 S5 u2 F) tnamespoc_e Controller;- M$ z1 P/ d, y# K
* ]5 `8 D, b5 a( J# ^+ I. N7 x
clas_s AdminController{
* \5 ~2 Q9 n! i6 d( j public functio_n __construct(){- t7 }- @3 Y) ~% S( }0 I
echo __METHOD__,'<br/>';
- E( {2 m8 e0 X8 G* E- Q: O }/ x$ }! t* }* |" X
}, @5 h1 ~3 S/ O) ?. @: ^
----------------------------------------------------------------------------
0 S, ~' u0 i4 T' G, j0 I6 q
) S* |, N+ e$ T/ C" ?' }5 B/ k4.引入空间成员:: {( g. V0 m$ N
4 E' \5 D$ _ E
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
$ [4 ^$ A$ r# C. c: J5 k4 T9 |5 X8 x4 r' ~: U
----------------------------------------------------------------------------3 U9 d# C Q) y% l0 e2 z, G
" |: z5 n( G: }! k& f, \7 y- m
04inc.php
: _$ `) }- t9 e8 S8 h4 j<php% ]9 ?1 ~# D q0 Z7 T
namespoc_e Core;
0 r8 A4 o7 A/ Nuse Admin\Controller as con;8 z7 q' I5 a6 p0 X
% ^9 u% B8 Q U3 I2 w& b4 m% Winclude '05ou.php';
: L/ E$ d( `9 e0 h' N
! Q5 J8 n% `; u# f- pnew con\AdminController();9 I& w4 P3 L3 T+ f, q$ L
---------------------------------------------------------------------------- f4 H5 E& h2 k. r
05ou.php
0 f# b, p$ B- c ]9 A<php8 G- S$ a3 s$ a8 [7 k0 D
namespoc_e Admin\Controller;
0 P% i5 r$ M4 c8 Y' W
2 k6 @: d! E- }clas_s AdminController{: j4 T/ Z% d$ L4 u# _/ e1 o, f
public functio_n __construct(){
6 Q O9 ]' k( S2 R n echo __METHOD__,'<br/>';5 C$ v9 |- e. s% G0 f1 [$ o
}
9 N+ J9 a- z% h/ A5 G6 P}
: o, d+ B/ S4 L' t, w! F----------------------------------------------------------------------------- u. E+ H/ g: \; K( @7 B& C
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。+ K% P& S& J* A6 F
8 M+ I: e7 o2 e* ^# E
----------------------------------------------------------------------------
; L5 W }5 W6 K1 w% P( W9 S2 T
/ i6 g$ t% x; I8 p y. z04inc.php
9 k7 t6 e, g8 J7 ~0 K, m1 K<php' S" _# ~0 Z4 P8 [
//引入空间成员类
0 k" y% w3 C! t0 q; E4 j3 C
# `2 i$ j' S0 Mnamespoc_e Core;
/ ^0 {- H7 H8 f3 O* m' Xuse Admin\Controller\AdminController;) d/ y% l2 A' R" @6 L! @5 p
include '05ou.php';
: Z% R( {+ a2 Z! f% s! h) ?! y
7 |3 @( c& b( P6 t8 @0 \new AdminController();
3 R2 i, A- O( ?5 c( `----------------------------------------------------------------------------
2 t9 z$ Q' A5 N/ U05ou.php
( @( x' y) M: L/ H f<php* a, E* I% R$ Y; b8 X/ h
namespoc_e Admin\Controller;
; ]4 a" L0 J3 B6 ~ N& a
6 ]9 [* C3 \3 ]; y& d/ Kclas_s AdminController{
3 u+ M4 _( V' n" V4 p3 O* a public functio_n __construct(){
* ]$ p3 Z7 l4 V+ W echo __METHOD__,'<br/>';
2 [' J' s3 f# q7 T1 s5 h }; |3 E, V7 D& g5 a
}
R6 z, M; e. H. m. |3 V& j----------------------------------------------------------------------------
) E- ^4 w. @5 ~5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。; S- f3 @# Q& _- g
4 a9 _9 ~" f) o7 Q
1 F8 p; L N' F+ A8 E9 Q) J
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。7 Y) ~: h0 Z( I$ X3 x5 j! }+ |* ^9 ~
/ h* m3 |9 c" a
, i1 m: M* X4 W" A" R- ^9 d ~4 B3 |
9 x' d% `6 K0 ]# d2 l" k. Y& b j6 Q. H9 X' v* n6 F; g
! ]( \9 ^( f: @0 n% C& M7 r3 ?
|
|