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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
) u: y6 }. q7 ^/ w) V5 n
/ I. S$ A) F! V9 y- U" h在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ C# J7 S; z9 s$ K3 T& r

2 x. @7 Q9 S; B: z; p# }& T7 H9 C) z
+ @9 V& X% w5 z, b- k2 i7 Q0 c1 M$ ^2 m. n! u4 G- c
我们来详细的讲解一下PHP中的命名空间:1 g( P  e0 f( ]6 G% H

1 u4 ~5 w3 Q: [5 M, i语法:namespac_e 空间名\空间名;
. h$ W: g% g$ n" d! y
$ t+ b  \+ J  f- i" u3 A说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 v# y, W; g& Q$ G  p& F& N" _. w1 u" m5 b8 q
----------------------------------------------------------------------------
- \6 }1 V/ _1 G# K. Q  i) M4 C: M% y* J
<php( W, }) }# x$ N7 E: R9 P

( n7 |) g$ j  Gnamespoc_e AA;, U# Z; R2 E) ]
functio_n showInfo(){- O% M" O3 ~9 K5 s: |
    echo __METHOD__,'<br/>';
. y! k% W& Z) _* J+ t$ U5 G}5 }, B  d' g/ K! c! j7 \
showinfo();5 ?  w& \$ t6 r
- O( i6 _. w( o. {
namespoc_e AA\BB;
! g6 s5 \4 E, t$ Z. U3 `* S" C' I+ D8 ~( r& }4 G8 @) Q
functio_n showInfo(){
1 O4 R. G) n/ @* i( _* Z    echo __METHOD__,'<br/>';
+ J% r) |8 D$ ]# N, s' T; ?5 O}
2 a, l5 [1 [1 x* @  s7 A//showInfo();
' a% M' {, O- \6 w1 o% [$ U  r----------------------------------------------------------------------------
6 h6 _- |# b! f3 V2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)9 Y4 C/ W2 @9 b1 y/ \  Q2 ~6 T

5 v/ I+ P; d3 w. W3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
2 `) U( R: W' c# j7 v! ]! a9 t# o; D3 [" B: n) Q
----------------------------------------------------------------------------/ \! a( X. }' D5 z* E3 j, Y

( a! r7 R4 l3 r. \<php; g9 ~8 {+ ?. n6 q: N
namespoc_e AA\BB;
( }  q3 r2 P7 ?2 b4 Nfunctio_n showInfo(){
0 x3 i7 j- l! U' h0 ^    echo __METHOD__,'<br/>';
  M' l+ M/ j+ B9 a8 A6 ^}$ [# r$ z* }7 L% d
namespoc_e CC;+ E" j' F( b9 ]
functio_n showInfo(){  X6 `3 ^4 ~, X( s( T
    echo __METHOD__,'<br/>';4 A/ T0 Z$ F* \& a& R, c, S
}
* _. Q$ v! v' f4 Hnamespoc_e AA;
9 K& L, m0 W# rfunctio_n showInfo(){
, h5 R! m, k  M% O; T    echo __METHOD__,'<br/>';  r& w: `8 S  d7 A
}) b( G, T% b/ i/ C$ y
//非限定访问:用于访问当前空间中的成员
" O9 G$ A3 j" BshowInfo();
* e0 {2 B! q" f! z" o//限定访问:只能访问当前所在的空间的子空间中的成员: {- t; s# K( V* B' \; r! o
BB\showInfo();% C( N& L! o8 o3 w) I
//完全限定:可以访问其它所有的空间的成员6 h" ]* S3 t, A$ F
\CC\showInfo();
/ Q/ A9 e6 \+ a+ K↑根空间标识符
9 z/ E  @2 t7 {3 q----------------------------------------------------------------------------
  R. z6 ]% u* A: U+ H但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:4 |' h1 l* k8 K; S

, s8 ~, s5 |, E2 R8 j+ U2 q当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)8 A  A0 e2 q3 r9 [/ i

8 D3 F3 [) H: h代码示例如下:! d# |# _8 d1 E( M
7 d1 B: N/ O! t2 k
----------------------------------------------------------------------------8 t2 V. V' S2 [- n5 C5 n
4 j) m3 ~- ]( U; u' e* c! g

8 R! K% _  }: J* e04inc.php# K. M7 Z3 M# e; {- r7 `
<php+ l* {1 j" s1 n/ I% p  j
, w( y3 ^( b: }* J4 z7 l- h2 F
namespoc_e Core;$ n3 N2 G3 K' Y# F( K$ o
include '05ou.php';: `8 T  R4 ]8 ~: f1 @) K# `
new \AdminController();
/ \- \8 t" V  w5 j$ kshowInfo();
) g/ R' T: Y2 k9 m" Z* x/ X
2 g0 l% |- p* }2 Fecho P;
7 c/ i- h5 K+ x2 d//根空间中的成员,只要类的访问必须加‘/’4 I. V6 j/ ]9 q' t( i
----------------------------------------------------------------------------
" i# X% |  c# k) w% l% t
7 r+ {+ _  T* R$ i* R: s05ou.php/ ~; V( C9 }, y# |2 U
<php8 D. d6 \5 J- n+ d) Y3 Y; T8 s
const P=5;) ^/ P. }! L$ j9 L) @
- `" C4 k' K8 ~  s. {- D
functio_n showinfo(){
' ?6 z2 f* y) w    echo __METHOD__,'<br/>';
6 f5 h/ j8 Y- Z) S7 ]1 M}3 {. f  q1 K/ H  p

) }1 K5 f, q6 G( `2 {/ ~clas_s AdminController{- f* N1 x6 o% f( X, w5 L
    public functio_n __construct(){
/ \5 {  }- \/ G7 }4 I* T        echo __METHOD__,'<br/>';
5 @) n! S9 M. r  m8 B3 q1 Z    }4 q$ `* Y/ m7 d" B1 O
}; w' c3 z' w2 @, O
4 }/ l- D  o7 ^8 l
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
- \- D0 T, l- y$ h2 k* O----------------------------------------------------------------------------) d2 Y- i( E2 ?( s% q; o
04inc.php6 \5 ?2 W2 |& H7 {  o# V
<php
/ l8 k! Y3 c% k" D5 |* N6 k: v' ?, x/ W+ j* U' i7 }
namespoc_e Core;1 _$ x3 b' `) q% j$ O
include '05ou.php';0 P/ T* W: O& R0 B7 Y
functio_n showinfo(){
1 M9 U2 l2 E- C9 n. ]    echo __METHOD__,'<br/>';
+ p2 H, b" O. U2 D' _- d}7 T. a) T5 B' v

1 |& ]  j" A% F5 X; _" X, |. gnew \Controller\AdminController;/ H2 y& W7 D" N  n) V
----------------------------------------------------------------------------
' m4 C/ K* A( r+ V; R05ou.php) ?) ?/ b, P2 }% B/ Q8 ^
<php
3 A, `. x! J- D* E* {8 F$ \6 Ynamespoc_e Controller;
* S) E$ ?) ]) J" O2 N
! I6 W' S6 E) uclas_s AdminController{& a1 o! Z. z. B6 Q3 }
        public functio_n __construct(){: Z% W% l1 _/ g# C, s
                echo __METHOD__,'<br/>';# j) }( q2 x" [( R# V: v
    }+ g, D; r8 P; X
}: G3 ?( H& [  X" q
----------------------------------------------------------------------------! q& Z+ E  x, X% I
& @& ]4 s  B0 E- c
4.引入空间成员:
; U7 G+ p5 m( w# e- d% J) j- G0 a
/ L' I: p3 p1 [9 t: h1 f1 ~1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。$ N( Q6 R8 y. s5 B3 L

7 N( A6 m0 u9 p----------------------------------------------------------------------------
  e' S1 R+ [+ a) s5 E7 l
' Z% Z' c4 B4 B+ O$ D04inc.php
" m8 j! u$ W9 |3 W6 j6 M<php3 _5 B7 @1 r4 D$ U' L% @
namespoc_e Core;
3 e+ t5 W6 u1 suse Admin\Controller as con;
! r& U8 A2 s- k$ h' z7 }' e2 S: ~1 l) C2 M9 E* {  T9 h5 ?* U
include '05ou.php';9 ~6 j. s3 ~7 O

0 d0 H, u) P6 t6 o9 \new con\AdminController();
- W0 z1 c  {) b) b, D----------------------------------------------------------------------------
1 A! A! C8 f6 j. H4 }05ou.php
  A0 ~4 q5 A9 P1 a" G<php
$ l& O& ~  j& l# X: z4 l/ ]) s' S0 gnamespoc_e Admin\Controller;
! X: c9 W* l) r8 ]* _* ?
# U9 u- g4 L! ~" R7 [8 h: J% @clas_s AdminController{
1 T1 _3 ~4 X/ ]# e$ p- X) L5 Q    public functio_n __construct(){
  ]! o& w9 {8 D2 k) F' ], K        echo __METHOD__,'<br/>';
6 K& l6 \- D: c) u, a: M& ~) \+ T    }
/ \( _$ e  B2 y( g}6 j4 R  |* |( }8 ~8 h! u' ?6 a- S
----------------------------------------------------------------------------/ Q. F# H9 @9 e0 T5 L
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。, @# C' x3 L& w, A+ k

, R+ F+ W" d( B) L: Q6 H7 g----------------------------------------------------------------------------
3 E6 M1 Y' y" ~% L3 C% C# L! z+ N+ h8 }
04inc.php
" r- `! u# b+ q. P( c! ?<php
$ h3 w8 s5 E6 P/ H9 U' F//引入空间成员类
  p* E, \) D7 m( s3 r8 j9 I# `3 S. h/ c$ _7 E7 G/ h* A8 ?+ s
namespoc_e Core;
# n0 H- q2 O, J7 P7 @use Admin\Controller\AdminController;
7 P  z; @5 y8 K0 H8 i! ainclude '05ou.php';
$ u, G. [& ~3 S
/ n2 e# j% o. y8 Onew AdminController();
4 B# A. r' \3 t- v" {# f- l  \) E! p----------------------------------------------------------------------------9 D. @5 D: L+ @  O3 F
05ou.php1 h7 D2 o( Q4 @, y2 a& p4 W# D  ]
<php
7 ^5 H3 P( Y8 p) o% n7 h$ }namespoc_e Admin\Controller;& w9 t4 u4 `0 `! S9 e0 b$ n4 V4 a6 M
0 T! h5 t1 R/ R
clas_s AdminController{4 k& D% Q# V2 Z# k7 {; m& X" g: g! f
    public functio_n __construct(){1 _, G/ L4 x* |$ s2 L0 K8 R
        echo __METHOD__,'<br/>';
' T8 L. k: {' {, ]0 }" Q! h& Z    }
4 T# S# F5 c. v; l; H7 t1 o7 z! J  n}
: k/ l7 P% Y7 U----------------------------------------------------------------------------
4 f/ Y; A5 A% F, V' v, O; Q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
" C4 D2 k, S6 f6 H# i& p! J' A. T: A; G/ [. h! }
, I1 Z+ A0 U: d# s# m; P) E
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& ^+ X( l; D( Q9 `  r- k. i

4 W0 c1 j9 P4 s0 k, `. O
3 n. T( n$ d! w8 i5 `  x, |& U- I& D/ U$ x6 E
9 D& G" O/ O8 A7 R6 f7 ?

' ~  x# w. x6 ^" ~1 i* h7 _3 o$ X( |8 D" C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 11:48 , Processed in 0.055697 second(s), 23 queries .

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