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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:- q& a9 m# n- |9 N
0 @6 [2 b) V5 _
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:* u6 m. Z1 k  {$ C
2 M2 }6 C: |( L: V$ f

5 Z% X( t4 f  Z- }5 }2 K& I! ^! w& |2 P# K
我们来详细的讲解一下PHP中的命名空间:8 n7 V2 g8 X( G; v8 t
& l# L+ Q$ M* K3 I: D
语法:namespac_e 空间名\空间名;3 i, s0 _* ?8 J! G
- Z$ a5 h# R0 E" I( X7 U
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
4 W# D- U, v3 A0 t7 X5 e% h7 Y* w+ m; F# N
----------------------------------------------------------------------------
- A7 y' F( M4 C$ L+ ~: q
0 K1 A' a( t7 h" j6 Q3 D) V0 M<php
6 q; Q5 G$ @" L& e2 }& f! j, F" f. G  q$ N5 l, X/ p, Q7 b
namespoc_e AA;
' b$ ?# {: F; q5 b, U' Gfunctio_n showInfo(){4 k/ q- l& j$ U. _; ?% \+ ~
    echo __METHOD__,'<br/>';/ h- J0 _3 T# K
}
0 b' H/ |7 g+ s" z6 @% m* dshowinfo();
+ Y" T: j" M5 y: p0 n5 }& J) C' y: E; u) R" B' J! U  U
namespoc_e AA\BB;* ~% e( ~2 c- M
  J; V7 I- W6 R" X
functio_n showInfo(){- O  f- U: K4 z0 s# c  w
    echo __METHOD__,'<br/>';  g7 _7 |# `4 W. v8 z
}9 a7 p- }: b( ^# S" T" z
//showInfo();
! c, z& R6 E  q3 ?, I* ^----------------------------------------------------------------------------3 e" }0 {5 |- c
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
3 k4 i1 n5 o$ A1 t# K* l! m2 d7 F- F
, d5 B: P' Y, X2 h: |% Q3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
5 S. k# n) E! D8 v. U* Q  U* r- N) B$ A* M
----------------------------------------------------------------------------
( ]  h7 Q; A# z1 T
: [( A* s' r- V* K9 r$ ~<php" x# l+ n0 t0 b# _( B9 M% a5 w
namespoc_e AA\BB;
4 L/ j  C0 I; e3 k) ]functio_n showInfo(){
- J  |( s1 q! D& _: n    echo __METHOD__,'<br/>';8 g  z) U' Y: U- o
}
( J) ]" m2 }9 I' p1 p: [- xnamespoc_e CC;
1 X( H# x% F/ i: o( N; w! }functio_n showInfo(){
+ ?3 E- k2 N& p% p6 J+ y+ Y    echo __METHOD__,'<br/>';' s' p: L& x: `: h: y4 W# {2 E3 {
}& o: ?4 R& n0 V* s, @3 V9 y9 V' y
namespoc_e AA;
2 {# }7 b2 V, v4 q; Y+ Cfunctio_n showInfo(){
% M( ~5 D# l8 i7 ^* S+ e    echo __METHOD__,'<br/>';
' j) Y7 r, u9 n, U8 Q& G}8 W2 m' q8 [) p; x) L. e* o. Z- G
//非限定访问:用于访问当前空间中的成员
2 ]3 d+ F0 f: h- V! NshowInfo();
7 P( @0 w# Q$ t//限定访问:只能访问当前所在的空间的子空间中的成员
8 s( v$ m2 m# [! s' @- O2 ]BB\showInfo();
4 T* Y, N* M; w' o, f//完全限定:可以访问其它所有的空间的成员
# G& _9 U7 m4 M$ _& @\CC\showInfo();
, U- T6 r$ J7 L8 j, }7 i( {0 a9 j( t↑根空间标识符
5 C4 h9 m+ l8 [; ~: z0 M, Y----------------------------------------------------------------------------
3 Q! y4 ^& [8 N3 y/ z但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:% ^3 a7 ]/ M- A' Y

9 Q8 F- a9 W! G( U- t当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
* ]3 _4 }$ {0 z3 M. M) t3 a  E8 A7 Y. U+ \1 I1 o1 `3 e
代码示例如下:
; W, C5 x3 [8 H" _! H6 V, s. P3 T
----------------------------------------------------------------------------6 ~1 i6 L; b5 c: @

6 r) V" C$ |8 q9 {
7 b9 g% p5 I5 a* `: s04inc.php
( G  ^+ X3 V0 u6 y' \<php
( b8 j! P7 o* K" Q
4 h2 d2 o4 h9 f; o" ?! i0 Hnamespoc_e Core;
& ]  U& L* u7 Q. Xinclude '05ou.php';7 N- M+ i5 I4 \7 F9 i2 d: l
new \AdminController();9 t" L" W7 h7 Z5 R
showInfo();: r) X4 S4 }& t; n
1 j" N1 p9 V+ W6 m/ s
echo P;4 o. @" ?8 s$ v
//根空间中的成员,只要类的访问必须加‘/’
/ h  j& q% B. d5 ]----------------------------------------------------------------------------
# r9 p) V+ L; s. d3 W7 N- m1 O! V% @, Q9 V5 ]
05ou.php6 Q9 ?, c: \/ m7 T7 G
<php
0 ]6 ^6 H9 M0 M3 Y  ?const P=5;2 ]% t  h6 ~$ W; N

* @6 z: n5 \) f4 Hfunctio_n showinfo(){
! i" W$ @; a' O+ ]    echo __METHOD__,'<br/>';& v, b- o3 `0 U. W' i
}9 R3 r* m. ?% J3 P( ?/ a* z

! V: I9 ^% o& m2 W/ {" N! @3 ?clas_s AdminController{; a3 Q2 v0 A3 f7 f
    public functio_n __construct(){# P2 O$ G" H! ?0 ~- ], T
        echo __METHOD__,'<br/>';
2 f! H* h* P, s! G- a# O7 R4 f8 U    }
: S) D# S; m8 N' x# I) h}
  }! [; S( [5 ?2 \+ l) d" |6 j; N8 F6 p0 `" Q- f
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: h. f& m! z3 k, x# ~* m- E
----------------------------------------------------------------------------
  \  `: L8 [1 `* n. x4 Q04inc.php* _  S0 m. ~, O2 o( m% f
<php
, ]; V; v9 E* y: S
/ S/ G. ~" x* Q- }0 y" R% g3 unamespoc_e Core;
% `3 m! s& ]$ {) {( C- }: Uinclude '05ou.php';
4 y, t' X9 H0 N  X2 i  B) jfunctio_n showinfo(){
: r) g% @9 X. B( e' d3 j; V    echo __METHOD__,'<br/>';: X) J, J: ]( k' a( U, a
}' d, r9 E# O2 Q% Q% Q' [8 r
2 U0 V% k! A3 N. X+ _9 a
new \Controller\AdminController;
; a5 G0 d. l8 r5 _! f----------------------------------------------------------------------------
( o4 O* ?! S; ~  d- U! F' S05ou.php9 ?2 Y$ y2 p! F' D( y
<php* @8 O9 ~/ o; F; D
namespoc_e Controller;! B% u0 F1 m1 w. W% a- t

4 a$ p: o2 H0 P5 a) I* F1 gclas_s AdminController{
- |3 p: K% b( Q8 u        public functio_n __construct(){
, N9 H+ g$ R# Y$ N3 R+ W                echo __METHOD__,'<br/>';6 a& b" N8 w2 q! K
    }8 d0 s8 L$ V  i3 a2 V
}; R  s+ \# Z$ a. x/ S: k% Y
----------------------------------------------------------------------------% ]0 ~, ^! M( N8 o; {. x

: q- ]) x9 c: D! Y3 h4.引入空间成员:" s  f' R5 s) ]! j
, L- L0 ^6 s' s
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。$ }3 W- O- r/ C- b9 `1 w

, X) X, E1 g, k6 U5 C, ?6 i8 s----------------------------------------------------------------------------3 z: c$ E+ K) c5 x
7 K1 ?$ T0 W. A) N. @) K, e" D
04inc.php0 u# u  R4 r/ e! G0 v8 M3 f
<php, E, i( H/ _& r! v: |. U4 f
namespoc_e Core;
7 E; l/ V  D- L- puse Admin\Controller as con;. I9 `! |% t" ^. K% Z8 e

* j; f/ {7 [3 ]: ^include '05ou.php';
: H3 z7 A: z0 ~; \7 K8 u) g* h" |+ A$ b+ d1 R/ A/ {/ {* s( j
new con\AdminController();) g4 a+ T: D' G) q4 C5 L; D
----------------------------------------------------------------------------5 P7 ]. g9 G% K( O0 @
05ou.php
% d7 @' h' Y/ A0 i8 W9 q<php
9 t6 _1 Q4 y  I, Z2 inamespoc_e Admin\Controller;5 G/ a* i6 w# N" d

5 l$ q" v- J1 a5 H4 a' m' Z: ^" Zclas_s AdminController{
7 g, m5 f. q* F" ^6 }    public functio_n __construct(){4 O! A0 D; ^- x0 P0 T, A
        echo __METHOD__,'<br/>';0 D4 ?$ \# g* \. D  \
    }
! f+ h7 Z7 Y  A* s5 T, o7 V* d}
# N7 i" |) U9 j$ C----------------------------------------------------------------------------- C/ d2 o! \9 s" Q
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
8 W" }. T1 I1 }  F. c( p1 V2 s- Q3 L' C" p/ b8 g9 {1 `
----------------------------------------------------------------------------" [' o6 w, K) Q2 V
! f9 r% h* X3 x
04inc.php  S- }% g3 Z1 s2 k) u
<php8 J+ g. c( h, l9 N
//引入空间成员类
) s8 [& P7 G- p6 |8 P# R; e# n
; l" }0 Z: l, m6 p8 W+ I. Z- wnamespoc_e Core;$ l2 i0 [) e/ b% o
use Admin\Controller\AdminController;, H* L8 t6 \; ?: }+ P
include '05ou.php';
& K- h* f0 I8 A/ ~' g& z- v& e8 F- P3 K* o! {/ M# s
new AdminController();
9 ?6 Z8 u6 y) h& e/ e----------------------------------------------------------------------------2 z: g8 t/ r# z) ~8 M; j. O' E
05ou.php  T  n8 z7 u5 G" Y" t% e1 Y* W# U
<php3 b$ L5 J/ e% c6 w5 F& ^, ^' x
namespoc_e Admin\Controller;: B3 a/ M3 }7 p) Z5 E( I

* W. T' ^5 B  K  `clas_s AdminController{  J$ N! Q$ F/ ]# L) \& r6 |% }
    public functio_n __construct(){, D1 d' y# K" n
        echo __METHOD__,'<br/>';8 U/ c5 ?$ ^4 M: T' I2 O# q
    }# _% ]/ Y  i2 @  p4 l9 Z2 A
}
2 C6 x  t% _8 \% _; K3 Z. Z----------------------------------------------------------------------------( }2 {7 l8 O( c5 M% g% u; z
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
9 K/ ]: W* b! c) u/ O1 c
$ }* S( x* c+ \
  h, D9 S+ F! a6 U8 b这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。+ W5 G* F, |5 M- d
# H; H. b, I: a( H
" x9 `* `7 l6 g3 _0 Q# j
8 O+ {* E0 c3 Y/ r3 q
/ s: h) `# C' _2 v( W
) E; W4 V0 j$ s) N

2 Y, C2 o# m' L+ e8 D' m# o! F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-13 00:32 , Processed in 0.163064 second(s), 25 queries .

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