cncml手绘网

标题: php中命名空间(namespace)的作用和使用 [打印本页]

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
$ j1 D1 N# c& ]! B. o* h& d, u! Z) ], G1 s
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& Q/ _' H/ d& w' P& M6 n
, ?: Z( X, i$ J0 [: l ( h7 P) S% j$ \! A# v

* j4 f2 [) E+ C! e# s: A, [我们来详细的讲解一下PHP中的命名空间:
( H- p, B3 a% U9 T3 e" a# O; Z' Q. V, Q. J0 l
语法:namespac_e 空间名\空间名;
6 ?+ r& `" v2 A4 \6 X; O* C# w) V4 {* o9 K
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:6 w# \2 \* l: u/ z) S. ?' E; P, ?
/ v1 |8 V" I3 B/ Q* Y8 k
----------------------------------------------------------------------------9 ]- d2 C! \5 A8 q6 T

; A" k/ z6 h( G<php
+ J' y7 z) ^  w& f+ k2 P
! J  {7 K8 b. I7 B+ r- B8 \namespoc_e AA;
( q' p) k( I" u0 ~9 ^functio_n showInfo(){
: Z' }. U+ m: G2 I8 l' Z; m    echo __METHOD__,'<br/>';
. Y0 j0 u! U6 T. t$ T}* i  h- }/ q3 @1 `
showinfo();. _$ _3 ]' C4 J5 }7 L- s- J; O5 V0 l
7 |2 w( R: b5 O0 m' U7 S& e
namespoc_e AA\BB;
6 c) U, t* S, Q: d3 [9 {
2 A* E5 a8 X6 L1 d2 ~' |* `functio_n showInfo(){
1 k! \7 g9 E0 Q1 J  c! z2 D    echo __METHOD__,'<br/>';! X+ h3 o3 C; W4 U& W
}1 X+ ]1 a& ?* B1 R) L1 h
//showInfo();: A" S8 Z* N; x$ T' l9 z' I3 L& A+ b% F
----------------------------------------------------------------------------
3 n5 T# L1 _! I" e  ~2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
2 l, e5 F( r+ T
7 B9 V- q3 P5 O7 q+ s/ z3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。5 L, |4 z# z! B9 P5 P+ w; P; Z
: K' J: V6 ^( w+ C4 w: |
----------------------------------------------------------------------------( W1 _$ L: Y- t0 K' }& p6 t
8 k* I: B. |; j, n8 b& c4 w
<php
0 O, T% T* J& Z: r0 e5 P! Tnamespoc_e AA\BB;8 B* }6 u- R, _/ k
functio_n showInfo(){
( ^* s# m' m+ A. z9 A: D    echo __METHOD__,'<br/>';
% W" t, x" ~* m0 J! h}+ S. ~- ]2 |& Z- f' e9 `
namespoc_e CC;- M' \; @' Z! d  C  v
functio_n showInfo(){
" v! R. f# D" e, q    echo __METHOD__,'<br/>';8 Y! s+ [/ t" v" h1 ?
}
& Z6 Z. C# C6 z1 ynamespoc_e AA;
+ n' f( C4 ~8 \. w. _- v) c5 a' jfunctio_n showInfo(){5 H5 w" j( w- p# I# T2 c
    echo __METHOD__,'<br/>';
; w  E' h+ D, \, s}
5 D( V8 E1 O" T/ c5 i//非限定访问:用于访问当前空间中的成员3 n8 z1 I2 Z: @1 E
showInfo();. N/ `7 W6 x- K2 v( G4 Q) i
//限定访问:只能访问当前所在的空间的子空间中的成员. G) u% ~! g7 Y
BB\showInfo();
9 @+ q% e1 o+ X2 j& m- t  f: F//完全限定:可以访问其它所有的空间的成员
) L' f& O3 `8 h5 h\CC\showInfo();2 j) v! b& u' A& Z4 Q! V
↑根空间标识符
2 H, I' o  F( J; r; m----------------------------------------------------------------------------3 k; Y; D- \' H. G
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
6 E' B8 I# G/ G' V. _$ e: n/ x; k- B, A# B8 b" \9 Z& G) T
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
- _) G! C, c6 p$ ^" c% j; S
) v/ D8 j( f& i* J/ Z1 v代码示例如下:
& k' y2 q. ~* W  X, ?7 Q: ]
8 ?6 j* C  ^3 R+ ^& B----------------------------------------------------------------------------
4 v  i( x6 N$ s% m6 y3 ^  ?9 `; R' Z! d. `8 K

) G5 }9 o* k7 U& G04inc.php& w/ ]& g1 I/ ?, @8 ?
<php5 }( Z+ i8 R+ b  l& W
4 c0 K8 r$ e: D. t
namespoc_e Core;8 k- f# N) C* q9 c- w. ~5 y" P
include '05ou.php';
) K- I( Q- G- q) w# O0 z% ^new \AdminController();
& z" h7 a' J% g" D! Q$ VshowInfo();! C3 g" _, V5 ^0 S( y5 z- H

