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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16950|回复: 0

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

[复制链接]
发表于 2020-7-1 23:13:25 | 显示全部楼层 |阅读模式
1.命名空间的作用:
4 D# T$ o" _% E. a3 c, y, G, I
2 i" b0 P8 y. T( ^6 o7 y在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:8 c2 U) p+ ^/ h+ x7 r
5 Z% p) C3 e' }
20181201105307520[3].png
% n9 n2 E3 V% c: Z
8 K% K% s# ^' n7 y& r1 p我们来详细的讲解一下PHP中的命名空间:
9 z* Q6 m; u8 |) x9 ]: l1 W
3 z1 ^7 I& t) h. N. v) }语法:namespac_e 空间名\空间名;3 N+ h) D7 T# Y0 ?/ W

  V% |' X: x& s: ^1 P1 k说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
0 V, z; }5 J3 H1 V* p- R8 j$ U0 o: |; c! j: N+ F5 q! M
----------------------------------------------------------------------------) ^1 S1 W4 T0 Q  X# H
: d: b; c( Q, X. ?* b$ F
<php
! {+ G& l6 p- @- Z  k8 s2 A) u% B2 l- j+ ]9 v% e
namespoc_e AA;( `2 Z6 y: H9 i' ~) ^3 ^+ l
functio_n showInfo(){
: M0 V2 {, M+ w+ ]    echo __METHOD__,'<br/>';
$ U* m6 _0 C5 B}
2 d5 O) s) D2 i/ U( B: A- Z% sshowinfo();
9 ^4 p" J9 N1 a0 y/ w! Q9 j- y3 l5 l) V; k, L
namespoc_e AA\BB;/ A3 l& D" C) t7 C

6 o: `) K  P% v: t2 O  O, Lfunctio_n showInfo(){1 P2 W* S/ K6 ^) z: H2 `
    echo __METHOD__,'<br/>';# Z+ N4 f6 V* h3 _; X
}
$ v+ j/ i! i; X( _//showInfo();# h+ ]0 M+ [- o! D+ W
----------------------------------------------------------------------------) V; H6 Z( U1 i, `$ k$ V0 O2 N
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' u/ K0 @% M$ Q% {2 Z: A" A
+ I" r2 h: d/ v7 \' C) l+ a
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
6 X8 W* q4 m  U8 c' E5 z
" `% S) ~, v. B8 z; P----------------------------------------------------------------------------# ~) l* V# r- t4 M4 p# `

) M. L/ a* G% w6 W4 k- B<php
: [" A* V3 {  `# u0 Wnamespoc_e AA\BB;8 }- y% `0 Z7 {& v' s5 H
functio_n showInfo(){) D; g1 l6 Z* G, g
    echo __METHOD__,'<br/>';
- \9 |& l. Y; D. T}
# A3 w; f! p& }4 V" \5 I( _namespoc_e CC;4 a% [* T+ I  h- U, b/ {5 a4 V6 ?& U$ |
functio_n showInfo(){1 @: t5 y- x* Q; x3 D/ S. {* o; x' _
    echo __METHOD__,'<br/>';, ^: s1 i, o; `% ^
}
7 q0 L. R1 \  f5 Nnamespoc_e AA;+ `/ k# M& e5 |. P& v
functio_n showInfo(){
, C6 G* F: a1 d) P5 F& Y: J    echo __METHOD__,'<br/>';
. F5 [2 o  g6 K# Z# g/ M$ n6 Y}. p+ f- P2 k  c- `* M
//非限定访问:用于访问当前空间中的成员
7 ?+ V# @" U) H- t& V3 E. ?showInfo();. z+ G2 ^# w- w- P* z- @8 Q
//限定访问:只能访问当前所在的空间的子空间中的成员5 B1 Q3 e, x3 \* }3 [: ^0 m4 a
BB\showInfo();' N0 a/ Y3 q) _: R
//完全限定:可以访问其它所有的空间的成员
& d0 |$ c3 f& S6 z. ~  W\CC\showInfo();" q* O7 }, N. t2 L! }% L8 ~
↑根空间标识符
* w  Q3 m' l& q8 R3 [----------------------------------------------------------------------------! g" g& i1 P! d. O# _+ l1 `
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
- ^, K8 {; E- V' X6 V" F: J0 ]7 R5 w2 [0 J* v, t$ C
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)# d) |" M2 ]' Y, j' D! h
8 F5 [$ O9 U2 R/ ^( N6 d
代码示例如下:
6 U0 E4 a6 O$ L1 k) A2 L5 a6 N8 p+ s# f( v+ ~9 |# y8 d2 y
----------------------------------------------------------------------------
- M8 s) p8 k& d6 p; ?: j: R& a( ^8 O0 P/ g
) g, M* ]* h7 ?0 o7 _, p1 _0 U
04inc.php
0 M4 Y# a! L7 Z5 {! F! t<php# r& s" l( T! U

, B& q1 V& w8 lnamespoc_e Core;- C/ n% ?& v3 |" I& N* s
include '05ou.php';
# w! v% T8 |. g3 f* o7 j' Knew \AdminController();2 [. R( C! N, J- l
showInfo();
0 j* b7 X5 E: y' o9 I  Q- w( `( d+ k
echo P;
: O; b  h5 s8 Y4 |//根空间中的成员,只要类的访问必须加‘/’
1 {* m/ m8 J& I: e* |----------------------------------------------------------------------------; C% q6 n7 Q3 k3 N) Q* G  V# l5 n* P

" z7 ?  k( @9 E3 v05ou.php  ~9 }9 q2 v; a# l+ \( Z$ x( E% o
<php
6 I3 v6 P# X- W' @) \' b* oconst P=5;
3 w) U/ d  e2 T5 s; ~, u8 D0 `4 j# C4 {
5 g- `3 \, {8 g% ?  D& y4 i7 Gfunctio_n showinfo(){- p$ V' M+ G# @6 f1 c. Z1 v
    echo __METHOD__,'<br/>';
; @/ F9 ~1 _1 h2 Y}
; s8 Z5 q/ O0 V/ H1 Z; [  C: r9 v( _, b
clas_s AdminController{% Z# ~3 ?6 g- U8 b
    public functio_n __construct(){
# j/ p0 |  Q- W+ c/ K3 v- ^        echo __METHOD__,'<br/>';
  ]% d: z1 _, q3 o! L" ?    }3 |( `) i7 u# b. X# T$ w
}8 N/ S* b2 K- M' h, F. B2 @/ D* [

1 N6 Z8 a9 {/ d2 B1 U第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。, r- k+ {4 C" _$ @
----------------------------------------------------------------------------
" `5 ^# S# [4 o8 \' T2 k04inc.php' ~( {0 i+ l  T
<php" m; w! a+ N2 H0 d: T

: E' }+ S9 L1 K; w1 rnamespoc_e Core;
1 v; T% D& x! c* [include '05ou.php';
7 O8 M6 T0 T) g, [3 B9 u  ffunctio_n showinfo(){
3 i8 `' |% t) U6 x/ s    echo __METHOD__,'<br/>';8 U+ x. X4 |/ J; |
}# s6 |8 B8 u) @7 W# X

% y$ p! o& d3 }! n( T" R  _4 h6 o+ jnew \Controller\AdminController;8 ^/ X' O( W: f/ f
----------------------------------------------------------------------------
, {0 {* D$ Y9 B) i05ou.php
; n2 [$ j$ o) j' k: w7 u<php5 F# A! C1 i0 ?" P' g' l
namespoc_e Controller;
1 H) t( X; g3 T( _* L
* A, I8 J& S- k& @clas_s AdminController{7 ^5 F% q9 Z3 @" D5 @  s9 E
        public functio_n __construct(){. B0 @; _1 d( p2 l
                echo __METHOD__,'<br/>';
1 o5 w0 M. N/ Q    }+ Y0 k& E) M, U* |( j$ Z
}
* {0 r$ X2 I/ W% ?----------------------------------------------------------------------------  ~2 m6 ]% [5 a6 w' L9 K: N2 k0 n
4 I5 O4 B4 I0 ]; Q
4.引入空间成员:
" W# z8 G6 |5 r5 F+ G. P- b% L
: I0 I9 E! @6 _& A8 V" P6 @5 o% s1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。1 ?, }9 e) t. R1 E- V+ E
. m, o0 I1 T. T8 u9 v
----------------------------------------------------------------------------
5 O" k& G# @! E+ {' D7 [+ t
* Z" r1 f' L3 _5 B! Y7 ~; |04inc.php0 }  k3 N6 U& ?% a$ G4 s
<php
& F1 w, }: K' R3 r9 q* S4 r. Knamespoc_e Core;
+ {3 F# n+ C3 ~0 X+ `- `$ z1 E9 v, @- wuse Admin\Controller as con;& d% Z2 m. h; Z" m

5 E6 O: ]# n! a+ [. h( qinclude '05ou.php';
& ?* D! D( ?+ u4 ^1 V# o1 m# x7 d; z6 s/ b* S
new con\AdminController();
) C( A1 K; g/ \6 o6 J. F  F4 |1 m----------------------------------------------------------------------------9 ?) W- r6 k9 k: b
05ou.php3 u1 w3 E1 d; q" T
<php
+ o4 A' K4 P% p5 h  {namespoc_e Admin\Controller;% F$ X$ B) ]' F7 G) C

! \: S4 D; o, [clas_s AdminController{
8 i" R; F5 ], [# P' j" B. \    public functio_n __construct(){0 m; y  W1 T8 |; ?: w- _
        echo __METHOD__,'<br/>';
* K8 x6 K5 b) N    }
6 g9 Z- |( D* B* [3 C  Y}/ l9 n8 V8 S( v. o4 F& u* O
----------------------------------------------------------------------------/ j- n6 ?6 v& H) L; o% V
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
6 L3 }9 z% @' S8 U4 X/ P/ ^! S& Y3 w- [& J' N# J
----------------------------------------------------------------------------8 ~0 f" Z- d( d( Y  \
5 ^3 n4 ~. y1 E. D% A0 J
04inc.php9 h7 D/ ~5 @$ s4 u% |
<php
- {0 }! k- p5 `/ B' e//引入空间成员类
- d( \' ~; n/ T$ U
% _( @% v, y$ i, f% Fnamespoc_e Core;3 v8 E% S+ ^, [/ j
use Admin\Controller\AdminController;
- S  E( a% t8 u" C( ]2 Iinclude '05ou.php';
% U: w: x5 G# q+ c5 W+ D8 d2 l
1 b/ \8 |! R8 a' W1 ^! Nnew AdminController();2 G9 R: t; t# g. e$ Z2 S
----------------------------------------------------------------------------
' e; {* `& N6 W7 B% r  v$ r% Y05ou.php7 l' }, }7 X2 q# N+ ~+ X" S
<php% C. b! x) s3 [& g
namespoc_e Admin\Controller;' n% m( G% z. _4 ?% y

- L6 ?( |5 U9 N3 W: ^  jclas_s AdminController{
8 l& @& S$ i; t4 s1 r    public functio_n __construct(){# U+ t6 R: j" G9 U5 k8 k
        echo __METHOD__,'<br/>';0 X" E9 B  m1 `  u: m
    }
5 F. d' |- q4 {% W}
# ]; }! n! h) Q$ |( _: F----------------------------------------------------------------------------9 d- f" g2 p3 V* [7 h  m- R5 U  t
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。' _" R8 u" P1 W, I
: L% z& u' I( ^; F( d! ~( k/ [
$ i0 R: ?0 ^" {7 ^
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。& A+ e1 B# E& A* g- i

' W' k& b0 V# z' k2 p: g( e- S4 ^1 R" n

/ C% N2 q! u1 \3 T# B  M. e8 v3 }7 \; n5 [8 q* P& g

3 u% n8 `+ G" D& Z& {) I$ O" a- r) ~% t( [8 H3 J* I
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-16 01:13 , Processed in 0.060595 second(s), 25 queries .

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