管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:/ v8 X2 M1 u+ V$ j; V5 A* x0 m2 b
0 b) P8 ~. I' H: ?% ^) g
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
8 n [4 t) R- w2 J* ~
$ q [, o& @6 {' ]) M5 y4 {
5 E3 `( ?+ v% V" b3 r7 U
) k L2 [) k1 W$ u. g! V我们来详细的讲解一下PHP中的命名空间:& J! n. \/ _4 Z) u4 I9 A) j
& b/ D! e) M' h0 {& _7 }. W
语法:namespac_e 空间名\空间名;$ L, s0 B, Z7 w3 m
: \) U$ [) C4 Z! a- w% E- P
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:6 L; @& u) }, p( _ G6 c
; J. u2 L4 ]' U* u$ \2 s----------------------------------------------------------------------------3 v( y* H( N1 f$ m% |- _+ Y
- ^, L5 c8 z1 d# j<php
6 _! [, v% g8 p6 b5 x3 W: n! p" \1 |4 d" W& ~+ z7 c3 ~
namespoc_e AA;- q. m! L9 A3 P- X8 {; g) G
functio_n showInfo(){
! y# y: |/ a9 f+ Y6 M echo __METHOD__,'<br/>';: \! |! n! X6 \% }" x0 p2 W
}' r9 R# e3 w5 t! H6 p3 f
showinfo();3 t& ]' K4 r' I
5 I/ k6 } z, T
namespoc_e AA\BB;
; O; N4 H3 N1 v h3 W! I$ ?+ M8 B/ S. X( Y! c
functio_n showInfo(){
+ {7 [# i4 j4 e4 C echo __METHOD__,'<br/>';+ u# V7 @( \. f. [0 f4 e
}
; c- C0 X. m" \//showInfo();8 I+ X: p; A5 R0 \0 G8 N; F/ R2 N
----------------------------------------------------------------------------
' v4 v$ D- [; V" e8 Z' ? \2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)! {; ^7 `$ U, b: g) m v$ T
4 r% ~( O1 f$ h. |2 {) R3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
- x- F5 A! v& Z1 W) {7 \
{0 t2 T J! V9 j----------------------------------------------------------------------------
2 f$ ]" E& q6 b$ p' S, ]. }0 m4 G* p9 t
<php
1 F3 e# r* i9 c2 ^5 T2 {namespoc_e AA\BB;
5 `/ y7 |6 a; ?functio_n showInfo(){1 d( [2 d2 N9 \7 j. P) v
echo __METHOD__,'<br/>';# V- G: } S$ D4 g; R) r
}+ H. `+ v! T) w$ N0 C
namespoc_e CC;
$ g. m# r, ^1 {) {( N1 H1 Kfunctio_n showInfo(){
( S) W1 k: f/ L echo __METHOD__,'<br/>';& s2 w0 ^& _4 z6 D1 u, Y
}
1 x# N1 H2 h3 q+ G1 y7 x" F. B& bnamespoc_e AA;
2 b" g* i t0 A9 N. w' v5 Pfunctio_n showInfo(){9 j8 S/ L I+ d7 {4 T3 z. s" ]
echo __METHOD__,'<br/>';" p5 X6 \2 M5 D3 J3 ^
}
4 j! G6 M( Y0 M# @5 F! o C( g; d//非限定访问:用于访问当前空间中的成员, w4 @6 X# @/ C5 q
showInfo();
3 B% L5 ]% j+ ^* K; e. M5 v6 Z//限定访问:只能访问当前所在的空间的子空间中的成员
* h* g' l; ~/ A0 B0 VBB\showInfo();
; ?! K- s7 M9 C: \( @6 L, ]//完全限定:可以访问其它所有的空间的成员 @. ?% }& W- r' o9 {3 E& h1 N3 U
\CC\showInfo();
! i' {" v: R w% W7 g↑根空间标识符/ }! I0 z2 _5 Y, p
----------------------------------------------------------------------------! B+ M" m' i. B' |; h
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:; B n, @! o- x2 E0 _
( Z' `1 B& p0 p; f1 W当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, o3 @5 z* m- D" b! a4 G n! f0 i' k4 H5 R: ^7 U2 C0 h: g4 @
代码示例如下:
3 t- |) u+ w: t) a3 G" h% p: O
$ N! g, a- F9 r----------------------------------------------------------------------------! t/ P+ B$ s2 j- |
' Q `7 F% V# s* b* e( V5 v: V9 {2 ~3 D3 N
04inc.php' L9 y; M) n( M: K9 L
<php
4 `* Q- ^/ _* j; M7 Y1 l1 z! M& ^8 N
namespoc_e Core;
1 Z3 D5 f- ~- _9 V6 v2 \include '05ou.php';8 _2 d1 Q% u" \
new \AdminController();
( q1 C1 Q% J7 v0 c- Y. V( nshowInfo();
2 z/ `$ i& f* D& z! v' y& Z: t- W. C' } C: ~2 c! A
echo P; G( U2 n0 k4 j4 ^2 s/ q2 t
//根空间中的成员,只要类的访问必须加‘/’
/ P u! E- {5 p/ P----------------------------------------------------------------------------$ B5 D, w: Y* c2 ]
, r9 n. K$ E% l/ D3 B4 T
05ou.php. X3 U; h d2 E8 d+ ]( ~$ F- D
<php7 c" F) X% ~$ M
const P=5;; O: L- U3 Q, F% v
3 r* q4 Q9 L8 @' Y& M8 c
functio_n showinfo(){
- |5 c, d; g! ^ echo __METHOD__,'<br/>';
( c+ f9 g, [; }. W# F. T}" I2 ~( q/ W- i1 t v, L1 \
' O% H$ j* \$ z; ~3 T1 i2 u) Bclas_s AdminController{4 j8 E$ f7 F* t2 O& n
public functio_n __construct(){- [" R; w8 v: ]7 f2 y4 u
echo __METHOD__,'<br/>';
c5 F; |% V# y, Q( d$ {. j }
! s3 U$ f) s8 q' Y! b}
$ H9 e% G1 o8 t1 ]% y( \
9 T1 m3 B& q7 m8 L7 D$ s' {: `2 b5 W第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。 c B3 G& P4 p9 h$ L8 j0 m6 Z
----------------------------------------------------------------------------
C; t# [ P5 Z* {04inc.php
5 Q$ {: ?" L! u; M" G<php" q+ X# ~ E5 H8 T; @3 ?! O
+ H- D8 J9 K3 B) i& k0 [
namespoc_e Core;
. T8 E0 s% ~" U: @/ Y, A/ y* G0 h2 R$ hinclude '05ou.php';7 G* [7 o3 p# g3 Y5 n: F
functio_n showinfo(){
0 f; B& ]. d1 ^ echo __METHOD__,'<br/>';/ X, e: K) S8 q: m* C# R4 L; G
}- @7 J! W) h6 e+ m$ k Q' `7 ], g/ ^
( }1 H5 o3 ^: s7 nnew \Controller\AdminController;! F% b7 v! E9 Y3 S3 D9 C+ ^
----------------------------------------------------------------------------+ ^) v! C0 j, j5 l2 K/ F
05ou.php8 S& S2 s: v3 O( b& q0 ~: ^% d
<php
+ {8 S) \$ u0 N+ Ynamespoc_e Controller;
; B5 d' [' X# r# h1 d% ]3 i6 i. z( n, `1 _, \
clas_s AdminController{" y$ ^8 {7 s& ]- R) w" Z
public functio_n __construct(){- j! s, m9 o& ~; r5 g( E9 W4 Z
echo __METHOD__,'<br/>';
, j9 e$ s" B3 }0 B7 M/ i }. t5 i- E) }8 n
}" ?! F% q" g. _! ]/ G9 w! V, d
----------------------------------------------------------------------------% U0 p) n# c& I6 O' ~
. U/ ~9 l* H4 |" b* B# X5 V" t
4.引入空间成员:5 w! a) G6 B( x8 D5 D9 S
* G: k' O# W, K% C" g" g, ]1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
: v' H! `# j% y$ ?. w- }6 k0 {& o9 _! } q* q5 K
----------------------------------------------------------------------------% e6 ?0 G3 A0 v1 O- X- j: }3 `
! b! ~: S. g8 i' E& |, y0 h& _
04inc.php7 s- M% [& C' {0 ]6 w
<php
0 ~* q J. E5 G& }2 L- M$ lnamespoc_e Core;- z% z% n t0 z3 Q
use Admin\Controller as con;
0 H: k) V7 s. w; g1 \$ ~: b2 B2 K4 N( `+ p5 g
include '05ou.php';
0 S( W0 U& f, w1 F n$ N
7 r3 d& K& P. u) l9 t9 w+ M% dnew con\AdminController();, g& n: A5 q+ R/ w6 |
----------------------------------------------------------------------------
7 {" x' x" ]) }. Y W, c, O. R05ou.php; k* P& M/ q: f1 Q1 `1 r3 y
<php5 P' E$ T% j8 v' L& B, ^
namespoc_e Admin\Controller;
* M; ~( v: N9 C2 {) i# F- m4 ^ G# [" N
clas_s AdminController{
3 Z4 h/ O4 x9 i- p; s' h9 w0 I public functio_n __construct(){
- m8 V& _$ R$ b9 J0 N& r( ` echo __METHOD__,'<br/>';' d. @5 f7 S; z
}! A- b* n( s/ m* ?' i
}
" ^% k4 x+ M+ w1 O----------------------------------------------------------------------------0 d+ J, F5 u8 G6 N0 D$ i! z2 q
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
{) W; k+ {) P7 p' e" j
% m7 |* N! P p$ F. K" v----------------------------------------------------------------------------0 G4 p% d [ {
# ^! Y. H( z7 M' e5 m5 S04inc.php
7 y k0 U6 ?3 T$ s<php
+ D* A4 L! y5 o6 t//引入空间成员类
7 ^9 Y3 K0 _/ Y$ e7 J! P2 e4 c4 M& P
namespoc_e Core;
. b; {1 y6 b5 w: l* ^) ~use Admin\Controller\AdminController;8 |: T% P8 Z3 j2 k6 J
include '05ou.php';
1 ^- {) N) r; G7 S! w# Z: F% t3 ^0 Q* Y- b+ N% z( z5 ^: L
new AdminController();6 h" @+ h5 {2 {* D( E9 r5 r
----------------------------------------------------------------------------
% O9 p! O1 F' \/ t( g05ou.php
a' n% s' @* m$ P+ q<php
0 y# V5 w$ G S0 P! O, unamespoc_e Admin\Controller;8 t8 q1 [+ i5 w" [; H
) J4 ^4 p- Z2 T$ [clas_s AdminController{
( p3 d. a$ h/ I3 z public functio_n __construct(){) p1 h) h7 z. B! A& p `3 |% t# @
echo __METHOD__,'<br/>';
: Q' W, y L+ d) u9 a5 ~ }; ]% r( o1 a0 D, X) B, @ Z4 v
}
" @4 m8 x6 b1 M: o7 c3 `1 q----------------------------------------------------------------------------( W$ C& v' U, j: M
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。0 F j! _: r. |& `1 }9 O# _
# \! @ ~7 y4 p7 v5 ^& x
5 u- L4 N, Y1 `% d" \这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 ]( @; c8 a( O5 i1 V
! A6 ^. a# w& l( {7 _- O7 I0 S8 C- L8 F% ?8 Z
. S* V$ |" M& t) M
$ C9 H3 q- F1 n! ]2 E+ g6 v$ G2 X
- Q* x: _( `+ B+ V4 C6 I7 W) x! h8 X9 ?, w& G: n/ w& g8 t
|
|