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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
) p3 N  ^5 s  a7 `
. _$ g7 r6 Z3 c# l* x在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
& |. u; y, I* r8 {9 z7 V
' U0 y9 I& H' p1 Z, ~+ p
  M: A2 M8 A& _/ o; O7 n; M" Y, W: s; M  f+ _# f1 q
我们来详细的讲解一下PHP中的命名空间:
; ^7 O" y0 N  w( e; n) b; C0 a% b
语法:namespac_e 空间名\空间名;" i, o0 m9 z8 c4 [

5 g4 m7 y- B5 L说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
* W& G5 i; J) p/ a
( _0 y7 I  X7 F" A----------------------------------------------------------------------------
5 e: _) ~; @/ q6 e# A; J8 v% `( D- n& ?- l5 s* P/ L
<php# _7 Z4 v  a0 Z! G4 G! u5 k+ U

+ }1 q7 G% Z. j' c; ]namespoc_e AA;! h% ^7 [. n0 c# o4 p9 T
functio_n showInfo(){
& u$ y8 H0 E7 `+ j2 \6 v    echo __METHOD__,'<br/>';7 Z" e. P; I" t6 R# M- q. ~0 Q
}5 u7 L' Z* W: N% U
showinfo();
& u  S! i+ k( b, f
( o( u& i, K' Onamespoc_e AA\BB;
7 \+ _: [: r3 f6 a, G" z* I6 i  ]5 M6 N9 R- @
functio_n showInfo(){
6 w5 B8 b0 P* [- ?8 }7 [    echo __METHOD__,'<br/>';
9 W$ J, W; p4 r+ E) ?1 p  _7 x; y}3 o: b2 R, q2 O. |5 Q2 t
//showInfo();
, D5 Z7 f6 T6 h$ X# p( x( J----------------------------------------------------------------------------
0 Q$ T0 K) V" m# E7 F5 C4 E# M2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const), l8 S+ t1 x: S3 a* R8 d# Y; h
6 W# ?+ M  P' h9 b# t2 I
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
; v- k3 Q* n" Q& t
* @- s, X& T0 t$ b" G3 U3 E' A# x----------------------------------------------------------------------------0 Y& Y, R: P' X8 v" X2 o$ j* K3 |

0 R" K/ U- r/ c! {# v<php
- c" {" k9 ^, e% Z1 L/ v1 Mnamespoc_e AA\BB;- }8 g3 i( n& I( P1 c- ?  u- |
functio_n showInfo(){
. w. a9 ~) R4 V: T$ A$ K1 r1 z    echo __METHOD__,'<br/>';  }+ Z8 i0 q) J. u7 i
}, r9 U0 ~+ y' g  H( ^5 k
namespoc_e CC;
1 o& z2 y# O4 Hfunctio_n showInfo(){2 T  D# D$ x- g; Z3 E" Y# I
    echo __METHOD__,'<br/>';1 a: I  K. W  J
}
2 }) C( B1 W" T: H% [namespoc_e AA;
7 f. \* M5 n2 y. P3 U: hfunctio_n showInfo(){
( ^$ p" e; a& ~( Z  p7 {% {    echo __METHOD__,'<br/>';
# w2 `" K' n* {2 {% q}
/ |  u& A9 M$ U" [//非限定访问:用于访问当前空间中的成员
5 t( w+ ^( o/ gshowInfo();% E4 g( H" R: q: Z
//限定访问:只能访问当前所在的空间的子空间中的成员( a5 L; R2 K( [; ~
BB\showInfo();2 i" n& t3 \) Y3 h' ~1 h2 _
//完全限定:可以访问其它所有的空间的成员
' z  w! z& p2 U! H\CC\showInfo();
4 @, ?0 g. P! z↑根空间标识符
' H! n0 |+ e7 l----------------------------------------------------------------------------, f3 O# ?' l: {$ ~4 Y+ q  n1 I
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
5 Y7 F, |) z7 ?) e6 W8 G
: _/ _4 w; K" j  V  j4 y当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
& x1 e! M+ _2 T, `( R! E) f# c3 u: O/ o3 N2 F6 a1 w8 [- c
代码示例如下:
6 ?; x1 }$ q. Q' f1 j) N: Q9 B! W
----------------------------------------------------------------------------; s& n: L! \$ J4 O* q( J
$ Y  C& Z; T  K5 |
) q! B. H. H8 X* R5 [* O
04inc.php
0 O6 M/ X  Y. O6 c<php
! V  [% M  `: ^, H& Z4 V& x) h& r2 l( P
namespoc_e Core;
. q8 x9 C! \1 Q! x6 ^  d3 A  Jinclude '05ou.php';
0 M" v; O# e: R- T' p0 X' c6 B+ dnew \AdminController();
( ~, W& |) N5 X# S1 `6 JshowInfo();
" Q& W: j2 P9 K( s1 w  ~6 {& E# j& n+ C1 F
echo P;
' `$ M" Q6 b7 \! M$ I. w3 e//根空间中的成员,只要类的访问必须加‘/’
' M* q, R/ l+ K! ]0 q----------------------------------------------------------------------------
2 M1 R" Q* e( j1 u. D6 ?
4 M) k5 _: _% z6 Y0 r05ou.php2 d/ p; g. Y! m2 X- [
<php
( V# h/ q. t4 t* s( y: X: m$ o3 Bconst P=5;* L, F8 I3 Z8 h+ l3 y2 R! a
/ o# m4 f8 S; r( i. D/ V$ o
functio_n showinfo(){
2 e4 d2 b& \( P6 n6 @  k5 ^    echo __METHOD__,'<br/>';4 l$ K" t8 p! R3 x- `  s) f
}* m2 |+ j' [& w' n8 W; \0 e; M

2 P* D6 y5 g+ n2 W$ E  Eclas_s AdminController{& R: f& S8 c- ]0 e7 o, F$ z. p8 O
    public functio_n __construct(){
" A  X9 B5 `2 s, A5 I        echo __METHOD__,'<br/>';1 ^' y) D* e1 f' [: S
    }7 B  |- f2 a4 L% c" i
}
2 x4 A+ T+ \2 j% I8 o
) U0 f$ L, t; V2 ^第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。$ q: L) |6 B! }8 ]1 b
----------------------------------------------------------------------------
" a* G- ~& R2 H% _4 f! J8 L) s04inc.php( x. N& a/ }3 w; ]
<php
0 A$ }! C' Y- f1 z9 s  r
  G6 J( y. q  B- D: [1 onamespoc_e Core;9 a- I$ Q2 l* i% k
include '05ou.php';
- w( }; @1 Z: x9 ^2 g! afunctio_n showinfo(){$ `' V5 Q, D/ k& q* L
    echo __METHOD__,'<br/>';
6 {9 e( p; j4 F" \1 a2 {  G}
* l! k/ R0 f' E& D
2 ^, v4 o  R3 Mnew \Controller\AdminController;/ I  j2 [7 j- h3 w; _0 M
----------------------------------------------------------------------------$ G: V6 P+ i" r  B+ f* U0 `
05ou.php
1 C8 |9 S9 h/ F, ~+ q<php
+ s+ i$ B) _% wnamespoc_e Controller;) q+ v, Q- j1 w4 \
. h% r. Y/ H( C' s) S0 w
clas_s AdminController{
  ]8 y( N/ L& N3 p+ e        public functio_n __construct(){3 P' }- C6 K6 A* N: F9 \6 U/ T* a
                echo __METHOD__,'<br/>';
8 Y  l- s! D& j( o7 O/ |6 A7 t    }
0 x' q7 k. ^3 U: P}( h6 @4 D2 V4 Z* o8 M1 v
----------------------------------------------------------------------------
8 q! `6 @* O3 F3 v9 O7 A( P0 T$ P) D
4.引入空间成员:
4 U( r2 B. v  r/ _( Y2 R$ Y7 |. m& `  P* Z0 `* \
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。, w3 ~) K/ L. u
. d' F* y' ~: S0 w
----------------------------------------------------------------------------
( b0 b+ D7 F* _% V  r' a3 I4 q- ~0 A/ N7 e- w7 l+ |  U
04inc.php! _  q( \) p8 I! M' l7 Q* y
<php
9 o$ Y7 r  t+ Fnamespoc_e Core;
6 f; B3 R, L  {4 t7 T. k- \7 uuse Admin\Controller as con;4 D- _6 q& Y/ G6 `. N! }$ L9 c
; T3 Y% {; n3 O& {! m
include '05ou.php';) V9 A( K; o0 f  _

0 [6 v) X3 }- j# V. [new con\AdminController();
9 C- k. H' X7 e- F----------------------------------------------------------------------------0 I9 W, i; l& u( ~6 d
05ou.php* E4 q( H5 ?' j3 V/ s' C( j
<php! h. q) J0 A3 t, E( {8 u; m
namespoc_e Admin\Controller;
4 n# G% e; G) ^0 t4 V
, S' ?( }6 N2 I. s! T3 n  mclas_s AdminController{
1 k0 d( W* y) A$ r' l! D& V/ {    public functio_n __construct(){
5 g& S/ j  i; _4 V+ u2 c( T        echo __METHOD__,'<br/>';) I4 u, ]6 j  O3 [+ ~
    }1 o# y2 D. g# D% W" p/ }
}
2 J8 o: K1 U! ?9 Q2 P: i' v! ?* `----------------------------------------------------------------------------
- g* `+ C0 G1 t  h" z& u2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。8 A( {0 E" R$ K8 P. H" G% [" L

' K6 P$ S: D; B+ f0 Q$ N: {----------------------------------------------------------------------------
% g* H! e. P9 q+ j. u5 _. [) ?$ \' h$ w2 D+ x( G" I
04inc.php8 s3 s. Q' V7 B* G) Z* |: ^, C
<php
- y+ C9 Y) g* T* P2 r//引入空间成员类
2 L3 A% d% {* R0 k4 p( z; b' A% ^
namespoc_e Core;
4 r7 x& ^; M* _. yuse Admin\Controller\AdminController;
; @. n2 U, w1 {1 ]6 {include '05ou.php';8 }8 L9 A' }9 C$ {1 y

1 t8 A! g) A" V3 U& K7 M( K3 |new AdminController();
$ C: n" E$ W8 Y9 D----------------------------------------------------------------------------' y6 t/ |7 `5 U, R
05ou.php( D2 T0 J0 x/ _6 x
<php, v7 X! a2 d5 k- |
namespoc_e Admin\Controller;
, w& f* e9 R5 Q, A. I! C  t7 i4 l& X! [, g  e
clas_s AdminController{6 S# L, G& i$ p) Z8 @
    public functio_n __construct(){1 c, b  J/ N# _
        echo __METHOD__,'<br/>';
: ]# e2 ~! }. M+ x) T8 L0 O1 u    }
+ {3 C+ U% e3 y& D0 _}
$ M1 u: D/ \+ f/ t* y----------------------------------------------------------------------------$ ?; J4 T' J1 b8 J/ l2 r; g
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。# r3 j% U6 l4 [( z* R: Z3 `2 G

! \' m' ]9 j5 D! z! f6 V0 c  r* {  o2 L8 r$ S1 O
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。2 ^: B. s7 \" b' W. t2 L! u

* q0 f4 O: ~1 ^# }6 i6 x
# D9 i4 T( {- m5 `+ T, b
! `8 D& M; S+ ^7 s9 O: U* s
* X4 ~5 L( i4 h7 M- s) ~3 j: L% s- P

6 G, v/ O6 v0 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 17:48 , Processed in 0.120739 second(s), 22 queries .

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