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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
1 a8 @1 l+ H2 l: s0 Y- t1 p, _- B6 a" L+ N7 i; o# F% U2 w4 a
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:  ~' i/ {0 n/ W
5 F6 M% v0 {1 F" {" G4 z
  h* f: i' ~: V

7 d: x2 R7 W% C. k+ O我们来详细的讲解一下PHP中的命名空间:' Y3 m( k2 }4 U# `* g. a
4 F/ c. R( c5 g1 B$ ]/ G' P
语法:namespac_e 空间名\空间名;- W! @- A) z4 }

5 v" D( r7 g- J+ G说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:1 z$ q; m4 t3 J, c  `
) Y  e8 z- P) P( [/ U
----------------------------------------------------------------------------  U7 R- b' A. ?: f* l

5 U$ H) i* z6 l, Z! H<php5 g0 F  Q) d1 c0 ^+ i8 h
) v" C, T3 v$ O0 {) a; D: h
namespoc_e AA;( x+ \+ H1 V- x  V  k
functio_n showInfo(){9 N7 J, x5 r! u( p- E8 O$ D; J
    echo __METHOD__,'<br/>';
$ y7 X  Z) k6 b/ Y& a8 F" R; X* c}  ^% i4 Z/ x; l5 [/ O
showinfo();  ^  w; q3 X+ k7 a5 x( }- ]8 T

* q! p  q* M* z. R0 wnamespoc_e AA\BB;
+ F0 N- n' Y: B
# e0 T0 Z5 z: m4 _functio_n showInfo(){: ?! \' \' t2 q" v0 e
    echo __METHOD__,'<br/>';% }1 X/ r/ _, e8 q
}
" Y, @+ s8 }. u0 X//showInfo();' |: @! P7 q& t+ s( N/ q
----------------------------------------------------------------------------# V5 u. N* d* G5 o, g2 d
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
# {2 \: `5 S  {; ?- {4 O6 u7 y
; [# {4 n. w# a3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。- Z2 _" t1 K0 [% h+ P
5 r7 Z2 @6 O7 I3 P6 y1 U
----------------------------------------------------------------------------
. Q& X. |  B% ^+ P$ H. Z" t+ d8 C7 Z& P; Q% {+ E" `8 z
<php
: `5 z) [  A8 ynamespoc_e AA\BB;6 Q! L8 p" D/ u3 i
functio_n showInfo(){9 i2 f4 g2 X+ |/ _2 i
    echo __METHOD__,'<br/>';
: V$ F* v% B3 @/ X; B% X. n7 ]}
* ?7 D) S1 b7 T1 K; N: ?namespoc_e CC;
$ j# B7 M, A- J& k* B  Yfunctio_n showInfo(){
" C& k. i3 O+ P$ a    echo __METHOD__,'<br/>';: Z/ |" O2 x# S+ R
}
1 @2 x1 o$ {$ `& E4 Inamespoc_e AA;
9 Q8 v, y" S: o5 g( Y6 lfunctio_n showInfo(){4 |. Q; q, Q- u9 ]- w2 H
    echo __METHOD__,'<br/>';
6 o$ |  B1 J& Z. }0 b}. U0 `( y  Z+ m1 \
//非限定访问:用于访问当前空间中的成员! U" Q$ E$ z4 X, P9 ?8 L" H
showInfo();
8 T$ j9 d. c, i! I//限定访问:只能访问当前所在的空间的子空间中的成员
3 X. j1 }" o$ t9 x! `( R3 E+ BBB\showInfo();
2 ^  K8 l1 x+ @1 Z//完全限定:可以访问其它所有的空间的成员( W% ~( L9 |0 l" ^
\CC\showInfo();
9 ~0 c0 N. }0 l. Y8 U) {. F( |↑根空间标识符* }0 Z! Y6 s" j- |* x% r8 n' q# W# J
----------------------------------------------------------------------------
7 \) }  M  i2 Q$ S/ l但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:0 @! s7 Q- x! ~

