管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:) L+ A8 m+ Y0 q. b* h7 R7 p5 F
/ f4 C; Z6 w1 T& c* ?
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
# Z& u0 x4 z1 N3 X! `! ~% ?2 D' E% ~
; J% o, Y9 o, N6 c: l. g' H
2 q H8 b2 J- ]# k$ K( z我们来详细的讲解一下PHP中的命名空间:
# |. F3 q# e Z) z/ N7 W
: W& G* O/ j" k语法:namespac_e 空间名\空间名;
: b$ }0 V9 y6 |3 C2 f, P" F; ?4 m" O1 p9 F ~% g% D
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) M. V" x. f! w5 Z
* O k' M% ~) Z7 O/ D9 o
----------------------------------------------------------------------------
2 X, f! |+ ~2 R, |* {9 O8 }1 b( t7 g
<php8 z. O6 S' y- h& F3 D3 d! U
+ i. A6 ^5 ]( {. e
namespoc_e AA;
! }+ m+ H4 h- }functio_n showInfo(){
0 K+ i; r$ J Y" \. N echo __METHOD__,'<br/>';+ q, t2 _! X& m
}
* w* y! T) l0 Z8 ~showinfo();* I: _& F" f" [2 D+ B- W
) {3 ~% H) P6 _namespoc_e AA\BB;
( H+ Y/ ~1 C) ~- s4 v& D# v! U# a& V3 S) m
functio_n showInfo(){2 m* w; r' ^8 y5 H- M
echo __METHOD__,'<br/>';
0 h! ]) Z2 T6 `. Z}: B" O) O# v& z; n2 u2 R
//showInfo();& M1 g; U6 v/ d0 i5 D
----------------------------------------------------------------------------
- f/ g$ M( o% h+ w* |2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)7 d9 g+ x; s4 Z% j1 Z
T- s8 R: y6 f' h! C5 q
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 P0 J& E8 S1 F: I4 [2 H& e4 H0 h
/ Q& u: W. z' N$ q----------------------------------------------------------------------------4 a. y3 C2 {$ l4 a; ~; y, j
' W! f W& T3 L5 B/ }5 W+ o) E<php
2 l; L$ C" P& z5 a. z5 v s( R% X3 Unamespoc_e AA\BB;; S' s+ B0 g: g
functio_n showInfo(){
% u* y/ W4 q. W9 d5 R echo __METHOD__,'<br/>';
7 d# T1 Z. H9 q C! O}3 r3 d0 c P; q( p
namespoc_e CC;
. x' |# b9 F0 x- Dfunctio_n showInfo(){
/ d' f: K) ]. C3 N echo __METHOD__,'<br/>';
8 @& z( f& |+ O* y5 G- X. r}; L; x* X7 X% s
namespoc_e AA;
0 ?8 Q& \7 z. D" w! g6 V- Yfunctio_n showInfo(){
. x3 {8 m3 O/ K) M' K echo __METHOD__,'<br/>';
$ R4 T5 z' r! `5 `$ _+ Z* r}* `6 U9 l: a1 f. Q
//非限定访问:用于访问当前空间中的成员. `. v C- A8 f7 z1 Q3 i0 k! k6 L
showInfo();$ b0 G0 z* o3 X9 k- N
//限定访问:只能访问当前所在的空间的子空间中的成员
! _4 ^/ H! {8 W1 lBB\showInfo();
6 e" P" u, p( D- C X" |6 o$ [//完全限定:可以访问其它所有的空间的成员% Y% |7 q$ u' j K) ?5 B% J
\CC\showInfo();+ ]! d4 n; `9 V7 l4 \
↑根空间标识符
. h& b0 l$ m( O0 n----------------------------------------------------------------------------
* P$ Y- @4 X5 @3 c0 ~& s- k但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:, [7 s: V3 `, i+ P% U: N
- I1 R$ h- z1 g9 h; J当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)2 R, k. i- U+ @+ w5 }
" z) |3 Z' I# Q7 U, [代码示例如下:
8 r. @" z5 L5 {& J; m9 [0 x4 l
" T! z ?; c9 W' R----------------------------------------------------------------------------
( n2 r% z0 H/ d% D
4 K2 i6 y2 k( v
7 K- |: M" N1 A5 [ O4 e04inc.php
2 l1 A: Q: U' N4 j, L<php
8 ~( M9 Y* C9 Y( D4 y& A$ a6 r8 x3 c# |8 B' Q
namespoc_e Core;& ]5 W% o( F& [& Y' ?$ `
include '05ou.php';; o* r# W# p7 l+ R' _1 @4 l" D* N
new \AdminController();
6 F3 f# L |( ?showInfo();/ Y2 |% O' X, [6 Q! T& O$ U! L
& R) Q3 D8 X; [echo P;+ n: K! l& z& t& c
//根空间中的成员,只要类的访问必须加‘/’
7 v9 A! h# ]# c- }) W1 F----------------------------------------------------------------------------
+ ?1 O7 V- L5 G2 ]: e0 G' Y; G- y7 m! M4 }9 | Z
05ou.php
% S% i, m* P5 V8 F: E* y/ i6 k<php
# h. _% f, v. q# u* @! cconst P=5;2 I `0 {4 B6 U- q3 w1 f9 ]; G7 D
. i* e& h1 O8 Q9 h. b, Y' U) N* w
functio_n showinfo(){* ?5 B' b; s9 f3 [8 w& g! h
echo __METHOD__,'<br/>';
$ x3 V9 {! n/ D* `$ f}
2 J% @0 v: u4 G' K0 ]# q7 }
7 S) Q4 \* `+ K9 ]clas_s AdminController{2 [$ [$ T# Z; c% ~( p
public functio_n __construct(){3 Y/ B# @, b# Z M! P
echo __METHOD__,'<br/>';, m; m' R2 q6 V! G# ?5 u8 Z8 b
}
; @4 G o5 h) ?7 ~}! n# m- Y. o/ P T
4 [2 q, p3 F' X' T8 s! ~第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. o) {. W% \/ H- s. y) K
----------------------------------------------------------------------------
- K. z) {& N- v/ N. G/ [9 c* z8 B04inc.php
$ U' A& |% X1 j: T, |<php
- G. H0 `( g2 B( r+ I' v1 Z- Z/ F- o
namespoc_e Core;( Q5 u. @! W G: w% X
include '05ou.php';
0 R5 @+ o: c& C. c! C% ]functio_n showinfo(){
* p9 Q" |+ _+ A3 {4 F* w) O1 Z% S1 i echo __METHOD__,'<br/>';% G+ ^$ h: Z; M. |
}
' S& p5 }% }7 f$ y. f8 O) K$ \
( r* _" R$ g ^3 Z4 O! }& Jnew \Controller\AdminController;5 ^& |1 x; q6 {9 _) e8 Z
----------------------------------------------------------------------------4 q1 `* i* n0 K$ M, M7 s
05ou.php
" `& m' g* G7 I$ y- u. _+ A<php1 B1 z: ~$ ?6 Z& T6 o
namespoc_e Controller;! g2 }6 s: }, m- X: N" \0 m
% b, C- h9 [$ s& mclas_s AdminController{
3 Q2 g) s7 D+ X7 ^: N: k+ a public functio_n __construct(){
1 C% H W: H* I; e+ j" @4 ^3 Q echo __METHOD__,'<br/>';
0 @7 I3 o8 B& Z }3 c7 T* {& \3 c7 d) F
}
# ?# s' o% v+ X1 D$ Q----------------------------------------------------------------------------# q3 h4 X8 L5 n1 q& B
! c% R/ S7 f* z$ q2 J1 q' r" t
4.引入空间成员:
6 W& ?! A" k/ N3 R9 Y# b# E4 Q
7 d5 \3 x9 S, `0 [# q7 ^+ Z. b9 ^1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。9 @, f/ K% X% j1 ~
: E" `2 ?" c0 O; m: |0 S3 c' M----------------------------------------------------------------------------
, I2 ^. }0 U- P, q2 [8 T9 W, ?2 F9 @2 T# y6 a2 g
04inc.php2 ~/ A% z! W& M* w$ x8 ~
<php, A% Q% ^8 u2 V: d
namespoc_e Core;
( J2 l5 l$ A+ ~# ?4 Iuse Admin\Controller as con;
5 Q+ q2 X7 J7 Z B8 X5 W9 {4 U' n. V9 O* H! f
include '05ou.php';0 R+ q: L5 K1 ?( P% k, q
: r' D" u) q. j! D/ j7 ~new con\AdminController();
# s* o( U" }; b( K M N7 D* k% k) Q2 Q----------------------------------------------------------------------------
" `0 d* c$ U2 e' V9 z, p& c1 R% a5 t; s05ou.php
( x6 e7 c* B& T3 b) u9 o<php- u" u) i3 _1 O- U5 b+ i
namespoc_e Admin\Controller;5 R A" f7 ]7 P5 \( J! e
, P4 J, q: W; J+ H
clas_s AdminController{
3 m: H2 K- @9 \& { public functio_n __construct(){+ E4 x' {" O. j) L5 T2 ?3 D1 k
echo __METHOD__,'<br/>';, x+ L2 w, j4 @
}
' v: h9 |( P; E) a' `0 g}
$ E0 i) p- n7 I/ J----------------------------------------------------------------------------1 w+ _- ~6 H! @% h! ?% P
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 n1 [3 Q, |, n4 k/ K3 k9 Q+ E" S8 x+ c6 ^
----------------------------------------------------------------------------
! p1 a$ X& q3 d% z/ u$ u! Q8 @; H5 m2 [5 k
04inc.php7 K5 i4 t1 h2 r% n9 L
<php/ l& E. i$ L6 K4 U& v W; J
//引入空间成员类
4 ~8 A8 W4 o! w# ?9 o' \
, ~/ p; X' r2 S# W; gnamespoc_e Core;% n7 B- H6 H5 n" U$ p
use Admin\Controller\AdminController;
z/ `* r) ~6 P& I, uinclude '05ou.php';
' y; L* Z: w- t1 u% A; e) n$ F* ~0 g# O; N
new AdminController();2 {+ m, W- k; L& V( I
----------------------------------------------------------------------------/ b$ M9 _# `5 [* T# n! R8 l, V2 r
05ou.php, ~/ {' m8 I; l5 V: Q
<php- q9 r: ^* {4 c. G' T1 P
namespoc_e Admin\Controller;
! n2 }# ^& g" w# c- f
. k" |- F4 z! `/ Y( \clas_s AdminController{
& f/ W% P, _3 y/ c public functio_n __construct(){
% H! p: f; v9 X, @ echo __METHOD__,'<br/>';
$ J7 w7 G t& W* S& x }
f! N e! S3 ]" z) x# C}" ~1 D; p3 @" [6 B
----------------------------------------------------------------------------
7 z4 r% q, H" x4 T2 S5 E8 G5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
# j, @- i1 T( l# T& Q0 n& A: Z6 C/ C# Y& K; g
) Y B( ] Q7 { _: b) t这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。8 \: s& h" b1 q
4 i `/ l$ d8 m; O" ]5 E
& g: @8 ~2 r, y5 R( q4 K2 z7 o$ ~+ U+ }, n0 ~6 X2 f2 {7 X9 y6 l
0 E) g, b. v j/ u" ~8 V$ r" J2 S
! r4 K5 H& |. Z1 B% [
5 w+ m3 J) z E# K |
|