管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:$ X* r* b" n% u) Z8 H: d( |
1 E9 E# z1 v6 I: D9 F) N
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:( N9 l3 n5 J1 Y" W4 w" e
# f8 O j& Q8 F( }* |2 e* \2 L) W# P
9 n& X4 L3 d; S g( A8 h* k/ u! X
2 O2 D2 z& `$ H% Y) `( z" r/ s
我们来详细的讲解一下PHP中的命名空间:
! P5 J/ m; D% P( [% h% m
( R+ l8 z' E' u+ z" ^: S语法:namespac_e 空间名\空间名;+ p8 W; h' _1 h/ i( d" ~3 o
* L' f) Z4 `9 G, o. E
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:. x9 `+ [) S8 b! m8 E
5 O: n& ^1 y5 _4 G( S
----------------------------------------------------------------------------
* r0 \7 j0 R1 X
' f, o. u; o d( H1 m7 v<php
' v0 c5 w3 g( t& F
& I0 m4 {# Z. f: Y7 Hnamespoc_e AA;
5 m5 v% w( I7 M9 afunctio_n showInfo(){
$ \, u/ x* q; N echo __METHOD__,'<br/>';
; t0 X% r9 [+ I4 Q}4 _0 y; b9 {. Z- Z2 z$ @5 B9 m
showinfo();
6 F& O; J( e4 n! k- X/ C
; g9 n5 f, Q( m5 I5 g1 Enamespoc_e AA\BB;* i# B3 R4 @5 y
y) E I: ~* M3 F3 B1 \) |
functio_n showInfo(){$ d/ h T7 h1 W7 @/ W$ O8 z+ l
echo __METHOD__,'<br/>';/ E" W+ `# W1 I
}
3 }$ U; s3 o) U z; k* R) O//showInfo();" h1 E4 n1 S0 K7 J6 n6 M
----------------------------------------------------------------------------2 f& @% Y. a J! `
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)" Y5 Z# j, G( w9 Q9 T- h* T6 e* G
, P9 @$ E$ r3 ^1 g
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& ~& l n# t! S0 S4 l) O8 a
$ X* N7 A8 v* C) V' `# Q# S% F----------------------------------------------------------------------------
! y- p3 J; t9 O" _ b" B
* h3 m" s: l% B) ~8 f* \7 O<php* K4 b- Y( c7 B' v8 l. Y! g9 K4 X
namespoc_e AA\BB;$ n, ]3 A7 Z; P- Z" e4 j
functio_n showInfo(){
, s* I9 M* h W: {8 `, V$ g echo __METHOD__,'<br/>';
& x$ w3 W/ z1 ^, t8 d}% X3 U2 s6 a! C
namespoc_e CC;- a1 R+ t$ _& l
functio_n showInfo(){ ?( Y5 W$ I2 d, m! H
echo __METHOD__,'<br/>';
* d; L" E* I$ i}: |: V. ~. `2 H" C5 I/ ]3 ~5 _
namespoc_e AA;9 P- A- M; L, _
functio_n showInfo(){
% f0 d3 G0 d, ~. t3 w" h* T" S7 N echo __METHOD__,'<br/>';! w2 z. b" f$ {
}8 g* @; R; K5 [
//非限定访问:用于访问当前空间中的成员* n, A; H m* A& U9 l
showInfo();3 U/ E U+ F- [& Z) @" F
//限定访问:只能访问当前所在的空间的子空间中的成员0 O% t3 l( |! J+ d* N: t, u
BB\showInfo();
8 r9 X3 ]9 `: F/ l//完全限定:可以访问其它所有的空间的成员
' U& U/ r1 h: W) }) e1 Z\CC\showInfo();
j! A5 x; k' ?. v+ [ j! g6 |↑根空间标识符
6 w: W* @; x* G& k----------------------------------------------------------------------------
; k# h' R, ~3 c5 D7 b; s& l但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:) w. x9 g/ F' C* `. i) P
% Y/ ^3 K5 e, f, N8 a/ k
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
2 W$ k) N" Y6 l9 l |3 W) ?3 ?' X- T, P9 D; F
代码示例如下:7 m: h- v# K' E" v
, V5 B/ W( a6 [) p5 A6 {) a5 Q1 A----------------------------------------------------------------------------
& \: r" g- @7 Y4 p/ h) f2 @5 c6 F) X8 T; n
! M5 m- G0 J( p
04inc.php3 {8 G. h, B2 }4 I/ t6 ^
<php, m( ] {$ E! H( U: M
0 h+ S( L2 g6 N1 E \namespoc_e Core;' l# O5 ^# p& I8 w$ e
include '05ou.php';4 E, i3 M }* O" m5 H
new \AdminController();5 M5 F# }( F+ n i
showInfo();
9 I$ ^/ t4 I: f3 Q4 r+ i" X# J$ b4 O& z0 o8 c
echo P;
2 E: T K' o3 L- Y# |- M//根空间中的成员,只要类的访问必须加‘/’
0 W9 ]; Y, i1 G& ]& ~9 K----------------------------------------------------------------------------1 y+ t q9 F" C3 a. ^! z/ e
1 @- C% a$ I% R5 O2 j+ ?) B7 H g05ou.php
% _' N4 p" z8 ~<php
( s# t) t F; N* X: ^( B5 Bconst P=5; C8 m! _, B; ~$ O, D4 O
% ^% G' x& c0 z& t! [2 ^
functio_n showinfo(){
& R6 r- k+ I, {' } echo __METHOD__,'<br/>';$ ]; y$ ~- I5 N. F* f, ~ o
}6 D _) o) o& b
4 X0 y7 z7 A" d- e/ X+ x( |clas_s AdminController{
) v+ d5 w9 E. t7 P! Y public functio_n __construct(){
( ~# |8 v! b; x9 G h& R echo __METHOD__,'<br/>';
: B0 b; }6 J `' s5 W2 I }
# s1 k$ E7 X( ?}
1 u) U0 |0 c6 ?$ q- ~! `3 n8 j4 j( [6 s* k# r# ^
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
/ e; [) y+ j) f----------------------------------------------------------------------------
* L: ~7 B- e* e% ~# d" i04inc.php
( I9 u. O/ M7 z<php& D- M. P# ]! }/ V
3 U0 V8 z$ s. N2 F) w
namespoc_e Core;6 w' e! f0 h# j5 S' r: N% A: Q: ~
include '05ou.php';3 w- z& {1 P8 Y' b( G6 H
functio_n showinfo(){
; R) ^" @5 d3 X echo __METHOD__,'<br/>';' H# ~: T2 D+ [; W
}7 _( L& |- J, i* u
+ q5 }# F" b" R
new \Controller\AdminController;
8 ^% Y, J3 k W8 ^4 h----------------------------------------------------------------------------
0 }4 V( k0 j5 o5 g( w' a05ou.php
' k- l) b5 p S# i1 }$ w* |<php
( Z1 D+ i: m. ^: q/ ^namespoc_e Controller;: A* |3 b6 R) P) x( y
6 a# g) I# {- M0 a9 K- x
clas_s AdminController{! x2 S: z( S5 Y; `5 P6 l) g
public functio_n __construct(){- \& y0 L" K. A1 N
echo __METHOD__,'<br/>';( k5 ~# |2 R% \8 f& r2 I
}
7 \5 }- \0 p5 D# C- l3 `+ D, u I}
/ E+ Q* A9 O. G4 M: i----------------------------------------------------------------------------7 Q6 Z. p; i& |6 ~* l( ~
: u: R* ^( ^4 [" g
4.引入空间成员:7 Y! @- K4 I+ Z
8 t2 z0 ?0 B( d0 b1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
" H Z: j5 i* i) O" ]* |
- m6 N2 `9 b9 y2 j4 ^----------------------------------------------------------------------------; W4 q( h0 k/ a3 @2 j) F: c
* S4 Q! ~: O2 C+ ]! [! L/ A$ @' \/ z
04inc.php$ [8 p7 S. _0 }2 u8 ?1 G: v
<php; \ |3 c9 Y. g: g9 H
namespoc_e Core;
5 V& k! v; C/ a) b+ M! \ cuse Admin\Controller as con;5 E* }5 F. G5 }5 d
+ y$ K" ^7 S9 f! K/ n K+ yinclude '05ou.php';
2 v% @; ~. ?6 S
8 Q8 s1 z9 P6 E+ f+ \new con\AdminController();( |' ^* ~* f0 ] r* v
----------------------------------------------------------------------------
) L# {. i3 p1 q5 _( }2 o! B h05ou.php3 m, S- H. n& ?& r: ~* l
<php& R+ u& l- O( `6 i& J, x, d* k: r
namespoc_e Admin\Controller;% V6 z: f# m8 w: J& E
. Y. j3 n7 ~3 A$ {5 P1 L
clas_s AdminController{
2 M) R+ ~4 _0 V/ v9 v0 v+ X& s0 V public functio_n __construct(){) g5 X: k7 G5 ^& [+ D2 M
echo __METHOD__,'<br/>';
% {; {5 x% ^' R } ]) x" z; U' F. s# ]
}! D4 w& i; [" _, G* s+ G$ M
----------------------------------------------------------------------------
; n6 q0 M) E& _+ z+ ~4 O2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
5 w; T9 @2 y9 Q8 C& s6 Y! T2 i& l6 }7 z' `
----------------------------------------------------------------------------6 D" O* m7 l& S& s d( ^+ m1 d2 {
3 F7 i0 e: K. w S, d
04inc.php2 ]9 f) b+ H+ E& I6 d
<php" {! P S; R( \ j' I% `8 T
//引入空间成员类
" y0 ~4 v5 b7 W) z1 d
2 Y# R8 B% Z f6 l3 p# fnamespoc_e Core;7 P$ y6 O/ g6 o* F# n& c
use Admin\Controller\AdminController;$ {: M/ Y |5 ~% S1 E) \- Q
include '05ou.php';4 a( M' S3 E- a w; r
, e8 _9 V( v _ u
new AdminController();
, M- V; n- \# H3 b) \4 ]----------------------------------------------------------------------------
* h/ H; C$ H3 C# P. p05ou.php
$ v+ ]: F& j) L |9 K<php0 Y) `% S( k0 F( e' |) a$ D% |
namespoc_e Admin\Controller;' m! f' ]) X) R/ i7 f( o: }" m- M- |5 v
+ R/ l! c! R) P6 J" x Y
clas_s AdminController{
9 { l; k/ R9 }+ i2 \ T6 K5 d public functio_n __construct(){5 d0 F+ v+ X1 A) t: j1 E- C
echo __METHOD__,'<br/>';
1 \5 j* r @; p* l" s8 R$ u }
6 x2 v; V3 F% F% Z}
9 w5 r- o$ [0 b% f----------------------------------------------------------------------------
9 y& h5 Z& T4 q% }8 p# Y# @5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
6 u. s/ |. a1 [1 @, ^0 [5 `1 `5 R( b+ ~: \/ e
" F8 F& g& i2 q) t7 @9 x
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
5 B3 r. h& m3 p i n& g2 Q; X
$ X! K6 L: s9 t p
9 _, |! x# C& [, {' Z) u
4 A4 `9 D% d, \' A0 b! \! Z9 g" e1 }4 Y( n# y* u3 [
: x! Z$ J0 w0 t( y5 X8 R b: g. o7 c
. r5 ~' b' e2 ^6 }( m |
|