您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11805|回复: 0
打印 上一主题 下一主题

[php学习资料] php中命名空间(namespace)的作用和使用

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:+ {9 U  c8 U& k6 \- Y" u
% t5 j0 c; m" r$ J+ L' a. Z* G
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
9 y4 s$ V) ~# q4 c0 t
8 ?- E' o2 `8 ]' ?- V! m $ q! g) G3 Z' ]4 ^* w
8 m7 ~2 u) {# `3 h+ f
我们来详细的讲解一下PHP中的命名空间:3 J" U1 Q. K' p2 p+ F6 n' ~
1 Q% o! y) F7 D' r' m7 H
语法:namespac_e 空间名\空间名;
* z, O& u! l$ ~5 U: o* _( w/ O
% g; m$ F; V: |; X! S2 v说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:4 p: \7 i/ p% P2 L% R8 \  B5 Y/ G

) o0 p/ c; H# k. S7 z----------------------------------------------------------------------------% h0 O4 @2 d3 c8 o9 Q

* P" V  a& ?, a0 M<php1 n/ b% |$ |$ b5 c# ]2 y

# c( @3 ?) B* k) w# u2 qnamespoc_e AA;7 o/ o6 q9 M/ h% \9 ]$ v# [2 M
functio_n showInfo(){
1 [; n: c' `. Z+ \! \: p    echo __METHOD__,'<br/>';! j3 s" |) D0 k* U- X
}4 t  J7 A1 m$ l
showinfo();
' O" s. E6 b/ @2 r2 G3 ~5 N. B) b- B- |1 e" T. X
namespoc_e AA\BB;9 G! Q2 ^- K3 X4 N* ~( P

2 K; Z* t, ?, v/ f: w! c- {functio_n showInfo(){# V+ L1 S' S& C
    echo __METHOD__,'<br/>';( ?; f) ^& G5 }' n  {. E% p
}
' z+ A  S5 Z/ H* ^; _& s( e//showInfo();
1 m, k! H/ j4 v: C----------------------------------------------------------------------------9 }, E' w; Z, Y8 i
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const): M4 z# [+ P6 [* e1 W

