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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:
1 j) x1 h9 c& h7 F- h$ D0 ]5 o. s5 H
5 m$ w5 k' e( f7 y: |6 j在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
4 U- ^! n, D) l' U. g( \+ l& T  h! Q6 W
8 V3 J" A& v! i6 `
- h  U9 N% P/ Y8 t+ L
我们来详细的讲解一下PHP中的命名空间:
0 g' M- g- W+ |+ P" B4 b! q; t" i/ P& e5 r) w
语法:namespac_e 空间名\空间名;" q% x: M/ [6 Z5 e/ Q( G$ L

! Z. l( ?/ v2 F+ P- }说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
3 F- y% ]/ ^6 h$ \! |! C) _% F( a- E) n/ T7 ]
----------------------------------------------------------------------------
& q$ ?7 k$ u1 n7 x- w8 W' g0 K
3 @* Q5 o3 L1 B/ C1 L. V0 b; D5 b<php3 l8 N! ]1 y: W/ |6 x
$ t8 R  D( Q7 z) L2 P0 @$ q2 m
namespoc_e AA;
+ O/ @3 l3 N2 X6 R/ sfunctio_n showInfo(){
0 A* Y7 `7 A- A) _7 P    echo __METHOD__,'<br/>';
) F7 j: n' V+ Z# @, b5 b% k}/ f$ `4 Y0 I2 _6 t: u6 Y! d, a
showinfo();
+ d* ^" A; Q: n+ ~  n! ~7 [" a$ S) `5 e1 j4 S! I* s7 G
namespoc_e AA\BB;/ }, c% M8 S+ C" k
0 I4 j3 `' L2 K( O+ `0 D
functio_n showInfo(){
( g# m5 S* s0 p' C    echo __METHOD__,'<br/>';
! {- s6 ~7 i2 P. y; i( j  m2 ?* J}" V6 R# T) w. Q6 y
//showInfo();  Q! n1 j3 A8 a* L5 Q
----------------------------------------------------------------------------
- J' O$ B" z. ]; d+ i3 B& F2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
' P/ }# ^1 B" w/ @4 M& G+ r2 s! m; e) k2 v7 v, |  N5 b
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
4 _. V/ k4 i6 c& N6 `
3 j* R4 K# |- Q% p----------------------------------------------------------------------------
# [- ?: U6 L% Y- D. X5 s' s. h
# U2 Y4 B0 Z3 ?5 W6 g7 M<php- a2 s9 u5 J: |
namespoc_e AA\BB;
9 a7 V/ z+ q6 ~, j2 u6 ], `functio_n showInfo(){; y$ G; H4 M. h& F, P+ m
    echo __METHOD__,'<br/>';" Q. D, F2 q8 J# q5 u
}% o" I9 F- z- o
namespoc_e CC;
+ x. s) F4 H5 ~5 q2 m1 `- c+ Lfunctio_n showInfo(){" E% |  {2 e# x! a  Y* J
    echo __METHOD__,'<br/>';
; S9 @/ I+ c8 s% D  B2 v  P}
, a( Y" x& n. \( \3 c' Cnamespoc_e AA;7 R: E' U0 j  W
functio_n showInfo(){6 L: L# \7 d) z0 M8 K' ]& k# s
    echo __METHOD__,'<br/>';% N% w% L) X  f) ?
}
" Z5 g' [  p! [8 _//非限定访问:用于访问当前空间中的成员( ?" E0 L6 x! @* G0 B, Y0 r- v
showInfo();0 e  X3 Y, U$ b% A# C: D1 ?% H% ~
//限定访问:只能访问当前所在的空间的子空间中的成员
/ o. j3 `* ], U' C0 J6 @BB\showInfo();
1 s+ ]2 ?. {8 s/ l//完全限定:可以访问其它所有的空间的成员2 X* M" \8 s8 L2 N9 t$ V6 Y# ~! [. @
\CC\showInfo();
' ?0 q, o, I& T/ W, T↑根空间标识符. S: i/ V" E, q2 X# a
----------------------------------------------------------------------------( T7 R2 U1 i: c1 t- c) t
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
  A. W' p5 n/ a8 b
" o& x' Z* e1 r! ~4 a* w当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间), Z+ x/ p/ P5 L, v+ [+ a" q8 c

2 E/ W( P+ |  J9 y) h- I/ A9 [5 O$ I代码示例如下:( Y4 _3 p7 p: W

3 V, Q$ e! {3 v/ e----------------------------------------------------------------------------
* p7 B+ X# U, Q8 B7 u; ~% d/ |" v! Q

& k6 N+ n) r/ p( J* Z* d3 U& O04inc.php
, X. b- B# b# x8 x) m$ ?<php' d: ?8 {+ a) j: e/ \, |0 A8 K
& x. O) k0 {3 w7 h4 ?6 }4 _$ S
namespoc_e Core;
1 ?, L+ H# L" u: N7 ?' a# winclude '05ou.php';
8 W' ?. S; d/ a7 _: L( Lnew \AdminController();
+ X  }# N, A1 Y; z  cshowInfo();
! K- ?  V$ F5 ?3 l/ b5 E% b( V3 [( S
- n! J' v- U: y& c+ w$ zecho P;2 j' \* D+ d, f# }
//根空间中的成员,只要类的访问必须加‘/’
8 z9 ^, G9 Y, T: d+ X----------------------------------------------------------------------------6 `5 n' w! u: `* l

  v( g' _" c1 X8 X- c05ou.php
& v8 K$ ^' E- [6 A<php
& p. t1 B/ Z+ W; G0 Xconst P=5;! c! `) G* ]) R* `! |# L' _

* T5 `4 |; N" M; g$ K* k" Rfunctio_n showinfo(){
9 ^: D  m) i* \! \3 ^    echo __METHOD__,'<br/>';
7 f+ g+ P$ W4 g- V: g}
8 s9 ?2 a: `- K
. `6 R! e: m5 l* W  O( C1 G) Qclas_s AdminController{( A- {7 o4 [% @3 W( j
    public functio_n __construct(){8 |% ^# k% l: Q0 P
        echo __METHOD__,'<br/>';
+ b- V7 a) K. m/ k    }) e* I+ b3 b& ~0 B0 _/ H8 ^
}4 _. e% i* b, q2 m6 x
6 `, ]+ a1 |' k/ j' J
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
: z) K' s5 l6 [0 H----------------------------------------------------------------------------
+ y- Z8 L" \! c( ^  w) u4 w2 ?04inc.php+ v4 m+ N: c; b# z: D  M& \
<php; E1 j% T. K# c% U6 u6 A0 \3 w

" V3 x& |& L; K2 _, @1 ~/ @namespoc_e Core;
' r# J; r1 ^8 h2 `include '05ou.php';: W$ J5 X+ x. \% |
functio_n showinfo(){) A& a- x/ E+ c6 P
    echo __METHOD__,'<br/>';+ U9 S! v7 [! {
}) V. v% x0 T8 k

  O& g) P1 M+ Onew \Controller\AdminController;! ^7 ~& ^# A5 ^- O
----------------------------------------------------------------------------1 {/ e! D; _: }# ]
05ou.php
3 a0 v( i/ C" k. F<php
- Z& D5 \8 s. d5 ~  a1 @& w% a5 F: U5 tnamespoc_e Controller;. g2 f$ _" k- A4 R

4 \0 P% G) ?+ c' E( qclas_s AdminController{2 t/ Q3 G% `5 ]/ M2 Z0 m
        public functio_n __construct(){
* K) R- I# F9 K  N. A0 q                echo __METHOD__,'<br/>';) v' b4 Q7 l, _: h
    }
) o7 x# ~3 _9 r( K  G" g}, X% I8 K) N: F. _* y3 @8 j
----------------------------------------------------------------------------: y% h& |& U1 F7 u! ]
# \" w: ]3 p. T; g
4.引入空间成员:) Z8 Z; t# p2 S
# q' U* j& T& F! f5 e0 x0 D) {
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
: p. Y- T5 O* k7 O' i; ~" {& l) l) q+ O% c+ ]/ E6 U7 ^7 {/ g. W
----------------------------------------------------------------------------
- i5 a0 \9 I: Z, X
( F, W& N- D- }7 m4 w04inc.php; T" S) ~6 \5 {" _2 ~! |
<php  {! V9 ]* U" h
namespoc_e Core;! w/ V4 t! L" l; \3 g8 h# w9 n
use Admin\Controller as con;
- I5 \, w9 u8 ^2 }# ^
4 O5 H5 [, s6 c6 N. h- F/ rinclude '05ou.php';
# ]2 q# o0 Z* J  G( K0 E5 D
" t; `4 X. K* O3 ~- Onew con\AdminController();
& D# T" I( o2 ^4 m0 b----------------------------------------------------------------------------
, q7 }8 f5 C& l3 N! \; m05ou.php
, d( s$ g3 x1 d4 h, L<php
& u# p' [4 R2 t4 x5 e$ h- o! bnamespoc_e Admin\Controller;) ~' Y) l. [+ Y4 N) }) M4 W
2 \$ x: w% R' a% I' S; j7 B3 |. H, }
clas_s AdminController{
" k9 y- G; k/ H# `) L    public functio_n __construct(){
, o  y/ J0 M$ o* G% Y        echo __METHOD__,'<br/>';
) E6 I+ v5 e" l& n    }: K. ?% o5 P( @$ `9 i
}: J9 e+ s0 M2 u3 {- e
----------------------------------------------------------------------------* Y6 @8 B# F* V$ |0 T! F' y/ T
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
/ I! c- F2 m0 P1 O2 o& [, s& y1 d$ u% M) \, I3 j: `
----------------------------------------------------------------------------
; D" ^7 t+ {1 |/ m3 N/ ?  Q5 C) ]( a9 u  m5 w7 k% z
04inc.php
/ r) p7 v( q* e4 ?" {+ p7 j, T$ S' r<php
  _/ S% y7 j" g4 b5 Z" q//引入空间成员类* E& I% s' A- W6 f. E( v. ~: s
% @4 H: u$ \# w
namespoc_e Core;  `$ c( K6 X- ?9 k+ U1 `
use Admin\Controller\AdminController;
3 h4 Y1 q7 ?  e% Z7 winclude '05ou.php';% T' k" T! s% ]' t

) q, _8 s/ L; @/ @new AdminController();
  I0 J0 `; R6 [----------------------------------------------------------------------------+ a- w- J7 ~3 Z; s
05ou.php
8 _* n: d1 H. [1 k" c! [<php' E% a+ n4 W, y3 v
namespoc_e Admin\Controller;
" y  i$ y7 W- `5 I0 e% s' {+ B$ |7 c, {# C. F0 [% F. r  h. K4 S
clas_s AdminController{  h2 F3 k* v' L. V
    public functio_n __construct(){
  p4 Q+ h7 r: c- Z* a        echo __METHOD__,'<br/>';
2 U. q+ w! h- c8 @- Y" f    }; r& p, K1 j4 w# \% j- Z3 X+ y2 V8 d
}3 |$ [6 H. I; e1 _0 N. W& l
----------------------------------------------------------------------------* _) F; d) B3 ^6 m. b# T% }; I
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。2 w4 z( D: @$ h8 u0 N, e
) A% p% n/ d+ A
9 m4 K( Y; A8 b$ q: j
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
' |: ]! Q8 r; m: _
, l: b! G' D" D+ U2 M3 K6 C' k1 {+ g: u3 c' ?

- P/ [4 u& M3 f- E, B
) g  ?+ B3 T$ ^) w( N5 `+ Z8 R
* B$ D7 P. Y" {, q; N1 F
5 G6 C* m: o' ^% S/ Z0 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 20:57 , Processed in 0.053688 second(s), 23 queries .

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