管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
3 b7 h; n7 J D2 w% x8 R% ]
* m. ]) |; r+ D1 T- K! J在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; ^/ ?. W; x% N9 o$ Y6 V9 b6 k* ?. K5 q. X, S
8 ]0 E* y# Q# k3 `" L+ _! A0 X6 X
我们来详细的讲解一下PHP中的命名空间:
0 Z2 D, C; }7 u; \7 y& }$ [# l4 ?4 Y$ Q- Y3 ~( Q! b
语法:namespac_e 空间名\空间名;
' H1 M1 U* [6 \' C0 H. K% X* q8 {; \! I
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:% [' J3 W( u( H, D! x6 x. L
# D" ]( {+ P" a6 \
----------------------------------------------------------------------------* H9 L6 i- t- d1 C
' ]# G! F% ?$ {* Z9 x8 g<php
$ T1 K; f+ A3 b5 T' k
; X0 H0 z( l/ F2 znamespoc_e AA;
9 R) g+ H" O; {' [functio_n showInfo(){, ^- l: J+ l" y9 Z) P5 O. }' X
echo __METHOD__,'<br/>';
% F1 i4 M K! Z% c4 K# ~9 C}4 n) e/ f: r( V7 R( Z, {0 }- Y
showinfo();
- |; R e8 P1 c
2 n; n. h$ I9 d* vnamespoc_e AA\BB;
6 D% ~( F0 Q p2 b
: x4 @* Q% P" C- Z, s( jfunctio_n showInfo(){
4 J. ~. n5 Q4 d5 H% D8 @% ?/ z echo __METHOD__,'<br/>';( M* B" v1 _$ p, O( o7 j: d
}; R! p5 W" E6 ^* e E
//showInfo();- w5 y& ~- ^# F/ |
----------------------------------------------------------------------------' f s# z% J- ^' U t- t
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)+ V" ~& x( C# ~4 H, m5 n0 D
! J# a! c, P# {
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
; X5 {$ J% ]% z$ |, v& t. F- s
" q) ]& Z& H7 v6 C% h3 [9 {4 d----------------------------------------------------------------------------
3 W( b5 W- Z- Q8 g/ n% r. I0 g, k+ @. z$ ^4 M$ _
<php1 y m% c; \5 h; P( \$ }$ I
namespoc_e AA\BB;
6 j l! Y. a. x, H% e1 v# t! W# P5 Lfunctio_n showInfo(){" i t n' y+ t$ V4 Z% [4 e
echo __METHOD__,'<br/>';0 k; S- H$ @6 S! h1 f W0 \; ~/ [
}
5 ~; o0 N$ V; J: Tnamespoc_e CC;
6 E5 m& @/ j5 `, I5 nfunctio_n showInfo(){
. F r! Z( B& l3 w( M echo __METHOD__,'<br/>';
; }% {# P1 p" y( c}3 a1 Q2 b, ~/ i2 s3 e2 d) ?- l$ m
namespoc_e AA;
- j3 r( w/ U& Z4 p+ tfunctio_n showInfo(){% s; O$ A4 v2 }' l$ I( T
echo __METHOD__,'<br/>';8 C# x" e, G2 Q8 L: ^
}% q; W& g/ @: o @3 N
//非限定访问:用于访问当前空间中的成员9 H; H8 C( P) H+ m9 R
showInfo();
8 G6 S; p1 M6 ~# x+ h& s//限定访问:只能访问当前所在的空间的子空间中的成员
l7 n: n2 }$ @* }BB\showInfo();0 ^/ k* i5 w5 y& T' F2 W5 ?5 |, F( g
//完全限定:可以访问其它所有的空间的成员1 C* L1 f" V& g) |% { Q
\CC\showInfo();
3 i. d! i$ Q* N7 g; u) h5 k↑根空间标识符
4 j, x$ `0 Q, o----------------------------------------------------------------------------. c" r* @$ [& G2 `
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
+ |# `! H1 o# M3 E+ r. W) @ f" R1 w
/ X( r2 ~* F7 R5 L7 f0 D6 g当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)/ Z. k; ^6 @# z6 c, y2 ~ V+ U* c
5 M* S; {7 `" G* U2 v5 E9 D! E, q代码示例如下: B. j' d2 z) B% f+ l: H r
. K0 t9 k9 Q- Z$ f$ ~: K5 O* C. i----------------------------------------------------------------------------& X+ r' Q9 A8 T
( {) i! E; Y9 S- Y* W; \' o: Z3 ^+ Y: a9 E
04inc.php# d+ W5 D# ~* z' ?
<php0 C# [* ?, s& D ]- g
0 z5 e L# R, e) lnamespoc_e Core;* h; O3 Z% d7 B! ~' O! i: q8 V
include '05ou.php';
" x& D0 n7 _2 Lnew \AdminController();
4 M. b- o1 y5 _1 u2 Q- n) V5 qshowInfo();
. S) _! ?/ i; f( T! C
6 K' A7 @2 j, E" H6 W$ s! x+ `echo P;
7 C+ r' ~& b7 b# ~; w' C7 C4 j+ Q! n6 B//根空间中的成员,只要类的访问必须加‘/’5 R* X0 Z! _- B
----------------------------------------------------------------------------
9 I, I/ T. ~; ?1 S+ I d. q/ h$ w* J2 F1 t6 V" O' i# g
05ou.php9 x: J [& d7 s' }
<php
: f1 T3 h& K) Z) Wconst P=5;, s A* ~0 E6 N* }
7 l( f0 c8 ` n5 ^ n
functio_n showinfo(){
' |1 \) Z. }. W echo __METHOD__,'<br/>';
1 L* z& q& j* v# F! J}
* ^8 f- l3 s8 r9 T6 x* d
) a! [' p% |, t$ A1 wclas_s AdminController{
: E* G4 N/ A& V6 ^& N, r5 I; I public functio_n __construct(){
9 O( u) `: B2 i: D echo __METHOD__,'<br/>';% r8 O8 Y/ f; Z* V' {* i6 j/ [
}/ M! {$ q) z6 [! R; Q- y( Y
}& B ~4 P+ o) P/ b( p
1 \; p$ T2 B% ~4 z6 B5 b
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。; B- g6 g( D9 i) r# }
----------------------------------------------------------------------------
+ p6 Y6 L& f) |8 v" a2 ^/ n) h* p, Z04inc.php
) V5 Y* g' ?6 Z8 Y+ l7 z& l6 v% |/ A<php+ v* f3 K' u$ p2 M
$ L# o3 [ r/ f6 o- nnamespoc_e Core;
, j& T0 l H, {7 a6 f. linclude '05ou.php';* U2 K; U1 ?. d3 \* T' H( d- C w
functio_n showinfo(){! r0 G* C& k! ^; v+ @
echo __METHOD__,'<br/>';
* a" C; n! v1 n Y3 a+ l}
& J/ T! y) E5 p( v; D/ @* ^$ Z8 ?1 U0 h J
new \Controller\AdminController;
; `! C4 x0 |6 L. c7 U----------------------------------------------------------------------------
8 I8 g O) t ]4 z) Z6 M& R05ou.php/ a5 A9 G" R" ]4 a7 _+ [
<php8 \' L& |& E& \' i; ?$ P6 e! h
namespoc_e Controller;
; _7 x* |3 p5 q+ G5 m; y
# O# X& f" a; v! }' Y1 `clas_s AdminController{
6 T4 I1 a1 q* y% A' ]2 g- M public functio_n __construct(){' B E, Z1 R8 E
echo __METHOD__,'<br/>';
( K; ?! n# J8 Z0 I% G }
5 n9 y' y3 A% B. z. Y# U: F$ r}
; ]" y% J3 \) |% L$ a----------------------------------------------------------------------------
, q% S5 m/ P, h1 h; [
' m' T/ A3 s C$ s" N5 p j8 Q4.引入空间成员:: C Q. Y6 b8 [4 j; r
# h$ s$ p8 T7 ~1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( m6 p- E+ e' Q$ _" R" M; `
* V& f# w2 x+ r7 s2 o& r, h" @----------------------------------------------------------------------------; f; M# v* T' q
1 o' k6 Y, z2 \04inc.php
* Z3 m1 z/ [8 S, z<php
# W7 M8 U" N$ v! l' Knamespoc_e Core;! @9 u5 P2 e! O8 o6 _
use Admin\Controller as con;6 e2 H( ?$ I' ^ |5 Z6 G D
) J- v+ s6 X8 a; b" v: ]- Finclude '05ou.php';
$ l6 Z2 V, K& u' \& h' k! n q8 `% J( C5 I8 U
new con\AdminController();
r1 x m5 ]5 b9 I4 r! _----------------------------------------------------------------------------
' t! O( |# B, ]+ f. Y05ou.php
+ ^& d! P9 R3 K; r( l<php
7 ~: v8 ]$ Z8 Y! t; L. i, Snamespoc_e Admin\Controller;
/ |5 h$ g" L- [* Q3 i% \! R+ z! d" }1 I( H
clas_s AdminController{. d. m: n* L. m3 p% R/ v1 [4 }" r
public functio_n __construct(){) _- p6 O1 `( h" T* K, Z7 d6 m
echo __METHOD__,'<br/>';
2 F7 O) Y5 Q$ A$ f: B% E' ? }
5 W; B! |2 J8 y* V0 N}9 E) u% P, Q7 H2 e; @, Z0 r
----------------------------------------------------------------------------1 T. w4 k( g% r- U) M' v0 d* u0 _5 L
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。- E9 {6 k8 I& v `4 T2 e* W
0 |' I/ W: }* P5 K: v$ J----------------------------------------------------------------------------
3 r$ l9 C2 m1 L! c* u. N6 m" s9 f/ ~# |- ]
04inc.php3 i7 ^# o- l# [. V( E3 v) T6 A
<php7 |# V( }9 P# M7 L7 Y, Z/ i# `7 K
//引入空间成员类
+ i7 w6 T% D9 }6 h% `" R9 ]* z# }( i2 _2 N c: \
namespoc_e Core;
; Y+ x7 }& R: m! fuse Admin\Controller\AdminController;
+ A3 T% J `% x1 z3 Ainclude '05ou.php';" e6 J8 n+ t5 T w$ d S8 F
' ~/ }8 O5 a5 U3 R
new AdminController();
- z* E. Z- S5 K5 M----------------------------------------------------------------------------
. G' z* n4 x% t& d* O05ou.php1 [. y: d4 d7 a1 P6 R' i
<php
* \+ d, }/ ?0 \# e& Xnamespoc_e Admin\Controller;% ~) ^% Y' p. I" F/ q0 T, {
1 S0 t( w: f7 y
clas_s AdminController{$ A7 {0 A4 {7 S5 k, H
public functio_n __construct(){" T5 \; h5 _, `8 x- g8 Q- v
echo __METHOD__,'<br/>';
]1 @ o' W9 l3 c9 j2 t }8 B* j s" Y7 i
}
% K' r P; [" u1 {8 b----------------------------------------------------------------------------6 M" y* i& |6 h& P) x& a
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 ]9 w* c! V1 ~5 A1 e- W6 e; M. s/ p) ^" h0 ~" O$ C6 i" ~
" c0 {2 K4 j1 s3 e* n, C这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。( w5 q. N3 T. ^) @
; G: n% i# j, w: x. T; R4 m( K5 K( I9 h* n, C0 q
8 U2 K- c" S' O& X7 d! _8 I( n
; b4 t& z- {/ C" F) y* g4 H! @; U+ ^4 i( E
/ q: a# t( ?; i' ~! g
|
|