$ V- G, }- f, S! @3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
$ ~% q0 }- V, n1 {/ _
: c. D. A, z2 e, e5 u, X! \! N; _7 W% C----------------------------------------------------------------------------* C( G! H+ l1 {) k# F: l" r

7 b; [- d! J" N<php. x& H6 I" Q7 [! {
namespoc_e AA\BB;: N" b4 [, |. v) D
functio_n showInfo(){
4 {6 Y( e2 [$ D" v- H    echo __METHOD__,'<br/>';
1 \8 H( V  B5 k  g+ Q3 T}
( ^/ g8 I5 {) ~* z) n1 Bnamespoc_e CC;2 V' X/ {- f5 H
functio_n showInfo(){
3 j+ E. p1 {5 u* a    echo __METHOD__,'<br/>';# n) J$ J# ^: _5 C: z
}
; l) G5 P* p( a+ Y  dnamespoc_e AA;2 ?# T1 f7 c1 s" Z6 @
functio_n showInfo(){
9 B- ]7 J  `  K& n. j! m4 Q    echo __METHOD__,'<br/>';
! c7 @$ k& Y# B}
$ Y& O- b1 Q+ q' p6 R$ ~//非限定访问:用于访问当前空间中的成员
8 b* P" ^% r( S, V1 Q" J0 v; QshowInfo();$ M  c5 N+ _- `, w0 c
//限定访问:只能访问当前所在的空间的子空间中的成员
6 `7 p8 d: `! c% LBB\showInfo();
+ z7 q% ^6 w0 y0 @3 T//完全限定:可以访问其它所有的空间的成员& k' Q6 m/ _$ o' k" I: ]6 w) F4 o
\CC\showInfo();# C7 u# m- m2 \( i
↑根空间标识符
9 ~1 B1 H1 c( Z----------------------------------------------------------------------------7 R) @( @  G4 }) q% p# e( I" A
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
; A+ |# j4 i1 Q( x. D1 W" @* p9 N2 s- k' v% Q
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
! Y, B8 G% P: q& i1 Q/ L8 a
4 X! Z% R3 ?4 o6 P' M# p代码示例如下:0 ?* U1 c: z! \& H
% P& i: L4 E  T5 A
----------------------------------------------------------------------------
; X  W% u- m! Q
  r: j3 M( w$ e
& H: @; n" l; r# f- w6 u* B04inc.php% h+ ^3 `& G9 {  d! q; Q) s
<php, K1 y  K) f' I5 r# U

1 q# V, s$ @* M6 jnamespoc_e Core;
. {- T7 ^) C; h9 E; ~$ rinclude '05ou.php';
5 S( i% l: Q3 \new \AdminController();
! n* H, o' I3 z) j% m; d9 PshowInfo();
4 ]4 q8 M$ M, k+ b, @
! U1 e& c/ {% {( Z. ?echo P;
! F* {  r: Q% t, W8 h7 N. l' t) w//根空间中的成员,只要类的访问必须加‘/’
8 q4 d4 y! N& k7 f  o% S----------------------------------------------------------------------------! u7 B* a- F# {  T% r, B
4 C# B+ r' M, x! r7 A
05ou.php
2 m6 X' p0 z9 ^/ q$ D# O3 g<php
2 C  S/ \! l" `& Rconst P=5;; Y6 G7 ~/ T( F1 B

* m4 G4 e$ x# n0 i2 c, H3 bfunctio_n showinfo(){+ i5 b7 G. s7 X" @+ E9 o
    echo __METHOD__,'<br/>';
# k, e  i0 [; L3 a$ O3 m}/ h' ?1 o/ E8 J$ ]) z4 Q

  w3 F) H+ Q4 C$ G5 z. Zclas_s AdminController{/ G2 k7 \& H% V3 \7 E
    public functio_n __construct(){
5 P# N; ^6 n. T1 ]) X        echo __METHOD__,'<br/>';
$ z0 T1 P# ?. m6 K. G- o    }
9 p4 a0 L0 X: V2 h" _. x8 }' A" x}; ^" b( h( ]) Y, ]

! i5 E% d+ V) D% f0 R5 I( I8 v  n, I8 j第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* V" w; i! n0 S
----------------------------------------------------------------------------& D3 _% z' J( t
04inc.php
' U; l! ^7 b2 U% _& l' h9 Z<php
! K/ F: z: p8 z& O" n
' R" T9 Q+ w# w9 R5 u+ pnamespoc_e Core;/ d+ a/ u5 q$ h$ m" t
include '05ou.php';% F9 f& [( q0 k3 z9 X( U5 s$ A- m
functio_n showinfo(){0 ^! I' P, O5 t
    echo __METHOD__,'<br/>';
9 n) p& j8 Y. X2 j}6 N1 h1 Z- I. Z- M

( S$ F; F7 u- @5 d! o; rnew \Controller\AdminController;' R1 F' f) c. e+ U# d
----------------------------------------------------------------------------
) B; u6 q; r. d1 d, E05ou.php
7 b6 J  ^# u9 h2 S* F2 ^<php+ n( \. _: n9 G$ L8 }
namespoc_e Controller;$ I+ q+ p6 U8 X0 o* }
3 u. O8 q3 z( [+ J/ X
clas_s AdminController{! t+ i! G: d" X+ W+ j
        public functio_n __construct(){  l: @, r0 G, n
                echo __METHOD__,'<br/>';
9 i6 Y4 _+ t# ?7 R' l6 t. r    }& G$ N$ S. o: q! b- s8 }
}' t, y" a* W: U5 f6 }; I# \" i
----------------------------------------------------------------------------
' f8 a! z7 Q" X  f' I5 e( w6 F$ z: X( r
4.引入空间成员:
& k4 O! D$ Z, o) z2 S6 r! g
2 z4 j2 X: c# V4 V) H( q1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。& G# X4 r( I0 y# d: @! B8 ]

1 [( ~. z* w2 b. e7 Z8 j0 o----------------------------------------------------------------------------$ x7 b! A5 u- g) E

& \; [  k% c( S1 @3 c. y0 ?9 r! d# a04inc.php- W  `5 ^; p1 R& T; l/ o2 P
<php1 e% y0 a+ }! f5 S4 C4 E; Y
namespoc_e Core;+ W' T0 [' a' S' j, d8 c6 Z
use Admin\Controller as con;0 K5 U5 \1 J3 l7 G+ T, l2 s1 P9 M

* q/ D( @( V3 `6 g5 u8 Einclude '05ou.php';
- l6 v( C& k3 z# F  X# {9 t
& l  H9 q& C- [: X' S8 t% I  b, Pnew con\AdminController();$ e9 [; R4 H2 H9 S' ~; L- C- a
----------------------------------------------------------------------------) C$ C8 k1 y$ \3 j
05ou.php9 N4 A* Y% W9 m! P
<php
9 K6 C  Q- @% K9 Jnamespoc_e Admin\Controller;  P& [( l8 B- p: M! w4 Y* N4 J
1 s2 W& _4 K" `' Y
clas_s AdminController{" y2 v2 ^& I1 G3 [! u( U  c
    public functio_n __construct(){
5 M: r- o) i( k' z# R2 ^* c        echo __METHOD__,'<br/>';" A7 y' T9 X' U& Q
    }# A5 d+ w8 X2 Z
}
+ Q% m' r8 l/ ?; j; @- Y1 M----------------------------------------------------------------------------
. j( ]$ K& l& E3 T. R2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
& [- G5 m% L- y$ m" n' Q  j( f8 i3 k, M  V9 c1 g9 M0 c9 P
----------------------------------------------------------------------------
! F, s# ~! @; _) S2 w% T" J0 i
  x" ^# R  ^1 B* B. Q! A04inc.php3 C* @: q' u3 F( }. S' X9 ]
<php" H& l/ g3 m4 z
//引入空间成员类, J; h% M8 f1 N! r
6 j  S& O5 [7 \9 b6 l
namespoc_e Core;3 N/ v. M  X5 U' ~7 E
use Admin\Controller\AdminController;
7 f/ M6 m; E4 m0 a  h; W2 _- jinclude '05ou.php';/ X6 W/ T" m8 V" g
- H6 S5 H( u( Y+ L( d1 ]" N
new AdminController();
3 ~. `  v7 ]; [- T7 Y----------------------------------------------------------------------------
( O* C' L) x: \" Z. h05ou.php
6 p/ S. T; F7 i; d# c* s- |. h<php
: A' U! T4 N. v) A7 _* `- P9 s0 p  Dnamespoc_e Admin\Controller;3 E$ I3 u, Q- ~

. s; V# t  `6 B: {5 T' H4 |clas_s AdminController{
# ^! X4 t# L, N0 f/ s    public functio_n __construct(){( k2 F/ s! i* f: M3 T
        echo __METHOD__,'<br/>';% Y1 I  `- y+ {5 G/ ], y) ~
    }3 D1 N, \1 I! f; j4 G2 p6 A
}& W8 X4 s5 {% d, C
----------------------------------------------------------------------------
8 i" U* L! C& z8 J% I9 ^5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。- e/ \, R: x3 r, G4 R6 S
  O2 L4 N) F$ M

/ L  B7 e, \7 x这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
8 R# ?" M, r8 j% T. w
, \( b& I  s* P9 t! l, L% M: X, ^

2 G2 N- T) k! W. M" W/ e8 q- F3 \) J+ I" Q* f6 N( I
) i7 ?' C: ?: X! k
* t' e& G( q9 p0 H& T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-27 19:38 , Processed in 0.141873 second(s), 25 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!