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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:( X3 B7 W+ {3 \
0 J% t/ f+ f! X) F% j: i
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
; [" j! C' T" s: p; i: Z  w, O8 \6 g0 b- t: X

9 v' C3 B6 `" [5 e+ i0 E0 d2 w; ]8 S
我们来详细的讲解一下PHP中的命名空间:' w6 v0 K5 f7 f$ G

6 r# J+ b5 i$ n& A; l0 D: t语法:namespac_e 空间名\空间名;$ }, K0 B! A7 U* z5 j( Q* \
/ J3 U! G  B9 K5 `0 d
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:7 m3 y9 E: T) o* P2 j2 l, |  k

# z0 T; A1 i9 f0 X9 G' [( n----------------------------------------------------------------------------! j) M, J4 q& t/ ~( J; b1 `+ e# L, Y5 e, o$ M
2 n1 C9 f; l6 S& Y3 m  [# Y
<php& ?, X+ d6 e  u# M/ ?* M: l- c
/ f( N8 w0 S) r% R) z
namespoc_e AA;- z8 a5 a  A0 W$ a# d
functio_n showInfo(){
4 \  H1 O1 v7 h% E8 A5 I0 K- @    echo __METHOD__,'<br/>';/ a- ?0 e& B, _
}6 \, r3 ?# P; v+ @6 c8 l  f+ [2 x
showinfo();; B( p* S1 c( s0 Q+ Y1 m
+ s( {, Q' a# r7 `* o3 E. F; H
namespoc_e AA\BB;
$ L( {; \0 f) A' R5 x+ w+ c/ f4 z7 h4 [4 S
functio_n showInfo(){
7 o0 {0 Y* ^2 _7 t: \$ k    echo __METHOD__,'<br/>';- y: R. N# \$ d7 f7 w6 j" ^
}
. P% g0 ~/ U; D; v$ J! k//showInfo();
  d- d' h6 z2 o! z----------------------------------------------------------------------------( x& a6 }" Z, k. \) u1 H
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)' o+ [' J8 a% M) n1 @$ g% [6 t0 \$ N
4 P2 c$ E* e. V  t
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
* t( K. u5 ]! h- Y
  H! m  x; d5 V4 p----------------------------------------------------------------------------
( J5 w7 s0 D* V* d, h# i& z7 \- ^' a' t9 J* Z3 Q' r
<php
" D9 C! H* k; M, I2 R% q( ynamespoc_e AA\BB;
' V+ P* o" q' {# Lfunctio_n showInfo(){
6 K" C: V. ^# k( Z% ]5 C4 }, s( G' v    echo __METHOD__,'<br/>';
4 Y0 R0 x( g$ }1 ?( Y5 v/ c) o+ \}4 O* C2 k7 n. m* U* X
namespoc_e CC;
  x: f" R- G) ufunctio_n showInfo(){
8 C9 Q0 T0 d3 ?# r* q1 e* V    echo __METHOD__,'<br/>';
$ d8 a) V; m3 D1 k# P; T' Y0 h}! Z: S( T+ _+ U
namespoc_e AA;
1 i; h" z$ L9 zfunctio_n showInfo(){  u' }% q. d0 u- q
    echo __METHOD__,'<br/>';
( f& y. e6 z, ]}
2 e  G  H* r7 r8 s' C# _1 {7 |//非限定访问:用于访问当前空间中的成员
' _! C( Z0 c, WshowInfo();
1 @# y; [4 e* u  _0 N7 G9 C//限定访问:只能访问当前所在的空间的子空间中的成员- `( |2 v, Y  ?" s7 }/ |
BB\showInfo();5 A& J8 q2 i: o, y! A1 X
//完全限定:可以访问其它所有的空间的成员
) _1 }, Y# T+ z; j8 X$ E\CC\showInfo();
$ W0 t; l& A4 `+ o↑根空间标识符
3 H: M) R& L' r& ?----------------------------------------------------------------------------# v& s1 O' e- V  s2 K0 Q7 K; h
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
! G3 a7 Y* I) T" g
% Q" X6 b7 l5 t0 O, s  s( x当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
6 P; V: T& r- I; U: m2 s# \+ h$ Z; N  j# d4 {% ?2 |/ T/ t/ \
代码示例如下:% {2 l- B3 n! Y$ _: q
; ?/ v0 R' M$ t9 a( b& P( K3 i
----------------------------------------------------------------------------" G+ d  F3 s, f; b7 T

: z0 w& z/ D; t1 ?& g+ b5 q
  J3 E& z- c4 W: [% {$ c. `04inc.php0 j) `  a/ D0 \. e' [, ]3 Q3 h
<php
& F' n* v" a( d. H, z. h2 S
1 p/ G0 y( d. Q( y* Bnamespoc_e Core;
0 m$ J2 Y* [6 F7 G( _; r) Finclude '05ou.php';( E* d! l) T$ p; [% t: W
new \AdminController();
( s) g# d7 @2 ~5 o: VshowInfo();
2 A. z/ ^7 {' N+ C; t& H* [6 S+ F' D/ F1 Z5 v
echo P;' K. B# b/ u' r1 x+ q6 \
//根空间中的成员,只要类的访问必须加‘/’" Z% j6 R. U3 {
----------------------------------------------------------------------------
1 B& x+ h7 e  Y
7 K- I3 l$ O0 [0 ^05ou.php" b3 C! S: ~% e3 D4 \0 o4 V$ y  ~
<php
: R5 e8 l# \5 J1 N" i) x9 Q1 Tconst P=5;* Q) m" M, a! E2 ?7 k6 E5 i

- K4 \6 B; G, O4 q& Rfunctio_n showinfo(){
' |8 V6 ]# n9 y# M* v7 g    echo __METHOD__,'<br/>';
. {7 `& a% P& `* v9 d}- }& i% t6 a* z/ d

& Z7 |5 R# j; C& E( L2 U* ~clas_s AdminController{
" f- c9 x$ o6 x    public functio_n __construct(){
" D2 g+ {7 T$ {: X8 a( m8 B! U7 c        echo __METHOD__,'<br/>';( I- K+ S* ^9 ?5 Q
    }
! L0 ?9 x3 V7 @2 Z' T- n6 g}3 D; U+ J+ y% q9 R. c

- P7 D% t! s2 h: p6 m) k% b2 U, j1 k& ~第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
- ]% ?/ b. E0 |/ ?3 S----------------------------------------------------------------------------2 ~" H) E+ O# c2 y( U* l
04inc.php; G+ x5 o  o$ R
<php
8 m+ ]; P& C  n. i8 h; l, |) [, u# N/ \7 }
namespoc_e Core;
$ y6 Y/ a0 x& V& ~include '05ou.php';! }2 t0 u* A; y* ?2 ^6 x
functio_n showinfo(){2 ]5 L( v% {( T; M
    echo __METHOD__,'<br/>';
" U/ B$ T$ P9 j. N! Y}& R1 j' k+ u7 Z( `" I4 ]' {

7 _- b: f1 U  |! }* ?5 n, W5 Hnew \Controller\AdminController;1 P3 D& m2 A2 N/ t9 z
----------------------------------------------------------------------------+ v* N* C8 H% S: k2 n
05ou.php
) S1 I5 v, ]& m2 c1 ]4 d0 m+ u<php5 v7 \( I* |0 i+ N- J* M: z" G3 U
namespoc_e Controller;
; t! K7 `" X3 k% H8 K' m6 i6 g
+ L% J& Y% A- z0 }, f9 zclas_s AdminController{
8 p# T+ H5 O, M* W6 K: B        public functio_n __construct(){8 ^1 Y# i$ i* q$ a3 I* Y) x
                echo __METHOD__,'<br/>';5 x& ?3 r5 D( Q" T8 w2 F& t
    }
1 u3 {1 r: T/ P$ V0 L0 ]! y}! ^1 Z1 t) M6 O) N
----------------------------------------------------------------------------
* j) J* U- x" k$ w" O* h6 M7 _, Y- t  O8 O8 E4 \# K
4.引入空间成员:
0 H; T; {! c) T4 A# \: ^$ [
; l! X' w5 J" O/ E2 R1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
4 g* P) ]5 c# k. D4 l6 _( \) k" W/ L, B
----------------------------------------------------------------------------# }* n8 ?' l+ D& J

& R; m' g2 L6 ^+ b04inc.php) R' O! I! M% w$ @% z5 i; p
<php
: `& z% l" L0 F  J2 jnamespoc_e Core;- B$ B6 R* }: Q  _! m( ~1 s3 Z
use Admin\Controller as con;
4 X: `2 V5 f6 }& r' N5 U  ]
/ C4 |( ^' a& Y3 U& dinclude '05ou.php';
/ G* M- @1 r/ X5 p- ^: _: X: r$ N8 w) H9 K, G: P4 W0 ]7 t
new con\AdminController();
: h& X/ s$ O0 Y3 ?+ i$ e% Z----------------------------------------------------------------------------( K% O" F* F# c1 N3 b
05ou.php
, o! ?% |! g3 z. r, A* k4 z7 f<php' T3 |" a: L" U# K$ @, R6 s+ D4 i
namespoc_e Admin\Controller;; {8 J* y9 P& N- c, }, T3 u: X3 j
* ]' Z, O; C0 ?8 Q; t7 \
clas_s AdminController{
. B4 {3 k- @( H. E2 Y! z1 J0 L3 i    public functio_n __construct(){  {* s) ]0 {! h0 g  m2 A
        echo __METHOD__,'<br/>';  G& n! ]  ~* H7 E5 i& Y
    }
$ Y" M. W, o! N- N: T}; c: F& K0 s# i9 [# N
----------------------------------------------------------------------------
; B' y, X* }3 y! q# g" O# g: ~2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。$ z& B" b& D3 a! x0 n5 G
  F& X6 q( K9 Y. c* L6 h
----------------------------------------------------------------------------* u- c- e) z& G0 q/ O- o

' b) m) ^3 @5 S$ b04inc.php& `3 W6 B' T9 `% V& W
<php7 a9 L6 E$ \* w- y7 F+ S
//引入空间成员类
4 Q* S7 q2 e0 U  W2 T1 U) l# O  Q
4 m" }$ {' d9 H& ]9 T* M# xnamespoc_e Core;
, I" q$ E. [+ ^  Y0 o1 F2 m0 Q! E; X# Quse Admin\Controller\AdminController;
2 p1 g6 g8 D% L8 F; \2 D  D1 |include '05ou.php';- R+ b+ v% W& P

