管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
1.命名空间的作用:
$ U; u) g8 R7 u6 I4 \/ X; ^" F( B, }# g: m% r, P( ]) C
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:, p6 P4 k" b+ T: K" x$ r4 Y
1 K5 v2 d# n, _" a* u2 g' v, D! d
h! L+ M) j, q
; Z2 r$ o/ V8 A+ U+ s我们来详细的讲解一下PHP中的命名空间:
- \6 S d' l7 e' {
8 d0 z$ n% Q: S8 {9 B语法:namespac_e 空间名\空间名;9 L5 P. s, u# G
3 a3 \" G0 y; ~7 @ J
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:8 U& {2 W7 Y4 g8 O2 P! f1 v6 Y
) U: P0 l1 g0 P$ O----------------------------------------------------------------------------
7 h" J% x; @) {0 b2 y% Q
# W. x! ~1 Z- C8 Q& I8 @" g<php
7 s* ~, }& m: I0 P! ^ j6 X5 V: O/ k' }+ S( C
namespoc_e AA;" Y: g Y8 G5 Z8 {+ h
functio_n showInfo(){% Q: s, V1 `/ f( b# c
echo __METHOD__,'<br/>';
6 K: a5 K0 O* E' M0 W}+ n- @; ?) T+ n0 u B% f! G
showinfo();. y( C( h$ u. |& ?, R
, |% Y$ z& y2 c1 C$ n! ^& Vnamespoc_e AA\BB;, m4 f: w! D, @9 Z% x: F! H- y
" H- ~/ A% e/ z7 D* G, Tfunctio_n showInfo(){
J U: J7 }5 o) H; h echo __METHOD__,'<br/>';
+ |6 k& i! c) T5 [# Y0 |}
/ m! d4 S: a* U f- n//showInfo();/ X2 S/ Z4 `9 B3 v/ c
----------------------------------------------------------------------------" Y4 v" b i/ e7 G
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
6 ?0 l; R+ j# x, U! N( I
; |* R. S* y. }7 H8 t$ H3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。6 c. s4 `6 g9 A* U5 ?
8 H5 m1 p, B; i( [0 H
----------------------------------------------------------------------------
2 w& R7 h9 V5 o+ y6 g- G6 b# p
8 }4 {8 [7 U+ ?2 B& N* s3 f<php
; r6 W4 H# t* A1 Y5 P' @namespoc_e AA\BB;
- h+ G K) O" }: N, |functio_n showInfo(){
6 D' N1 J2 A" Q1 ?% j echo __METHOD__,'<br/>';
[5 e' I3 J2 D `! [& F}! |# i z2 V" h6 I
namespoc_e CC;
+ e" S+ ]4 o0 N- Zfunctio_n showInfo(){
2 a* V0 Q5 E' F" o; u' T- W4 @( q6 r echo __METHOD__,'<br/>';
, H2 H# A. q+ w1 q. i}
1 z4 u, u; O- L0 Pnamespoc_e AA;; N, \: c- U: K Y- Z- Q5 _7 S
functio_n showInfo(){
1 ?: t% [7 Z6 T+ |5 E* y echo __METHOD__,'<br/>';
$ y k; k1 {" m, Q. n1 S3 Y}$ B( |( s1 }! J* F1 b
//非限定访问:用于访问当前空间中的成员
: {7 n6 o, Z8 gshowInfo();
2 L/ s& ]. O5 f: @//限定访问:只能访问当前所在的空间的子空间中的成员
4 _9 ]! N1 m+ P1 n" A/ X/ G6 q: jBB\showInfo();7 p- |4 o5 \( n" B8 N: t4 p& g% t* r
//完全限定:可以访问其它所有的空间的成员
; [$ d5 O4 t- P# ?- Z6 {* J7 p T! R\CC\showInfo();& k: x" R3 h; D0 z* I
↑根空间标识符
9 g% e0 N8 ^7 L& `9 ~ I+ y% S----------------------------------------------------------------------------7 f/ x2 g# _ x4 E& b! [
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:/ M0 l' z* A, l% u" ?/ c
$ _/ o s$ j2 w
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
) J2 U/ g$ _, @, z
, G, I% r k3 p/ O$ i代码示例如下:0 X. t( J* f0 I) z D+ y0 Z
3 m1 f9 b# j; f6 A& @$ X( Z----------------------------------------------------------------------------
: c% c5 ^8 v( y+ Q& d. L! G$ C1 Y: c
$ p; ?5 y2 y# F" s8 z1 q6 Z2 A04inc.php
2 c+ J1 v6 x6 \8 h! ^<php; k m4 o2 [6 z# _
6 d2 q' R3 w7 y! O- z; E8 q! D. i4 j
namespoc_e Core;# v$ ^2 y% |( j; P! u
include '05ou.php';- A* R8 @' L4 w+ C
new \AdminController(); q" |$ M& q% S& `$ I9 p
showInfo();
/ c+ _6 K. A4 d: y0 P7 K7 \% [$ D3 R7 t9 ~# v1 O
echo P;+ a% P! F9 f, ?7 d5 c. g2 [
//根空间中的成员,只要类的访问必须加‘/’
9 O, o7 K; O# P$ q6 j. v----------------------------------------------------------------------------# y$ P `1 R, J* u: G3 r% u* W
- L; t n: S" a1 D K
05ou.php
" M0 g4 p1 p$ C/ x* a<php
. X+ k5 z. ?) }, [const P=5;8 h g2 _- H, r( I' @
) R# u4 y8 [: ]# B0 u
functio_n showinfo(){
$ l: M4 Q+ }" b: e; A! W echo __METHOD__,'<br/>';( T* g9 d& L! B
}( P( M2 L5 z4 t: w) n* E4 ]
0 M+ E' k3 B+ X: M1 Oclas_s AdminController{ L# r0 L2 D0 m2 T U; E
public functio_n __construct(){
8 S% {. P$ K2 w# k echo __METHOD__,'<br/>';
6 @$ u1 r2 A0 B$ _2 D7 ] }: R9 A# R! T4 L2 X( i$ ^7 F% R6 z
}
. ~/ s# a. e( [! \: p+ r7 z9 q$ u0 K/ L& y: a* n
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! q5 k7 l k8 ?2 R' ~+ M' O
----------------------------------------------------------------------------
5 c2 f$ q G+ S! |/ a04inc.php9 ]7 J/ A7 F: \0 a
<php
! c1 O Y4 M7 _+ j5 _6 {. F1 K2 }5 e/ J. c: q4 Y* j& G" v% w
namespoc_e Core;
& P9 `# Y) N& W" V6 n/ A$ S* L Yinclude '05ou.php';
7 ?" M3 a R0 M- M; V6 e- ]* lfunctio_n showinfo(){" L/ ], n# L% L
echo __METHOD__,'<br/>';: L' { l/ z/ z" d; k! u; K* ]
}7 \6 j* U8 z) y# e7 h9 v
+ b( B0 ^" @$ T3 }, w, a; w
new \Controller\AdminController;
9 T; m5 |; u5 d; M1 Z4 V8 S3 e----------------------------------------------------------------------------# R! o7 ]- S' v# N/ k3 Z/ i
05ou.php4 A/ u5 Q; P, X5 w6 F- C
<php
2 \4 f M5 x: O. `namespoc_e Controller;( ]* X/ H) r' M$ i. V
1 g2 Z% j5 L2 }5 W8 b8 x( }+ A
clas_s AdminController{4 H! z, u+ o' e' J8 I
public functio_n __construct(){
. _ L% C! T6 I; b' ` O echo __METHOD__,'<br/>';6 D% z+ S/ K+ B3 \
}
' y( S0 o: @! ]' J0 B5 z}; z9 X2 I1 Z/ {
----------------------------------------------------------------------------
& K5 p& d, ~; m* F, ?( F/ M6 L' ~- ?3 M' B7 G, w, C) ~7 F
4.引入空间成员:' m1 `5 u, C: Z0 x9 D! o
# F8 Q! c3 [* d5 g3 n" e8 t
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。, S9 D2 L# `! h
$ u. i: m# ]+ l6 ~! _----------------------------------------------------------------------------
/ J1 C% z0 T$ A
7 t% @& S& s, c4 R9 L: V) @04inc.php- Y) e7 L; h7 F# ?7 A9 B5 F* h
<php* A- q2 Z: l2 h8 H/ H# `
namespoc_e Core;% T' H" f+ J' N+ b2 g( Q
use Admin\Controller as con;
6 R2 c8 H# B$ W8 t% g6 e$ a( I8 n2 d3 l/ Q) ]
include '05ou.php';1 Z% O" f) V$ S( q) |
& C' Q9 }4 N/ Z8 v2 ?' l* d
new con\AdminController();9 l; X9 V5 {/ G$ O* a; v, n' O
----------------------------------------------------------------------------
0 b3 [4 u' T* j& P' e05ou.php, Y7 k( O Y% g$ l M
<php
# p7 O$ }1 L2 d7 j8 `namespoc_e Admin\Controller;7 F, V, u/ r0 p" l/ e# B
0 D" W Q% u) C$ M, r6 K
clas_s AdminController{
4 U2 g0 _8 v4 |6 Q* G( S0 ~! G public functio_n __construct(){
% L2 t' u/ z/ I7 W! j3 S echo __METHOD__,'<br/>';
b4 l/ K" l# Z; [; C& S8 O% i }
0 N. M# K8 ]8 H k; o0 W1 H/ e}
@# a& ^6 N+ i' v/ W8 p----------------------------------------------------------------------------
$ z# H l: ~% C( K2 x# b2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ _+ p6 I* Q6 ~7 L
9 q$ l4 l7 s5 }! n( M, w8 x; W& \----------------------------------------------------------------------------
( T( o' j! m4 @- V! s @% W& J b( P+ t4 b: v& t
04inc.php
3 u( [' T8 @2 j" h# X6 l" n<php8 e6 |! `: i4 o5 X$ l i" R* i! c+ C
//引入空间成员类
. ^7 |' F% n& N* G; q. a0 ~* l
+ N2 P0 A6 ~+ [; e& anamespoc_e Core;6 `' {3 G' j$ Q D/ }. ]# z
use Admin\Controller\AdminController;* b6 O0 u' c( [. j
include '05ou.php';
; ?8 J6 W* c5 e6 \' l
3 d' Y9 K% d$ m& f+ \) Snew AdminController();
( V, [0 q; `* y2 `1 T; M& ]. W----------------------------------------------------------------------------1 L) e0 ?1 ]( A6 Z2 m
05ou.php
4 X& y2 s, ?' v* Y<php
" z% I/ ~& b. u# [# V2 R, ^- Knamespoc_e Admin\Controller;
1 Z7 R1 C, c. w) d6 l+ s. i6 i; z6 l
clas_s AdminController{7 e/ Z6 d+ ~/ E* y
public functio_n __construct(){1 l8 g- |& w: [
echo __METHOD__,'<br/>';
+ L% b+ R0 i: f, H0 U }3 ^; C. z- f5 d8 ]" \
}+ C9 ]/ c; [1 G O2 c$ D
----------------------------------------------------------------------------
# m( E2 B* e0 Z5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。0 a( k( [ U6 m) e3 x2 u: [2 Q
6 l" h( v2 z5 X+ u
% p: ^! C- C$ w9 ~$ n这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ t5 F" g1 Z: Q+ v& z# @1 r+ N
) ?2 T& W8 M# ?7 e; z% y
/ I5 U" x5 e% R6 }
; j# {$ w% b) y: Q
( K6 `" i" v3 O- V6 h& j+ d5 @4 A( m# t# _6 c
' s! v9 M' z' J0 E1 `
|
|