* P, T6 j0 I# t) x" I当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)9 F( I& x) j% p3 Z% L* M
9 x% E' w1 q6 I& [
代码示例如下:5 S3 E, J* i2 t  a
4 F% Q; o9 p9 g$ \" J8 a+ m0 ^
----------------------------------------------------------------------------9 m$ N! L! \* r: P. [9 L. q
3 ~: [8 i+ m; b7 F$ E

4 K# N: d; m% G$ H8 b04inc.php
' o$ F* z9 R. W* z& ~<php
+ d, G9 q4 x; g3 |! l) P0 H) n: u6 X
5 Y1 f  e# W4 @+ I/ X# w- Fnamespoc_e Core;2 A  R8 K3 C5 a7 @: m- A' x4 W
include '05ou.php';
) m! N  y, A" U  u/ L6 X; jnew \AdminController();
1 c3 _! Q0 s. r! A8 M. xshowInfo();( J' x, y4 G, A2 N& c

8 r1 p! A0 m0 e3 j- {2 iecho P;* z: `  P' A9 v3 v) V- e
//根空间中的成员,只要类的访问必须加‘/’6 t  _1 G) A! C: n
----------------------------------------------------------------------------, B5 H# m4 `! p5 Q8 }3 E' x3 z  |
% R8 Z: `2 K, p* E9 i7 y
05ou.php5 B! }" r" B1 d# a% ?7 f
<php& `9 _, _! V$ q; G
const P=5;
; Z* y- D  n2 X4 _; L4 ?
, ?. R4 p* ~* v# E* C$ ]& ifunctio_n showinfo(){
2 h" q+ d. Y8 ?2 x$ A    echo __METHOD__,'<br/>';
6 `, [4 V$ x, C; e}
" c- }5 ]5 P& B; A  V4 g# W3 a' }, ]) z0 p: F0 ^) D6 X8 t2 d
clas_s AdminController{) C8 x: B- {! j; ^* t! j. j) X
    public functio_n __construct(){
! z+ K7 J' X* j: {" H        echo __METHOD__,'<br/>';0 f! ]* B% y" a: s" L; f, P: f
    }
, b; I8 L  {0 u% k. ]- |}
0 T; m: E- G( s6 n1 U
" g, B9 T3 ]2 X1 {0 D第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
" n# n8 a+ A# L9 I6 q+ I( l----------------------------------------------------------------------------
5 D1 g& G2 y1 a  {6 I+ c04inc.php
4 [" c, e: |0 a6 p0 t% E<php
4 l# \. d3 S+ r* H) o5 \4 @7 X0 \( A; r: k, M& X* k6 u# P- E# |
namespoc_e Core;6 U( c1 R9 ]* B' e$ l
include '05ou.php';
3 T5 _+ V' n. Ofunctio_n showinfo(){
' L/ D6 A8 I8 Y, q) [    echo __METHOD__,'<br/>';
4 w+ V& n; O! ^) n& J9 I}
* E6 [7 Q- Q9 o# q
& l, t* H3 G: F7 c6 dnew \Controller\AdminController;
& T* B4 W9 E- p: \8 V----------------------------------------------------------------------------
5 {0 x* _2 E0 ]1 t* Y. F, B2 d, t05ou.php
" {4 R9 ]+ ^. J* o<php, U* b$ k% Z+ @2 B
namespoc_e Controller;; P6 a* Z5 O! }5 |0 G& Y
7 Y/ W4 a4 K" D; J( G4 {% \6 A; R
clas_s AdminController{4 u; O) n9 {: y, ^
        public functio_n __construct(){# l3 H' C  N; T8 A$ i
                echo __METHOD__,'<br/>';+ C- G! t" \: t* ]
    }
: ?% U  B" o7 \4 I}
' V; V( S1 i9 A6 G5 M----------------------------------------------------------------------------) T8 P! M5 n" r" \6 ?

% ]& R! u; V) Q; A9 c, A4.引入空间成员:* a% d9 p. y& [. P% S; B5 u
5 m$ p# x( ^8 R4 M1 q* K
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。4 h7 @! ]9 U2 q# M% F

& U, h7 v* s6 q% n* Y----------------------------------------------------------------------------9 W# ~4 I" P  C! }
. y: p6 M: _- T* G' v
04inc.php4 C: J) V$ H5 C& _8 Z/ E
<php
$ I& i4 U3 o/ M. }: @. ]) i$ H' znamespoc_e Core;
5 D, o; Z9 e4 E3 M* U- ause Admin\Controller as con;
: x0 J) ^" D2 P- }% i8 M2 U+ R. j  C
include '05ou.php';
/ B% G9 h9 w/ M8 u3 ]' N* {! x
: L( D- g8 S! L7 \7 J0 hnew con\AdminController();
' F. C' J: Q/ g  {----------------------------------------------------------------------------
6 C& F' a, Z* ]/ Y% I  \7 |2 P8 b05ou.php! K: ~, ^, q4 B
<php: Y5 R" [1 c! X4 c6 g! m8 x
namespoc_e Admin\Controller;
# P/ }0 Z9 O# u& h  |9 K& {- y! x8 {* e) V
clas_s AdminController{
! [" X) T6 W! v" Y    public functio_n __construct(){
! ~" \( R$ A$ H4 \8 E        echo __METHOD__,'<br/>';
7 {* L# C, B( b& h* R    }# d/ r1 q+ o- `! D$ L3 Y
}& ^2 \* _- w( h
----------------------------------------------------------------------------# a4 ^2 a8 _+ {" K
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
; W' ~9 k, U4 p5 v+ L4 w6 P8 r1 j+ x: M1 I3 a. q
----------------------------------------------------------------------------+ K7 w$ A: F4 R9 ]) G' A7 ^! b) f

