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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:7 O4 a$ }3 ~$ Y: x2 v+ b9 R8 G
; Q& E0 |; F4 y9 @' [
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
! b8 G" V% D. |" Z2 _! F# T9 W" [0 W- f1 k, d- k! w

: @3 g3 [4 m4 u; D0 G2 |
- c" U- q9 E1 R* ]2 J7 E2 }8 x我们来详细的讲解一下PHP中的命名空间:
5 z& r7 o" l/ P6 Z4 @
) k( M: R5 n6 X/ S1 |* j) q语法:namespac_e 空间名\空间名;
& {8 C/ d$ `; h3 |4 H  y) t( b* L# x  k( a& _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:0 c2 c. m) D. }4 g. i! Q6 L8 e

, e) p+ H7 ?: r; u----------------------------------------------------------------------------) w. V' I6 M: N

9 G( Y& K7 d/ L: s3 |1 U) v3 Y* T<php5 W5 q# H& U9 Q5 G8 e* q; C
* }' {0 ~5 r/ M  J+ W
namespoc_e AA;+ b" _2 |& e) o: l( l5 \0 e# f
functio_n showInfo(){# h3 {. N; l, j: S- ^8 }2 U3 ]
    echo __METHOD__,'<br/>';% N# B8 a: H6 i9 M
}
% X  J0 A  }; |% R! }showinfo();
; O' E1 U: o( m) t- f% ~  _' q5 U: ]% G; L
namespoc_e AA\BB;, s! _3 {$ |5 C3 `; J3 E8 ^+ G$ `0 h
* O. B7 @8 t  h
functio_n showInfo(){& T& }9 Q8 O; k0 r$ ~$ n0 _8 ^
    echo __METHOD__,'<br/>';
3 H  g7 [' K0 J; f}
; w, [9 l4 d) T% B//showInfo();7 E7 U1 O8 G' T  R7 G4 R
----------------------------------------------------------------------------, i$ r. ?5 }: [4 K5 ^; S' R% I& Q
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const); [" l6 R- R0 q+ A7 H) R% o6 _- p7 v
! |6 G  d) A4 L$ U! e, p# e
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) b6 ?9 N; w" `9 g7 H$ N  E! c& n9 A$ f3 m/ X1 W1 Q
----------------------------------------------------------------------------, Q1 m4 `+ w- `! }
/ P: P6 H, b7 X- \" o( X
<php& e$ h- E4 F1 w- b1 O
namespoc_e AA\BB;1 k, Q! _  Y4 I2 I! |+ I
functio_n showInfo(){
1 d7 Z: A; t+ S# p0 S, S    echo __METHOD__,'<br/>';
! g; e1 e7 W3 O5 q; b+ \}. C* v$ o7 _8 m4 s8 _+ l; ]
namespoc_e CC;  S4 f  D' ~6 ^2 M; U- C. h% W: o+ G* b5 d
functio_n showInfo(){
- B, g( z/ n5 z& x1 U    echo __METHOD__,'<br/>';) \3 @1 s% Z/ F3 k  ^
}
0 {2 [6 P0 M3 F4 R8 tnamespoc_e AA;$ G3 b* y3 c3 Z# F" R/ T; S* X5 ?" S
functio_n showInfo(){
9 V' B; c/ R$ a- {! v    echo __METHOD__,'<br/>';
% c* v; h6 u3 S8 t. r# ?}$ O- U- @" \8 ^4 H+ e5 X
//非限定访问:用于访问当前空间中的成员6 R+ ?4 t2 x( k
showInfo();
9 e: ], m& h& @: w; |//限定访问:只能访问当前所在的空间的子空间中的成员6 U0 _& h& c. \/ w) R$ y8 D
BB\showInfo();
. P; I3 Y; ^$ e% M//完全限定:可以访问其它所有的空间的成员
7 R7 k5 K) o9 U6 J\CC\showInfo();
/ C  i4 F+ K$ u- ^0 ]& v4 I; g) i↑根空间标识符
; M+ v" d" K2 D3 p: q7 G* A7 a----------------------------------------------------------------------------- m, C0 A; O" a8 O" B* v
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
8 `: Y7 h1 K$ ]( H8 r0 U2 [6 I
6 n/ G- }3 j" p: N) I6 F: b. N8 F8 A当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
( X) s  T, K+ Y" B, |) U6 x
& n5 [, ]4 p9 R9 o代码示例如下:
) \- _; O7 I' e1 T- G
9 `! \4 _+ a6 T6 R+ y: j* Y2 Q----------------------------------------------------------------------------5 C1 i% e' k' M/ \  `6 r

% \: w( I* o" L& r: w( P0 m% k) K* H. A$ j- w: F  O+ [
04inc.php
. Y2 X2 j3 ?* t) Y4 p7 u2 m' I<php
+ E: B; S0 z, l1 i2 g! L" F6 p3 _- X- e2 K
namespoc_e Core;7 B% t" {+ I" `  a+ L
include '05ou.php';
' H. V- S0 a' c" D! ~% Nnew \AdminController();
7 V$ q7 i' M: ?3 F) EshowInfo();6 h8 |3 G4 H7 d8 p( Q4 _8 K
9 ~* y  J  l* W- i3 u* k
echo P;8 r' g: v7 p+ v- x; @- ?& ?; X- f
//根空间中的成员,只要类的访问必须加‘/’* \' M  Z$ a+ l# X
----------------------------------------------------------------------------0 J; K3 C; p, p! ~5 j$ a5 X1 h
2 i- y6 O: _4 P; c( A/ B9 [8 d
05ou.php
  N2 Z# {! B: ?- _+ p4 b5 \6 ~<php
- r+ y- z2 B8 c+ Oconst P=5;4 u# l# c5 X% A' z% F

: ]7 X; ~- o* z8 afunctio_n showinfo(){5 h  v8 _# K3 M% B6 c  D' o
    echo __METHOD__,'<br/>';7 o  `, d. d, l+ ]' `. P) n2 _
}' j8 s, y, G7 h& |3 I: O7 m: p