$ g0 u. V+ L( Q* M0 Pecho P;
! N- w$ `! \9 T8 k//根空间中的成员,只要类的访问必须加‘/’1 ?7 E8 r; z/ O; b0 j
----------------------------------------------------------------------------0 t8 }' g1 M% \* N

4 h! v! p* F" G  v; d4 M05ou.php% `& [# A8 X5 y: i$ d. u* }2 j0 p
<php
# Y8 A/ j" P* E( o- o  z2 hconst P=5;' \* j% k  g  s6 d9 U, h1 K
1 j8 _( N, I2 j0 m% i8 P$ p
functio_n showinfo(){
! @* H2 M* L! ?5 X' ^    echo __METHOD__,'<br/>';- j+ p7 w. r; U
}0 s7 X8 v/ x1 H" Z0 Z( Z

6 s) |- d- Z* Z# D0 Gclas_s AdminController{- z9 i+ r) A2 }6 P) M# `0 \
    public functio_n __construct(){& S0 j2 u& k! i& M" Q1 {+ {+ }6 f
        echo __METHOD__,'<br/>';
# K6 Q8 H. E1 L# t2 u2 a$ e4 o5 _    }
% B: U9 D+ ]# a8 `3 E; H}
& K! l& p6 \3 B9 f5 u6 v$ A4 ^
3 }6 m, |+ w, ?5 C9 X+ _第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
' K: A% n$ z6 N4 W3 i3 V----------------------------------------------------------------------------6 B8 A4 c8 T% {( e$ Z
04inc.php
. ?: q5 S! k, L<php* V+ C0 K9 \5 M/ j# j# j

0 B+ {9 y& i0 @( f8 P* ynamespoc_e Core;1 v# {% V' P9 Z* o. ]
include '05ou.php';1 H8 T  j4 n- @" j2 g# L$ S2 [% j2 [
functio_n showinfo(){
7 x/ w& J" h. _2 S5 `  y    echo __METHOD__,'<br/>';* ?! i8 O$ w- T( y
}/ D4 z) ~5 S: ~
  N( |+ U/ d/ _
new \Controller\AdminController;% _0 c! W* J5 \1 w8 o
----------------------------------------------------------------------------! S0 P2 y9 P1 \2 p
05ou.php; Q8 e1 a0 I  U
<php  T. l4 q! l5 N1 r
namespoc_e Controller;. M9 s# @- y7 l& k9 A

! A& f) y9 H1 A8 \5 M. E+ n+ oclas_s AdminController{& t. @! T1 \- a% S$ j( a6 N
        public functio_n __construct(){
' O+ W1 m- J5 I. b) m                echo __METHOD__,'<br/>';2 p( ]" h+ j9 u2 h
    }
& B7 b1 |+ q6 y% u% c/ }5 r}
- I* ^6 E. ^; b! k, c8 J----------------------------------------------------------------------------
6 k. ?# {9 R, @! N# L0 ?: C  j0 D; |
: N( E3 A0 `& ?( R  e8 m4.引入空间成员:
, O( C# M$ l4 c  s# b- P7 m% C' P0 a& O! }: ~7 t% P
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。8 ?! \. \4 `) A, Q, L& Y

4 O1 Z/ \! }  `- X. {9 p----------------------------------------------------------------------------% F; W, ]  y- ~
8 y, Q  J* E5 D+ Q6 o# j
04inc.php
# b9 `+ ]6 \; R: N<php
! C" |) m6 ~( V; T; Vnamespoc_e Core;/ n) y& j% R  Y+ l
use Admin\Controller as con;
# ~6 J% X+ m1 Z
. i+ ]! m7 \1 g9 |  uinclude '05ou.php';
) y3 W5 G/ V/ T: V) |; ^$ Y% l- c4 ^4 K0 w6 M& b& a0 S
new con\AdminController();4 v6 b, m7 q3 a# i- m6 M
----------------------------------------------------------------------------2 w  C# `) w( n% r" v! m( [% D/ V
05ou.php
+ |, \0 V7 u% k; x! o<php
/ ~) v; t: L! C3 Nnamespoc_e Admin\Controller;2 F- @$ \  u; X( p. P6 F9 s& L' \

7 J: e6 t$ y7 S6 o" I; ^6 ]" Zclas_s AdminController{
; L5 t. d& }' K; _    public functio_n __construct(){( ?/ k% ~+ o0 h8 W- Q/ B# n2 T
        echo __METHOD__,'<br/>';
0 M2 E- V7 o( C8 q& L- t$ X7 k    }$ t% B" @$ @, U# p0 s1 F$ j
}
# y4 A6 z2 I9 F9 Y  q----------------------------------------------------------------------------
, \2 i3 j- R- ]2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
: _- A8 f. ~  [# ~9 N9 @; B$ s3 A
! U" O( R- z) F7 v/ r----------------------------------------------------------------------------9 A3 i( `8 g% A' ?6 \7 @

6 G' \& q6 A! S! M, U04inc.php
- G5 L6 [$ ~# o<php
' b( c* m* z& `5 W$ k//引入空间成员类
7 s6 t2 [1 W- C/ l* k
3 |3 m' {7 E- k& n% s2 f6 Inamespoc_e Core;0 _4 H. t$ Q5 \! R& ?* X, ^) A
use Admin\Controller\AdminController;, |- t; y/ N% u" F* K/ r6 I
include '05ou.php';) w+ |! Y0 F- c3 r# z$ a  z

0 v( Z! a: M8 c  m7 M3 X  Nnew AdminController();$ s& t+ U# o+ q: ?/ |
----------------------------------------------------------------------------
& |* R2 w# d7 ^8 x05ou.php6 Z9 z7 L# v% j' w' e
<php
5 P6 n; @2 i9 hnamespoc_e Admin\Controller;
% N8 d" @4 V( p' c. r) b8 Y; W5 a5 ]) z7 D
clas_s AdminController{) p* U  c5 _+ t' |# G
    public functio_n __construct(){) B: A  q0 ?! l2 P( F
        echo __METHOD__,'<br/>';
) N6 f; C4 M3 t' P( B    }
) k4 N. |1 T; x3 _# q}- y1 T( Q8 L) U  F" ^0 r
----------------------------------------------------------------------------
; f7 N) i# w2 t# ^, d# O5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。# T  c# Z+ x) D) r. i
$ L+ E/ S/ M8 d" |( k% ~
: B  k; h1 C, \. m) l# a* l3 p' u
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
4 w: v( }/ x- \& l' B5 S  V
& W; t" V* ]- G/ D9 G% q4 F: a6 p$ ^( o5 {

; ^. |9 k& D$ \  J! U  D+ G# C
# L. E: G9 V$ v! v5 e% c6 s
. X0 x1 n7 l# X# n1 g
. h, E; k/ s2 ?3 A: `1 U" u




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2