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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:+ }" P4 M; w$ u3 o9 Z- q; ~

* o6 {. P. C  K! _在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:- m- b) V( `; y

/ g! w8 U. Q; v+ x# \) G% Y( k " }( W; c/ X5 s% v2 p
7 u/ d+ `% P6 I
我们来详细的讲解一下PHP中的命名空间:8 w! j5 i5 }) ^% M
. c; X5 D* T- D- ^5 _
语法:namespac_e 空间名\空间名;' `5 ?( s5 F6 i7 r
3 |, T) y) d7 ~( ~8 x; e
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
% K* Y; `% J8 H, ~/ P# I
+ S3 m/ g6 ]: H- r* Q  H----------------------------------------------------------------------------
# `. _; X! M4 ?& R8 N/ A6 ^- k$ u' [, ]2 X
<php. K* n7 O, H3 q6 @) X, h6 ?: G! P

! Q$ K3 ^! R" G1 Pnamespoc_e AA;5 k7 H/ }8 K+ L
functio_n showInfo(){
9 m( R% K- n1 t+ i5 b, X    echo __METHOD__,'<br/>';& a% N8 e/ {3 R8 ^( B) B/ G0 d8 }
}
1 y0 e0 W$ L4 e9 i4 wshowinfo();1 D  U- b2 z& r! H! F5 B: A( u+ P( D
4 c9 Q5 A, {! X: k- |; o
namespoc_e AA\BB;
% w# c; r: o+ ?: }' v5 j( U$ q, f* w" [( b8 i) v: ]
functio_n showInfo(){
8 q0 o  B% V- u7 q    echo __METHOD__,'<br/>';
( ?$ G; D2 {/ b7 z; o4 t}
* m( H) b) G! B; T* n//showInfo();- a* V2 k( }8 f% _4 V1 \
----------------------------------------------------------------------------
4 [% g7 \2 C. S2 j( ]  p2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
9 U* Y: t: `3 ?1 F$ _3 S' s9 k; d- @: W" s# C, O( `  b$ S1 z( E9 B5 b+ w
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。' Z# {, ?) s! C! N' z$ j% g; H% M& m" Q8 H
* w* X, o0 q" t$ d
----------------------------------------------------------------------------
3 @" m' y3 F- m1 W# z% ?- P
9 B4 X2 |& A) r9 h" |, G( L<php
* E; P! }5 T- s8 Knamespoc_e AA\BB;- G6 W$ q1 {3 c" H: U  }; w! f; [5 X
functio_n showInfo(){
8 w7 {$ _5 h$ ~! D! K1 C    echo __METHOD__,'<br/>';( @# Q) O  {9 H7 E% M: R. G  t
}- r; H: b, w6 \& j0 O
namespoc_e CC;
3 n3 @8 t; W' n/ N  P; \- C5 m& Efunctio_n showInfo(){8 l7 n2 O9 a9 M/ U  q
    echo __METHOD__,'<br/>';+ w% n9 \, e; M8 {- _
}
7 u1 C# l: Y: z8 lnamespoc_e AA;4 x9 F1 q3 K" y8 p5 X6 {' c
functio_n showInfo(){+ s* F: {9 [! r& C& w: y
    echo __METHOD__,'<br/>';
2 E% Z  d0 ^7 W6 e: v, Z}' o. G! n+ `1 A, n3 l" M
//非限定访问:用于访问当前空间中的成员* l0 h6 r5 J; T# M
showInfo();; f5 _5 ~5 m' g2 H1 l
//限定访问:只能访问当前所在的空间的子空间中的成员% d) t0 |. V% W7 ]; b9 B9 d( m- s
BB\showInfo();1 O9 q- q) K3 e  r
//完全限定:可以访问其它所有的空间的成员# b- f3 E4 n+ {; _& X4 F' c6 S
\CC\showInfo();
! Y' p+ B* ]& R0 Q2 g↑根空间标识符" V# h( f( t- H" ^8 b5 `+ C
----------------------------------------------------------------------------
/ C3 m5 \4 \; J, H0 W2 @) Z但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
3 u! y9 b0 i* ]8 x' n' O
0 Y/ D8 J* x. m( v% |. U2 i/ j当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
7 e+ _9 j+ R7 U: Q# V
" ?7 P5 r/ B2 ~1 p' b" c代码示例如下:# r$ E, b3 n) V

3 l; P1 R6 K& b$ M----------------------------------------------------------------------------
: z+ K& p% b7 \, j( D1 J# Q: m1 C$ M' ~

# U, ~% d% O; i& Q! e04inc.php
0 j. f; C; ?+ J- `2 T  b$ x3 ^<php: |& X/ B2 A% V& ]  f  V2 O
" N+ S  h0 b6 E! c2 }. d
namespoc_e Core;
  P- C, _* m& m& h* x! Z9 ~include '05ou.php';
# W) ~9 \7 `# Gnew \AdminController();4 a% s5 C4 t+ J
showInfo();" b$ @% V+ O5 }% P# d' i- T! L
8 W; n& ^& Z, ~
echo P;
- ?) P) Q, ]6 J3 L; C5 v& W$ \: ~6 k//根空间中的成员,只要类的访问必须加‘/’5 S& `0 T; H- G7 D: _
----------------------------------------------------------------------------! U# O7 q! ?9 Y9 B" B
$ r+ D( i/ u& ]8 b  {
05ou.php
1 X) b" r+ G) B+ T/ w! Z<php/ R% V/ J5 |5 Z( B0 L' g
const P=5;
) {$ E6 Y$ g4 W7 s: B
4 `  ]9 l- @8 G: Sfunctio_n showinfo(){
- A2 {- ?: M5 h4 S: p4 C) T    echo __METHOD__,'<br/>';
4 ~0 x& p& Z8 _; }! C, a' @) h}
/ }1 a- N6 Q; r
6 `9 i. `0 _2 J8 g; |# Vclas_s AdminController{
$ W2 i$ t  f" E8 k* m) X  t    public functio_n __construct(){
+ e# I4 w5 O; B1 I6 y0 V& `        echo __METHOD__,'<br/>';
4 V+ M- o* c! O    }
0 c7 h: r1 u; ~5 o) _/ l1 M6 e$ F6 u: ]}
) A7 t: _0 P/ V& G* @4 B/ Y
7 C, K3 f7 v" U6 z7 U, d: S' ^第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。5 F3 _( J! \2 O( B6 Q- g
----------------------------------------------------------------------------
- r  f* H: t% c# W3 V0 ?04inc.php
) M' l1 h4 U9 ~2 K<php, e9 o8 E, O4 z8 L  i
9 V) ]+ C% K4 j' L6 T( q
namespoc_e Core;! E* }$ K* V% Y4 O: A7 k# g
include '05ou.php';
4 m$ {2 {, A) |& Q* @functio_n showinfo(){
; c. q' K! y: B  d# f    echo __METHOD__,'<br/>';
* ?  O+ ?1 a: U% z# f; {}
: m% ]+ V* ~# F% h$ c  |$ S2 E( ~4 G" P+ E9 t# N) W- H
new \Controller\AdminController;
% x+ C4 _* A2 E2 k2 U( [& X/ N' J----------------------------------------------------------------------------
- H4 ~' k$ L" H6 b05ou.php; P& m1 F! P$ c! p. ^* _% B7 `
<php4 v" ~( m' Y9 k1 c# e$ `* i5 T& X
namespoc_e Controller;) Y; B+ x; D6 ~
, H3 c( u. j( @# e; s
clas_s AdminController{
! W" Z+ l) T/ V' I* l0 L        public functio_n __construct(){
1 r' k% `5 {/ s" f5 H# v  C. h% u* b$ P                echo __METHOD__,'<br/>';
, M( L9 a0 U1 u, _" ~    }
: f0 Z4 V$ F' i* S+ _2 V}2 P% ~( b# f3 X1 x6 a
----------------------------------------------------------------------------! a* u' |8 Z, o. _

2 t+ O1 t* }3 M4.引入空间成员:/ I& q4 i! \* M) Y6 x
# X& W& V  c5 a* M# K: q: t
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
, s; l' N- |2 h( k4 t" k; a# G: c
----------------------------------------------------------------------------
  G4 _# U( n# o4 z8 }6 M3 o" V2 c) Q9 D  q( m  E# Q
04inc.php
! R- R( b: X/ ?! n# F<php# C- o+ c9 n+ g, w+ n( d! ]
namespoc_e Core;
# h7 D$ b' P6 m* V0 Luse Admin\Controller as con;% D: s; X1 u3 ?0 F: n

- Z; H4 E! r5 w, _+ ~0 ?include '05ou.php';$ }# l' F6 d" o( N# p; x/ K+ x# B

/ n9 y3 X( q& ^/ D  Unew con\AdminController();
& [  {+ T: I1 g8 J1 o7 r, ~----------------------------------------------------------------------------
* R& g1 g0 E3 y05ou.php, ?3 Q* k' R& o9 w; v7 H' X
<php0 z8 ^, n' I. |
namespoc_e Admin\Controller;
2 h3 g0 e4 R+ v4 c5 t9 g6 U4 `! V( d/ Q6 I
clas_s AdminController{+ Z7 j4 o! p. y9 ?- G) i" R7 I
    public functio_n __construct(){+ ]% f3 \# ]9 M! p
        echo __METHOD__,'<br/>';' i  ^' E4 l' `# X
    }
; z9 V/ d8 r: R+ _# r( P6 ?7 I}
" q  a0 ~5 P% e8 J* q, w----------------------------------------------------------------------------
3 N( M' K# b: U9 S1 G2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
8 j, E* Z6 y6 Y
. N$ N9 W$ c$ I9 ^  p$ p----------------------------------------------------------------------------
$ }1 L+ ~. y, U- S/ y2 a2 u
3 D* N' n1 j. f* H04inc.php: E% n! T, q9 @' u
<php2 f4 b0 O2 x; L, h
//引入空间成员类
  J* B# o' P; x3 X9 ~- V. R  r) M3 {& b) S1 C! Z  d  P
namespoc_e Core;
6 ?9 ]( i3 J' w" a8 ?8 Puse Admin\Controller\AdminController;$ A: z  J3 z" e& }' r
include '05ou.php';
7 W$ v+ g: z* n' @% n' f( O
3 e! m0 o8 F+ M- t1 e" i$ Z& nnew AdminController();, o' b" L5 C9 E
----------------------------------------------------------------------------
/ N: D# [; j8 L) c3 L4 q05ou.php+ o; o* p* N9 U) f; r
<php. j6 j+ F4 D. G+ q3 j3 l
namespoc_e Admin\Controller;  E3 c. G3 R4 m7 t2 N7 y1 U5 f

$ M- o" e( i+ Q: g. P: V! {# mclas_s AdminController{- M5 O; T* k4 W  p' g6 R
    public functio_n __construct(){
  |( T+ v5 @' W2 l) W        echo __METHOD__,'<br/>';
; ]/ G  X5 P5 r3 M2 A    }
$ n( k  z4 [6 i7 u* K}
$ U) @3 a. W0 {( V4 H2 Q  ^----------------------------------------------------------------------------
: G+ m+ g! n0 r4 P5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: }" N, m6 X1 p9 n  @) W8 k9 s; Z$ `9 t. C

; c+ g& m7 P( G& G, {/ ]7 k- p; r* O+ [# N这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。) b# q# G; E7 \% G, O6 o5 x! N$ K

8 u0 s! K6 K% ~9 L7 _6 m
3 i2 F8 T1 x+ N8 V$ }4 j4 x  N. e1 A" _

1 V( q" D( r& G+ K8 _5 l1 W! f. d+ T/ P+ W: V( N6 U

: n- T0 X$ n8 S7 Z. T6 d& X# S' C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 04:53 , Processed in 0.131213 second(s), 25 queries .

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