1 g+ j8 g7 r/ x. @! Kclas_s AdminController{2 t/ |% A* g+ K- G/ P* Z5 y
    public functio_n __construct(){
' |/ h% L2 C& ^: N8 l1 l$ U        echo __METHOD__,'<br/>';) Z4 [2 \; z0 n+ f  G8 u
    }- ~# C; V6 K3 @5 V3 o: v
}
, m( i$ v  ]" r
! ~: ~1 i5 k9 c# G- D第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。* Q5 [$ w9 k% G5 x+ B% y* O2 D
----------------------------------------------------------------------------" Y  v; g7 _/ V! P+ Y0 C
04inc.php
- J# B8 K  \; }  e$ v5 q4 x6 k<php& A7 H! x  N! u2 Y4 d3 b1 v

+ h6 X6 U* e) G9 a3 Z( x7 Inamespoc_e Core;
: g$ i0 M3 Q( L+ I' U% v( B" K- ~include '05ou.php';
. ]! O9 g( r! t# H& B3 [, efunctio_n showinfo(){
7 N9 g) ?0 W4 @& E9 m0 F' B: A( k; Z    echo __METHOD__,'<br/>';- ]9 W1 I4 T" J8 z9 ~9 k
}  r5 D- ~+ Z  I& l

' `  o; M  R8 }1 gnew \Controller\AdminController;
/ R. {" P6 i) g& Z) Q! z----------------------------------------------------------------------------
! @% ?: ]$ k& Q; s) I  s% k: S05ou.php
! S1 F7 Z# ^0 d) ]+ v* u<php
' K/ ]/ K  w* }, g" g& Tnamespoc_e Controller;
3 W2 H- Z( l' ^0 i3 M
& y3 W4 m3 }$ kclas_s AdminController{' Q* N' K1 B3 ?  h, i
        public functio_n __construct(){1 N( ^" v7 D( E
                echo __METHOD__,'<br/>';
4 a7 w0 u# A- @8 G- r. E( z4 m6 Q    }
% c* t# i+ O3 g}
5 @' g% g" o# j  S4 Y----------------------------------------------------------------------------
$ r- L) j/ ~. B8 F4 B: M. C
( j* ^4 n' ~: ^+ o$ H4.引入空间成员:% A" }+ h$ Z( H7 y0 `  a3 g

# S# [5 d4 D. |: x1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。% [: P- O, [0 D9 J

+ K' e# }$ T) A+ s7 ^8 f$ r----------------------------------------------------------------------------. u3 f: K- I& x; q

0 @, I0 ]& L0 }4 R5 `( R04inc.php: q0 F  O2 o: }( W: k
<php0 V* q8 r, G* ~+ w! }
namespoc_e Core;& c  U& y6 c: K6 x
use Admin\Controller as con;
: V) o, \1 P6 h9 s8 L: L9 \% R3 P% w" X7 n# ?
include '05ou.php';
: O7 \$ q. d: j# ?
3 Q, ~3 g9 h+ g4 H/ i, a  ^" Hnew con\AdminController();
: k" Y- j7 V! Z% d----------------------------------------------------------------------------
4 e8 Z5 w1 `! o% z% s05ou.php$ J. Z% i. @" P5 X7 T, Y
<php* E0 r* ~8 I  X" d: ?* m
namespoc_e Admin\Controller;
. M- d/ D2 t/ ?+ R2 I2 J- W( Z& P9 z) _9 K$ M
clas_s AdminController{/ d- Z4 n' ?0 i, Q( c- _" n
    public functio_n __construct(){+ K2 J# ^' }- x( f% L  |: e- S
        echo __METHOD__,'<br/>';, ~/ X  d  Z- [) s5 i* K
    }5 @  E8 y8 m& G" B# K
}/ _/ V# T* l$ ?& U- v
----------------------------------------------------------------------------
% c5 F7 ]# \  F$ u7 i2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
, m! ^1 C% i( Y5 I$ T+ i# j* e9 e6 C7 ?7 h$ S5 X. W+ b4 a1 C
----------------------------------------------------------------------------/ U1 B2 p8 v! L" y* b5 e' r

8 F6 B' v) G' K# U04inc.php
* Z" `0 u! @  l, G/ b5 h<php
* L/ P/ q; S! c3 i  c& i) `3 s$ k5 h# s//引入空间成员类2 f# v5 i& ^4 z- H

: A( R. R' ?9 V& d* v/ Inamespoc_e Core;
& T. K/ S; P$ X1 C8 p% X! G" H6 Nuse Admin\Controller\AdminController;5 o5 H$ N* x1 ]% I* M; F
include '05ou.php';9 M2 z: w9 U: O( z" \1 r2 Z0 c

1 ?1 F" J7 b7 a# N' C' G' M% G: anew AdminController();
9 E9 j# o# v! K) P% Z----------------------------------------------------------------------------1 p- \3 j: c  b' c5 x
05ou.php+ v+ a0 @/ B+ }
<php2 u- }+ A8 N" A- }3 Y
namespoc_e Admin\Controller;3 Q3 m' `: {& x) l- W1 ]; P2 J

2 P; V9 H# q" R# I, M% M( Kclas_s AdminController{
% g. z5 u( `) ~+ E; {( }+ M    public functio_n __construct(){
4 x7 f) I" x2 J( J        echo __METHOD__,'<br/>';% L) p8 T6 Q. _0 v3 G+ c6 p" Q
    }. k4 U. B  C" Q/ `9 ]2 D# m4 a
}3 [$ [2 D/ z4 u* ^+ m4 L, `
----------------------------------------------------------------------------0 v1 P  [) s( g8 [: }0 }
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
( I1 l% n% @9 w0 V% X: N. _0 p8 z, m8 @6 V2 L2 f9 ^
: a+ y$ K# j+ R
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ e4 m( U* L% }( _( w7 u
! F3 i0 D% z& B# y+ N
  v* h" b4 i, Y

0 P- S4 {) f$ y
9 _- o( X' d6 D' }; k$ w- b
% {: d+ ?5 V& g2 z) @# B; x# f# J9 h" ]" ^. d9 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 11:46 , Processed in 0.053343 second(s), 22 queries .

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