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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
. R; k7 n/ G  h
' \# g3 |: z. B; ]% _# I7 U. f" x在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:* ~5 N( J3 }6 Q" G8 l

4 y( G% h8 ?' i3 F( ~ 8 j: Y( N& ?' L- k& h3 @* r4 ]

/ g  Z. _1 @+ f* m我们来详细的讲解一下PHP中的命名空间:2 ^! _) H  V2 j% w
/ O; x6 V( c* u% [
语法:namespac_e 空间名\空间名;/ B- @& w( Q4 U. U/ W2 w

, ?, l9 m7 j! l$ n- N4 q# R. p说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
3 n8 z$ e8 o4 K- t  J- Z
. m6 X/ ?- O" t----------------------------------------------------------------------------7 z+ P2 u( R! m5 ?) {& d8 N& Y

" E  I) ^* G; D" t) H<php
6 D8 t7 p6 v! ]5 r2 Z- p/ q% V# w  }8 W
namespoc_e AA;5 f! ], Q& t- w2 R: j9 F
functio_n showInfo(){/ z! w6 ]& [- }. [
    echo __METHOD__,'<br/>';! j6 j3 C( F4 U- j" _# ?
}
# x' j8 A8 y) ~7 ]showinfo();5 B: z0 t2 j; }
- j' z  Z. R* [$ i' D0 v0 O
namespoc_e AA\BB;4 m7 v2 A5 T! t
0 Q* U, S. b8 ?: F& J/ Z
functio_n showInfo(){8 x% w7 s$ K, X- h5 q1 _! R
    echo __METHOD__,'<br/>';8 H+ s& a; C. v1 v0 G' J( O
}
/ r  I' {9 T: E% R- p7 t" B//showInfo();2 \& q" R* Q$ o  x2 s! I+ a
----------------------------------------------------------------------------
5 U* }  m5 n2 V8 y! a/ A( m" d2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)! \* y& g& d, _+ y

( f+ X& E7 y$ y  o1 Y3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& I2 k, x% y. {+ q* d9 Z% L, d( u" v+ `+ Z) ^
----------------------------------------------------------------------------' M/ ~5 ^/ c" I* d' q' p
/ o! O4 A/ e9 P! z) ^" ?
<php% }) R0 \$ t1 @( ?8 ~
namespoc_e AA\BB;
0 e, S  x% a: [* q1 ^5 ofunctio_n showInfo(){% H6 j8 H- R/ j+ F+ x* E
    echo __METHOD__,'<br/>';  G$ @2 B6 a% ^2 H: @& I
}
) T, S8 ^  k/ bnamespoc_e CC;' Z) k( Y- Z! D+ o6 a; ^
functio_n showInfo(){
# o0 k& [, |- `' ~0 S% K. G    echo __METHOD__,'<br/>';
- U+ `8 y) z; J9 e# R}
! m6 o  [) g) b: n) Knamespoc_e AA;
: f" x9 J6 L# f; b2 s, S# n" {functio_n showInfo(){2 U3 |! P6 ^# Z( z+ b
    echo __METHOD__,'<br/>';
; d& [: d6 q5 _. o}
2 [% F' M9 Q( R: b//非限定访问:用于访问当前空间中的成员
) w- `1 q9 S' Z5 f7 HshowInfo();  |! U! p7 P5 a$ z8 Z
//限定访问:只能访问当前所在的空间的子空间中的成员
4 G: [/ ~. z8 f. F) f$ {BB\showInfo();
, V/ ~4 L! @) f. f. H//完全限定:可以访问其它所有的空间的成员
7 j! G7 ~+ Z) g, e) Y\CC\showInfo();
7 z$ D; N2 f" M5 F8 X" x4 W↑根空间标识符; d" _3 C- v4 i0 z
----------------------------------------------------------------------------' h- b# _9 @8 ?* y5 K. G' ?, M7 m
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
  p! l- T+ r+ a2 ^! a/ B" H5 ^: V/ k0 C7 F% ^& i1 F
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
4 _% U6 I0 b. |: O' N( a
3 ~( j- j) }1 _4 T代码示例如下:2 R! v( [- m) S6 S
! T. M! i" c" m3 G( H9 ~& c9 |
----------------------------------------------------------------------------
' ~% D# \' d& Q2 y3 d) }7 W; L8 a3 c
! \# e$ v+ p6 u% n3 \. T5 P/ F9 ~
04inc.php
* [$ w  I: [% R& \8 @5 @<php* z2 M4 N' N$ e( T- A

5 W) p4 P# ^  G' k* j" w+ z0 x5 @namespoc_e Core;
3 ]& z, s0 X. |& f- c7 {include '05ou.php';
9 C& f. }/ o+ h! t8 c5 U4 inew \AdminController();
0 \" M8 H! K" v; x5 S; Y( l. g' q: ~, CshowInfo();
7 O$ x/ }5 O( o* W
. O4 K4 Y8 r$ T2 S7 hecho P;
, M7 L0 E6 T1 O0 T) Y//根空间中的成员,只要类的访问必须加‘/’" m9 K4 `, d* i- z- p2 K9 x
----------------------------------------------------------------------------
2 g" X  ~  o' D, H. M5 A1 q8 \5 A" H8 m# U/ B
05ou.php2 U; t6 f2 U$ V( M( C
<php
+ d  R) L( h0 t+ o. oconst P=5;  ~8 B7 g0 T0 T3 b3 W% y  z4 x

7 u  p+ _, E. ufunctio_n showinfo(){7 S1 O: w3 v, W! q  B0 {6 t
    echo __METHOD__,'<br/>';7 `" F9 n  p# l/ V" G( V7 ~- o
}0 F  L8 D! o' u" m# ?% k

' O$ q8 f5 t2 H. A0 k% [" Dclas_s AdminController{
% c* ]/ o0 a2 g2 `0 M+ u/ m    public functio_n __construct(){! v8 w$ M2 `$ u' i+ q) Z# c# D7 d
        echo __METHOD__,'<br/>';
& z3 c* L, H  w* [' l+ i    }
3 w+ X. l, p& w+ D3 M) S7 u}
' `+ D/ X$ |% w# t: C2 H3 g3 k9 A& g1 ^. t" u
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。& w. g! }% `$ A5 N5 G+ F
----------------------------------------------------------------------------- G9 P& e  `: L; Y
04inc.php/ i) b0 c5 D9 h* m3 e; n
<php
& B4 R% I, S. b- U9 @) ]; K' ^
0 x1 f1 z) Z2 s0 [3 _2 {namespoc_e Core;
& @+ |, j7 n5 k  Zinclude '05ou.php';
# |, q' K1 B( s7 nfunctio_n showinfo(){( B, U( M/ A, C
    echo __METHOD__,'<br/>';8 P% e% ?) S$ E( B( j
}
* a- t' a5 f: s) M# l3 r; ?$ ?+ B9 T* h' E; D* r
new \Controller\AdminController;3 M/ ?8 ]) E5 o5 [; J* _9 B0 _
----------------------------------------------------------------------------
; V4 C# |# H* E/ p" v5 t05ou.php
8 ?( w& K0 F5 w" {# n* Q6 T<php
" s5 n4 ^" ?; K/ P+ Anamespoc_e Controller;
+ P4 ^  S3 J$ s5 P2 c+ N
% r6 z/ A% F" M. S  Hclas_s AdminController{
3 n5 i, {/ x. [. i        public functio_n __construct(){
$ W" _- T8 h+ C. k/ T! {2 \' u                echo __METHOD__,'<br/>';, ]$ Y9 L% B0 r+ y6 X# w
    }
# p! O  @: O8 [% V' T6 l# j1 w}
$ J" w" {/ U1 ^: X1 G----------------------------------------------------------------------------
- T0 D" U8 v+ U2 C
6 m8 T' M6 h9 d% S4.引入空间成员:
$ r( i! G, T3 s/ H6 C, v; q1 Z  }, Q. q/ E
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
" x3 e$ H+ m/ G" O( P
) g! g/ k" {' r; Q1 `----------------------------------------------------------------------------. e3 E/ @2 f- Q6 o9 r3 ~

: X/ y* Z1 Z- I* }6 k04inc.php! `! _) X% h3 |( O! L+ X& ]
<php
7 V( m$ M# J; S1 V0 g+ o4 M' qnamespoc_e Core;
$ t( I, d% ]1 s4 suse Admin\Controller as con;% S7 w+ c" j- {( U
, U, U5 R: Z3 J7 T
include '05ou.php';
3 {; s/ T4 y, V  o  C
# N9 J6 I2 T3 z/ F7 Ynew con\AdminController();
5 R* H  H! g! V& Y) H: `2 |3 f----------------------------------------------------------------------------
, w/ F8 N" |1 Q" C/ l05ou.php
0 T9 {: i* `# ~# y; v5 Z1 {<php2 E, ?! J' J" u! ]; G* E8 L- x
namespoc_e Admin\Controller;
% @- X/ ?8 _1 R  @1 x9 r! `: |( p5 ?& m5 c! \4 O) J* q
clas_s AdminController{
& M! ~9 y4 l, J    public functio_n __construct(){
  }: N" r( J8 q4 r4 c        echo __METHOD__,'<br/>';
; ?# {8 d1 v9 M, G% n# I* x    }7 U# b! I- e% Y! ]& V& R
}# a4 p! b- r! v( f+ F
----------------------------------------------------------------------------5 h- M, x. C" j, j7 y
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
% w: s7 V& v1 o$ K
/ F% i% Q! n6 W# Y5 }, U7 a----------------------------------------------------------------------------2 q; n5 R! [4 z0 g
/ z! _' Y2 W. ]' o5 y8 z9 w9 j
04inc.php1 z, ~3 d5 s+ p7 A/ V* ?
<php
: W  U8 z4 W. R, C//引入空间成员类3 C5 }3 D/ w+ ~% t

$ c0 U# f+ N" u6 ], Onamespoc_e Core;
" U. _* Y) ~5 [; duse Admin\Controller\AdminController;
3 r! T8 ~" f+ x& hinclude '05ou.php';
  G- `. {+ Z9 Z" m( A# U
8 f8 G" k$ q9 K7 unew AdminController();
: E( Y, ]4 F! [! Y) ?2 M" H----------------------------------------------------------------------------/ g: \1 j5 T" S0 q+ k7 Y
05ou.php
% k" M& J/ l5 `* [<php
, V# q3 w0 J) h9 unamespoc_e Admin\Controller;
% S% l' _' [. I0 U- K3 ~9 W0 n6 {
! f9 e0 M. L! y' M+ K6 Bclas_s AdminController{
# b/ x! I# k. R3 U5 @    public functio_n __construct(){1 a% H, D9 v1 G0 h# q, r% E9 R
        echo __METHOD__,'<br/>';4 Z! A, ~4 E+ d7 M; ?, G
    }  O+ d1 Y7 C$ a* M( B
}
! `9 ^: d5 o3 I" k7 b* ~; X; p----------------------------------------------------------------------------
5 a/ T7 M5 H* @0 Q5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。+ s; D8 d4 P4 ?' I) i8 e

+ X- i( W: D- M2 T) x" Q8 S: g- R0 V
& O9 d8 c# r5 }4 G+ J这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
* Q: W2 e; l1 d, M" G% R0 o# L0 l. ~9 X4 E2 a8 ]& L( Q+ l# x# j# j4 W

) d! v3 p+ x# ^) V2 q
& ~; c1 H* ~: ^- e; N% b2 }
* R2 O1 r7 c3 Z+ |
) _4 y/ c- u7 Z9 ~/ c0 F: z  _7 F( B7 y/ \4 J2 G, A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-26 15:17 , Processed in 0.157116 second(s), 24 queries .

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