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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9712|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:# e7 ?+ i: A7 V

  \3 v, T9 H! Y% c8 C在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
4 L8 u& u9 W& O9 \
2 M' v2 r. {+ ~  G 20181201105307520[3].png ! Y0 e+ P8 c- T, o, j

) y1 z8 ?* j% p1 M我们来详细的讲解一下PHP中的命名空间:
& n( c- [! O  `+ \$ H% U
8 Q; D9 F: L! a; D& m# n8 K9 Q语法:namespac_e 空间名\空间名;0 H& V9 U. k; ?+ x
; N+ p7 Y6 |* o& ~' l- O
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
: i$ Q# C4 B  g' B$ o5 u" r- b; b6 U, i9 n; `; s' c) U
----------------------------------------------------------------------------: g# d7 V6 b+ d! c$ U" @, D
/ d1 e. @6 d2 N0 C" z" ~. U
<php
+ z% b& n! J) h8 `# r, S, F8 c9 e3 C; b9 I) j$ S! i
namespoc_e AA;
! D# P3 t, _% X8 K  M3 y& M. bfunctio_n showInfo(){
7 s# o( u( C' B1 O; |9 U    echo __METHOD__,'<br/>';: i4 o0 m" Z1 N' a: f/ n: H
}
4 J) s1 i# g# v& K* v6 Fshowinfo();8 D" K& C0 y  H9 h
$ ?- p  m8 {: [9 k0 O) }
namespoc_e AA\BB;
5 z- O7 ^% T! I" Y/ T2 k4 o" i3 j( t4 k- L8 U- s
functio_n showInfo(){
' R1 C2 ^/ U; @( J; Y    echo __METHOD__,'<br/>';) e" i. H- s' d3 ~2 R9 g  H9 n
}
- h8 ^1 H8 V4 H9 x7 D, W//showInfo();
! n8 L$ p! W: y' r, U% K. T----------------------------------------------------------------------------' D( k) j: J3 d/ B+ u2 G+ C
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)6 l% q) j+ k8 k+ n
. c( ^. D2 W, X2 c
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
  Y. M' H1 p! A2 ?8 g7 ?+ B- O6 h
----------------------------------------------------------------------------
, b! w- l! y- w9 K" J6 X/ c4 o* Z, I8 i
<php
$ o% ^8 p# b' F$ s# f" Znamespoc_e AA\BB;
- X  @2 A" \8 i9 E1 J+ H2 Y- Xfunctio_n showInfo(){* q  [) P+ D/ @, S
    echo __METHOD__,'<br/>';4 S' J! U9 x* H' J3 q9 Y0 E
}
  ]+ t+ J* x9 A! mnamespoc_e CC;
9 @% G# w8 ?. n7 c! l6 ~9 Gfunctio_n showInfo(){
7 `% E5 O' C2 t0 S    echo __METHOD__,'<br/>';2 n* I" C3 f# |* x/ A5 U9 w  d3 y* H
}+ n6 x/ g" \4 L' r
namespoc_e AA;
* U& r" K8 r9 x0 }) pfunctio_n showInfo(){" A$ n! q1 E% P0 G$ G' ^9 W8 W
    echo __METHOD__,'<br/>';4 t) x' v( Q9 t; Q
}
) _& j1 Q. D6 n4 g2 l/ }! V//非限定访问:用于访问当前空间中的成员
" F* g, w2 Q. }: Y: Q- G! x  |) z2 g# xshowInfo();
: g- h. I) r% g. d+ @+ M1 k1 V//限定访问:只能访问当前所在的空间的子空间中的成员
- t3 Z+ n  a' f3 e/ h2 c. _BB\showInfo();. b) h; \$ V* D0 a
//完全限定:可以访问其它所有的空间的成员. E9 {" F& D6 R5 u
\CC\showInfo();
. v2 U; N& i3 `8 W: Q↑根空间标识符
+ X" t7 k6 I# k( \  k$ e+ `----------------------------------------------------------------------------. C4 G6 _5 x+ }0 p, _' x$ j. m. j
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
9 s3 l4 {; u) i* ~: R/ J2 R) o0 c
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)' Q5 l0 i/ p! `9 a, u8 O+ t