7 s0 u5 a% K. snew AdminController();
3 m1 I! l& g9 e( }- |/ J----------------------------------------------------------------------------
! X4 x2 t! p6 f5 C. Z! b05ou.php
. t* q3 M# o! X$ o, o; o, L( j: f<php
6 i+ l3 c8 O6 }# J# ]* [namespoc_e Admin\Controller;
+ t* s  A! Q2 R0 u
# V) X0 v5 Q0 Yclas_s AdminController{
( S) V1 u  h6 g* e    public functio_n __construct(){
% _0 l' a, H& U" z, [3 Y        echo __METHOD__,'<br/>';$ G0 F# L" j6 T& C( M: P9 W) f
    }4 R/ g0 Q2 }9 e" H" z8 w
}6 v# R& X5 N3 Y3 z" f1 C
----------------------------------------------------------------------------
/ X' W' J' w' y5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。& a0 |6 ]" D3 t5 D, a8 n' f
6 N# l/ z5 m6 p& T

1 P  [& l1 ]: Q! g$ L, J% A4 R这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。1 [" |0 r7 R9 f* q9 H! N

  J2 Z5 ]7 @8 a: r9 U: v
7 n& Y/ p( l& U6 I! L1 o# [) q% I2 k6 G  Z5 G8 Q
9 H- J) v! O0 Z# h( {& H# J. d' l

+ C8 B& |5 }, R! k- {" _+ X  i$ d" w+ v- s: }* k  ^; W( F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:13 , Processed in 0.105073 second(s), 22 queries .

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