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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6987|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
0 j) b- w* d2 Z) V# q" N3 G8 q" Z2 a, l! m, e; x
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:0 F; k. _% N) o8 {

4 h" N8 E- u+ [8 o1 f, e- C 20181201105307520[3].png
4 _" K5 u& A3 V) P) Y4 S/ i
" \! ?' g* o2 Z我们来详细的讲解一下PHP中的命名空间:
; ?& l6 e% c( `0 K. W% w
, I4 q; w. g7 m0 @' m语法:namespac_e 空间名\空间名;6 w( ?5 J3 E; Q& B9 Y( i
( K9 ]  h. e( t; d3 y, D6 J' O5 A
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
" p7 c: h$ N/ y4 b  ?- i5 U* l9 T! n7 |
----------------------------------------------------------------------------
2 \. x# K; A/ G( a* {) L( B
( `$ Q- G5 Y/ h% @<php
2 u5 ]4 J& c5 u+ H
# k2 c8 C# `4 B3 E5 fnamespoc_e AA;
' x8 |* [8 v5 ]  g  Ifunctio_n showInfo(){' l$ v% V" h. Z! \5 ]; O9 |
    echo __METHOD__,'<br/>';
1 g8 h+ h0 k' D: l, x}
9 z' c0 z0 O8 M1 k5 Eshowinfo();0 ]. G: g1 f) p; C0 l& j# Y
0 ]6 Z3 j; F: t5 K) m/ k1 M  z" y
namespoc_e AA\BB;
8 m" a. S3 f$ T0 h8 e! t* K: L; p9 g4 C" b, j4 \9 ]
functio_n showInfo(){. T' T7 a5 P% a! E" I
    echo __METHOD__,'<br/>';
! c6 H% @$ v/ _5 H# j}+ j3 G: B0 ?% A& y6 w
//showInfo();
* f! E( H5 J5 f: A----------------------------------------------------------------------------
( x7 O2 z+ F: b# T3 r) u2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)" f, i6 r' {  b$ `: V

7 X+ K* x( d; [4 [/ {8 e3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。/ u, x  s! s  _/ t) w' K; m8 H
& L9 ~0 ?9 Y. D7 H: ?# e2 @4 v
----------------------------------------------------------------------------
1 x' c& U- `+ [+ |3 Q! U2 L- J5 b0 }5 @/ p5 Z9 d& r2 f( d
<php
4 s; p. X) S$ \3 w9 {namespoc_e AA\BB;' U3 x0 U9 R: b8 @
functio_n showInfo(){3 j! j! E  v7 ^" B! W
    echo __METHOD__,'<br/>';
) H( x7 w- o3 l0 }3 h}+ n* H; m/ `0 @; E2 k
namespoc_e CC;- q0 w6 x9 |& b9 t. G
functio_n showInfo(){
) w0 J  _. T4 B4 {% _    echo __METHOD__,'<br/>';3 b9 [3 G9 T: Z" ~3 x0 Q+ }5 j
}
  E8 e5 n$ N: \- z2 lnamespoc_e AA;
- t9 I; }" ~, c7 t$ ^! C+ }functio_n showInfo(){
2 u) z( t9 J: R. r* N, r5 }    echo __METHOD__,'<br/>';
3 f: m% g# M# v5 f5 G! I0 X}
8 x) ~# S5 B2 D+ `//非限定访问:用于访问当前空间中的成员4 i# S7 h$ p8 @8 _0 b
showInfo();: z: ~# i1 e2 f9 ^
//限定访问:只能访问当前所在的空间的子空间中的成员$ J( ^/ M% c% I* H9 V
BB\showInfo();
0 q, Y7 l1 I$ ]" o' k: X; C//完全限定:可以访问其它所有的空间的成员7 d. b4 b% S) J1 ?
\CC\showInfo();
1 ^; m5 W  T6 O& @5 G& d↑根空间标识符
. K" O0 Y1 G# g* ~3 m9 v8 M+ ~----------------------------------------------------------------------------
. w! m9 T9 e0 t1 G* O6 x" f8 n但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
2 `/ K$ t2 G  K! E  X8 T) S% `& s
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 F8 E6 v$ j$ E/ o' g) ]) C, N& N1 I8 ~& y$ o  H. @6 e
代码示例如下:
4 x6 m+ U0 m2 U% N+ u- {6 g4 y5 ~6 K
5 p& ^3 ~. r, w7 m----------------------------------------------------------------------------
8 j' U& Q2 ]; W& u6 z' i
  Z0 w+ f" E# W4 E' O$ d7 `; _7 a+ U9 b5 b4 |
04inc.php
9 ~: U+ \. n9 B5 _- o7 _# x# j& C<php: O+ I0 S( M* U6 Z# x% C6 m

. M8 q: G3 {7 o( J# F" Qnamespoc_e Core;* L+ Y2 v6 ]  F* l
include '05ou.php';/ T# u! l9 U# J1 @2 R1 v+ z: a
new \AdminController();& {* z& B# ?5 z3 ^$ g: ~2 `6 S: ?
showInfo();
9 p0 a1 l( v- `" A9 v9 }( e
2 C% B7 _* N4 k% u) lecho P;3 o% |& f, s. D- @* O  @' R# I( F
//根空间中的成员,只要类的访问必须加‘/’
  }2 Y" I/ O; l- M----------------------------------------------------------------------------! S1 R: G* l  P# n

- n: d- U4 Y5 ^8 m( u9 r05ou.php# u! Y; U* |, @& }0 s$ u4 h
<php8 r5 o# L$ Q' G* d5 a; L- D1 ]
const P=5;
+ ^. x- D( n' p. X% h% ]/ P$ O8 C* S! `" ~5 p+ }- u2 Q7 ~* c
functio_n showinfo(){
. t8 _: ?) y0 I# K8 G8 h3 I    echo __METHOD__,'<br/>';
$ v4 ^  q7 Z; y& b( H}( F. [( d; c! ]* d
- n* l/ N/ v- F9 _) `- Z
clas_s AdminController{) i5 Q# J5 Y6 h
    public functio_n __construct(){
( D) u! Q1 N7 H- X! _        echo __METHOD__,'<br/>';* k# ~6 q  B- p
    }
, y0 O7 M* b9 P& Y5 c+ a}+ ^) b. n4 M% f# t7 k/ P0 v4 {  i

2 r2 |' t( X' J" u: J8 ^第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。' s; K  U5 s+ }8 I2 m2 d: _
----------------------------------------------------------------------------
. h/ d3 F2 K- C# k04inc.php8 D0 W( m+ m7 V3 T9 F( O( g
<php
/ f/ M% H' b6 u0 a) X* T' p# ^9 E" A
namespoc_e Core;- b9 N8 d1 i& x# Y
include '05ou.php';( ~2 _. M) ~- e- j
functio_n showinfo(){
9 O! X* v" `4 a    echo __METHOD__,'<br/>';
8 a1 P# K( \$ q}
6 B) Q& s' |4 \' {' f7 v& v; `. S" W/ n
new \Controller\AdminController;
2 Z7 n6 p; l, I9 w$ o4 i. \" O* L9 P; n----------------------------------------------------------------------------
4 @, a1 d# [% [8 v$ M0 M05ou.php1 J8 y' X/ _0 j& u
<php$ A5 Q0 Z9 \* C: [: E" V( E
namespoc_e Controller;4 W; f% E* ]! b5 K/ H4 S) ]
# K( a6 v" l( M& x
clas_s AdminController{
6 j; d7 ]8 g; J% h$ M        public functio_n __construct(){
& o, C0 N* Y6 {- U                echo __METHOD__,'<br/>';
/ n( G4 u( O9 `8 u    }
" }  N7 z/ b: ~, V. I6 o}% _6 M1 B; y2 Q* @/ J, v
----------------------------------------------------------------------------
: b3 o0 J4 H8 i% U$ I0 o: ]3 y, G6 |9 G. n) S
4.引入空间成员:' j9 F. Y1 T9 _! T0 R5 q- [

2 {. e! W8 T) F# i5 k' `1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。( k7 o  z4 P9 u: j- R( W! Z9 W

1 X; D' n9 I1 B$ ~/ U----------------------------------------------------------------------------5 e9 B; w" O3 F% [
9 E& q/ c- d$ J2 n  }' A4 k- A  c
04inc.php
6 F% F0 H$ Z4 x1 q- |* \3 Q<php+ F; Q( Z/ ^" S# ~, J& W0 B
namespoc_e Core;. i3 _+ Z; \9 i+ D6 N$ c
use Admin\Controller as con;
. W/ Z0 Y8 D8 K# g$ {8 v% A5 B7 A1 j$ C3 w, L
include '05ou.php';: v1 }" x1 s8 Q

5 S4 I, A  U* s" M- F3 Q3 _( Inew con\AdminController();& f6 ~# S) Q1 b; J4 a
----------------------------------------------------------------------------
# z3 E' G0 v# D0 x: M/ `# N6 T05ou.php/ \% G9 M. a! p' s' U
<php
7 R  V9 s* G7 E( Rnamespoc_e Admin\Controller;$ d" j  l" B6 Y1 k) {9 \( F, v
# u+ |: b' S7 e* ~
clas_s AdminController{7 Q9 N9 g7 z+ n3 S6 J7 L2 c6 a" \
    public functio_n __construct(){) W( `+ c& T4 n2 S$ y3 A
        echo __METHOD__,'<br/>';
% o4 ^- e4 {' o1 B& i. v    }, f% I+ s, Y/ T" p1 B5 Z. j
}+ R4 v+ t" k1 i
----------------------------------------------------------------------------1 \4 Q% `% V# Q
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。* ]6 ?. D+ Q! @& ?( O; e
2 c$ w; N. G2 m. A2 k
----------------------------------------------------------------------------
7 W& ?5 ~, o6 K' w/ w& y, ?3 A
! L: ~* S1 H7 I8 R1 y04inc.php; l  Y' |) R3 r' @% C$ c+ {
<php
  B" R8 }1 @" ^' |& Z//引入空间成员类
' E( Z3 W4 U& D/ c, Z) W
* O6 y+ A9 e2 W) g, {1 xnamespoc_e Core;: y- Z& U4 v7 f4 q0 }8 H
use Admin\Controller\AdminController;
' R& y1 X. X0 X' J0 minclude '05ou.php';: X# L% i7 x3 Z5 p8 p

, x% d, x/ I9 @( ~: enew AdminController();2 ]& ]6 N" p) V; [& s+ X4 K
----------------------------------------------------------------------------
& M+ R8 Z4 f6 G5 ?, W05ou.php
& Q3 S$ P! ~1 M<php
0 T5 e4 B; N6 Inamespoc_e Admin\Controller;* E3 m  G$ v: y  }+ o" Z2 f
* X7 R/ ?$ S  h
clas_s AdminController{4 M  C) M% ?& g3 N
    public functio_n __construct(){& p: u; e# j* H" u! Y5 r
        echo __METHOD__,'<br/>';: a3 F" _  }$ W
    }
6 x: B8 Y& [( c# f}
" o$ B% a. v$ q0 ]----------------------------------------------------------------------------
6 D4 P$ d3 k+ X5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。; |  d2 d/ O2 \& s9 D9 F7 b

# F. S/ d9 W$ c9 J: D/ E& G
+ f, V- u! v; B$ o. J) m这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。! v+ j( s+ H1 m+ ^- c9 E5 `1 Z
. r4 L3 P; O$ h) G( U8 M
% L- I  a) k& B& I: Z, Q
8 D7 T4 \  J9 b% C+ Y+ [; p
- \7 G8 [8 l- I, M8 V9 y# ?6 @
! K  g9 C1 O$ B1 r* w6 h
6 b, f! G, q6 A
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2023-2-1 17:38 , Processed in 0.162327 second(s), 25 queries .

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