* _; Q* a! S) [/ y代码示例如下:
! \4 c* W4 W/ p. d: K8 w, w5 T3 n! A, \) {: J8 K6 ~" O3 S9 G, i
----------------------------------------------------------------------------  x& V: z5 O* C) M8 |+ Q
0 ?- }6 @" g. e3 x  R& x; h
* Z5 R1 X# d4 @# y
04inc.php
* Q  w' U# n; B<php
  c$ K' y8 f3 q7 H1 j
( Q$ [# o; h/ f0 m  E1 [" Z& Cnamespoc_e Core;
: p7 J! m. o- [: L+ @/ dinclude '05ou.php';* f  h- E* ^+ W* b  Y+ D
new \AdminController();
% T  U( {' g% f" ]* L* Z* [/ s0 EshowInfo();" @( O1 _5 A: y+ o% x' q

: ~5 S& ?1 A# ~$ C$ o7 W* M8 Necho P;
/ ]4 y; d+ b0 \3 Z3 S5 i/ Y//根空间中的成员,只要类的访问必须加‘/’7 I9 I* ~3 R$ ^9 [+ k8 N6 _% t
----------------------------------------------------------------------------- J% j: u. G& W( R; G

2 v, ~5 }6 U) [5 h6 G: n: p05ou.php
) G0 M% S. h7 E5 c<php% l# d! J$ Z  N- e  Z; B3 J9 U9 ]
const P=5;2 Q( Z8 {8 F2 R$ `
% _. _# i6 C% W" k! S  s% P
functio_n showinfo(){( e( f& F) I) }
    echo __METHOD__,'<br/>';
$ O; r1 t* v1 o2 U; K}2 Y* b* G$ }( M( I  i3 O9 Q4 n8 ?
0 ~  Z; N% ~0 x: [$ A. ^
clas_s AdminController{
( Y/ C/ ^4 _5 D3 j" V4 q    public functio_n __construct(){
9 A) w( w% D- H/ J        echo __METHOD__,'<br/>';! b1 ]- }: ^4 `! D/ L1 j0 P
    }
- t1 o3 x" y7 J' e% d}
2 d. S$ O6 @& t5 u2 `
0 ^& t( \' q$ p2 L: V3 \第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。. T8 i! q+ f6 V  p( @! V6 D
----------------------------------------------------------------------------
5 @9 t+ B# V0 C04inc.php
5 N. [9 {$ s' ?( p<php
& g4 i; O2 j* o: e' [9 R5 }: ^. G- k# U8 U6 p
namespoc_e Core;
" e' |! Y9 {' Z* Tinclude '05ou.php';( V! C- A2 t1 Y: k6 }9 l
functio_n showinfo(){+ }# s$ w# y1 C' E! u) h! T
    echo __METHOD__,'<br/>';
. H" A) ?; c& p) r2 M# h% D}1 }1 K3 C* i, Q3 Y0 v

  W# Q( R; \- f3 M$ C8 O6 `: gnew \Controller\AdminController;
5 l. j& r/ p3 Y8 q! z0 o3 [; r----------------------------------------------------------------------------
* n$ v; O7 ]" m5 a2 F4 n+ _4 v05ou.php; f  Q& `8 T  `0 @: p
<php6 Z3 v0 R# w% M$ K: f; p) O* p
namespoc_e Controller;6 m3 m6 L! N( j$ I6 b4 j0 Q: h. `

, Y) i/ [" p, R) S) h" h2 uclas_s AdminController{
4 P2 X. F6 k$ Z- O3 Q4 S        public functio_n __construct(){4 h! a0 B" {( ?5 ?2 Q
                echo __METHOD__,'<br/>';; T+ _; L; }' r1 s7 |
    }
+ A1 U5 `# y2 \, O$ f6 T}
- x" N! i: y/ P# v( M5 Y) E! a6 |6 I----------------------------------------------------------------------------' y6 V* N% a3 @# y( O  C) j

0 j  P' K3 X! H4.引入空间成员:; _3 s, ^1 `, i

; E9 j, A. j; d6 h' O+ L1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
6 R. D' g7 \9 M; e* J9 s: i
4 g8 e1 B7 ~. l% ?3 f% s/ G----------------------------------------------------------------------------
6 P; g9 o: j4 D" w, X/ K# P/ n% L/ m/ `3 n5 V0 E8 s( U
04inc.php
" o" d! A1 D2 b8 d; W& ]<php
' V3 d* R1 C- Lnamespoc_e Core;& T$ b) _6 W, M  ]
use Admin\Controller as con;
& r  f# B7 L6 n' k/ ]2 H% g, z/ S
0 t) {" p" T: Y  }$ Dinclude '05ou.php';# a/ F) z7 B2 }9 v2 @! U
6 ~6 l. k8 G$ `- s  B  x3 r* B6 T# ?9 d
new con\AdminController();
+ L/ ~" e9 C( ]% L3 q+ t. r7 h----------------------------------------------------------------------------
6 Y4 s/ g# C4 P2 n* j9 j05ou.php
$ P7 E7 h3 L% s5 d<php
/ r# a) G+ q, Wnamespoc_e Admin\Controller;$ g6 f9 E8 H0 W( Z, }" t) ]

2 i7 o7 c* Q7 Y- V0 g# Kclas_s AdminController{
) o3 k6 a: H$ k( z    public functio_n __construct(){
) v4 s# o4 [" q4 z        echo __METHOD__,'<br/>';
% E& a; N0 ^& s) h0 A) Q2 v4 Y    }) R! u. M) x6 f6 ~% G2 p: e
}, m" G/ D9 h2 @
----------------------------------------------------------------------------2 d8 r0 [3 |8 A* y) v+ G
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
( z1 M; q7 r0 a+ F5 S; i. H) W7 ?
5 E4 ^' u1 h  V3 _) F; }  A----------------------------------------------------------------------------
$ P2 r! u8 i+ ^, D' p1 B
& x" {/ t) R) U3 _( D04inc.php9 N& ]5 \3 g) k# ^3 O: I
<php
/ X- k2 q, _* ^7 f//引入空间成员类+ F# u2 `; R7 \& L

5 A) l& z7 |* i7 @: c8 z* q; Inamespoc_e Core;# ~1 N  k: j5 l
use Admin\Controller\AdminController;
. z+ U- n7 ^5 N# V$ cinclude '05ou.php';5 G, ^, C( H3 W$ m1 L$ s
8 c" p6 F8 k3 q& u0 i$ ?' }2 Y
new AdminController();: v+ n3 t! [, g# \1 B" V
----------------------------------------------------------------------------4 L5 ^7 n! X. t/ y: u7 f9 @
05ou.php
2 T& _# B+ v8 g<php- C6 }6 m- \( ?6 z2 {  C
namespoc_e Admin\Controller;9 J* K' q" z( Z# N7 U- ^
' B4 Q& Z4 c; A# E
clas_s AdminController{; U$ d$ x' l5 k% I3 n8 k/ x
    public functio_n __construct(){1 ]+ F0 }; V6 {
        echo __METHOD__,'<br/>';' f' x, V2 T! b! m( I8 N, f
    }
; Z: a% M7 y! T: `+ p; |}
2 j* d* F# g9 e6 F; [# j+ v----------------------------------------------------------------------------9 ~& ~/ B/ j% ~4 F- Y7 r
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。( Z  A& ]( J, Q! b
4 v) m0 e+ N) i* i

  S6 R1 N) k$ Z; B% Z# A2 |: M这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
+ z+ }" ?! C0 c6 d% w; [( g+ U5 Z+ M& A8 T% k) s- Y9 ^
- w; ^" W" m8 r( i- J
, t( P$ ?' l7 V

! D3 ~$ Q; C1 Q  x8 a' s' s4 G5 i* L6 i
3 ^, n6 Z/ L5 \6 z
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-3-29 12:57 , Processed in 0.147170 second(s), 25 queries .

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