6 @4 c6 m1 `# v8 y8 ]04inc.php9 i' [2 v# a1 G+ k. S: L
<php
0 L  X) Z1 b" e; {//引入空间成员类
% c4 u' V5 X  s% Q( {- }' y
$ B2 R) ~- ^; z! d+ Q; T  ynamespoc_e Core;$ V3 T! I7 i$ S. ?8 U, h
use Admin\Controller\AdminController;
) v4 F3 D  J1 ^include '05ou.php';9 s% I6 T0 t; I: j

2 P0 ?: |$ g$ ]5 Tnew AdminController();& c% m' o9 J" N$ i
----------------------------------------------------------------------------
. u0 Q/ M2 D9 m$ G! P0 I05ou.php. Y7 `! H! f8 G) `% v3 r
<php
! P% K8 W4 D4 c) J/ Dnamespoc_e Admin\Controller;  S- k% |' D/ d6 a9 O$ v2 i
7 V+ }6 y; |+ r% t# J! |) e! l
clas_s AdminController{
5 [0 y0 x4 y' h7 S6 ]- Y    public functio_n __construct(){) u9 ]* T) N! }5 P4 q
        echo __METHOD__,'<br/>';/ Q( [) K4 J5 T6 _
    }
3 u% \: [- `3 y, w1 u}
& u) L7 d  o" e5 Y----------------------------------------------------------------------------
/ y, j4 g& G$ q2 _( T( [1 D% X5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: K, U. x+ e( R, Q6 Q3 @
  `" d' I9 Z* ^( s9 U# T# f5 p. Y! `- B2 W2 Y  n4 `
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
; h' \. v5 i9 Y4 C% p' r8 T8 g9 X$ M& G. Z, V
3 z! O. }$ y6 `
8 [( [/ @; X& U" L0 G

9 `6 a7 ^) Z% c! ?7 v4 e% e, X2 L

1 x5 ~) O, }6 e# P/ c: ^& t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 13:08 , Processed in 0.066547 second(s), 22 queries .

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