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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:9 w( `9 o# S; s. Q& ^* T, m* b

7 f; B+ f1 L6 J) U# ~; l在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:& c- x5 N$ X& i
( s3 ?( f: Z0 B6 W
/ ]) f5 ^" i$ _, N# Q  A9 [

, ?- t( N. x* F7 y  ~我们来详细的讲解一下PHP中的命名空间:; C: H6 M, E: F) Z- i
  f$ `5 d1 q6 x* w
语法:namespac_e 空间名\空间名;
% @1 V- [- c9 U" v! _. f
& R3 _2 A; `* l说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:2 h" N6 b0 A  X* l9 B# F& y

8 \1 L' G8 ]) D$ ^8 B2 T----------------------------------------------------------------------------, p: g1 R& p7 S: s. o

1 u3 j, S  V6 C# H2 N- F<php, M: ]  x7 A- f* b* I4 H
, [; G5 V+ B; g: a; W/ J5 G
namespoc_e AA;" w: ?& [$ o( [) ^- _4 [$ V9 R
functio_n showInfo(){6 I' v! T' u: O+ L, T
    echo __METHOD__,'<br/>';
* h$ }* i& w. ^. l4 w+ X' f' P# q}" ?+ U4 z# A$ q  E8 Z% x0 j, Z
showinfo();/ s' j+ g0 k% C) a8 T
: [) @( t' A. L: {8 H
namespoc_e AA\BB;2 Z: H1 ]* A& M+ R. z
2 o9 L* V$ h  s( }/ m
functio_n showInfo(){
& @5 _/ Q& U6 |4 s0 K* x$ X    echo __METHOD__,'<br/>';
+ ?6 ?0 X9 A. ]/ _}8 y- t- \, N" I% ^
//showInfo();
5 [& C3 i7 e1 q----------------------------------------------------------------------------: Q( r* N/ E( Y7 j% X5 W
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
, a, Q8 c. a# S7 b: l
( q# J8 C( ]$ `( s4 g6 A3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
) n8 Q0 z5 q: C6 k; \  w9 r5 m) h0 V0 S
----------------------------------------------------------------------------
" [# R" d  e! C. \- O( ]
; D8 R8 j% S8 k, R0 {<php
( X6 b7 [( d" L& enamespoc_e AA\BB;
0 T7 l$ T0 K! Y, u, n, dfunctio_n showInfo(){
. Q2 E7 i% b+ Q; Y    echo __METHOD__,'<br/>';: ^$ n4 \5 B" {
}  Q3 M: ]# t+ u$ l# b5 }
namespoc_e CC;& n4 f& W( c; Z' G
functio_n showInfo(){
. ]+ p" m, r" S6 n    echo __METHOD__,'<br/>';
1 Y6 c/ H, D7 z; D}- }9 n" q+ F* j% S- A3 c& c
namespoc_e AA;
3 ]" I# }2 `/ Mfunctio_n showInfo(){
7 X% g! |" L4 {    echo __METHOD__,'<br/>';0 s7 h: F& I- L+ s2 Y- q+ e) f
}
3 F& w' P. @. d1 X, r# I//非限定访问:用于访问当前空间中的成员
( w9 }% d8 Z7 G) M. A9 hshowInfo();
  q! T) ^5 e, s6 K//限定访问:只能访问当前所在的空间的子空间中的成员
; y+ c& M5 l* Y  k2 y+ b, VBB\showInfo();
5 t0 c" N# e2 q- E6 i! k//完全限定:可以访问其它所有的空间的成员3 W' z/ }1 ~/ L/ z0 e  Q! E
\CC\showInfo();) J2 S3 A8 ]+ Z5 h5 ~
↑根空间标识符
; |! s  ]1 Y- E7 J$ d$ }. ?----------------------------------------------------------------------------0 y; T* M" Z! Q9 @* }4 s$ ]: m
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
* ]- |3 N$ ]  _3 [! y2 G1 E) n* |0 Y7 E+ [  Q6 f+ O
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
, H4 K. w$ j6 Y# h' a$ ^5 g
! G& e5 D8 }% ^4 F0 v代码示例如下:( U/ E0 W' f, n# q

1 d" V9 j' c4 X- r* u----------------------------------------------------------------------------/ J1 m8 w$ @0 @
  u2 n  y$ y; U7 e3 G1 u
" r* e  b" J! q' B
04inc.php
! b3 {( c4 I* [4 X/ ~- L6 f<php! \/ n4 W9 l+ R9 w) j; \
$ q2 c" O7 u9 v" w" i! K
namespoc_e Core;1 z! N- Y( p4 H0 X
include '05ou.php';% Y9 ~3 b4 L  e0 G
new \AdminController();
7 g/ t6 o, w, x+ a- c" k' fshowInfo();
1 ~4 Y3 Z; B/ ?. [- P2 j& L' b6 v
% c2 P; d' z) @6 G' u6 Wecho P;; o5 ~% V3 m7 F8 }
//根空间中的成员,只要类的访问必须加‘/’
1 H3 E1 f  N. z' m----------------------------------------------------------------------------. s( f2 O! F" h4 `
1 H& f! ]+ A+ O0 b# X/ B
05ou.php! p, U# J0 I9 O  a
<php9 W. J5 [5 D4 Q( w
const P=5;
9 _1 x7 q, L) o" t" ]0 X: T
9 }, O8 T+ o7 g: afunctio_n showinfo(){) Q5 V! R8 E. A5 m  m
    echo __METHOD__,'<br/>';9 O( W5 [3 \2 Y& j; S  U  T. C
}: c2 t$ y/ t9 Z2 \0 q6 }- X* d

) M4 S; g1 ]5 Q6 M8 v) P' g( j0 G" Tclas_s AdminController{
' p" |1 J' _0 h& q" O    public functio_n __construct(){
) Z  N- X2 H- ?- p9 V4 a' _( c        echo __METHOD__,'<br/>';! n* C$ B0 g2 Q" K" g2 U0 k  O) L
    }
- P' z/ i, m3 X* L: H}
# B+ Z" g. c% d  R8 J, |) s1 I2 G- X7 O9 }" p% w: S# ?
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。4 E1 E4 c$ w) R0 z5 V4 C$ E& f; N
----------------------------------------------------------------------------8 N1 `# l6 n& U5 E, G$ P6 c$ B' o- n
04inc.php
7 p3 `+ c, ?2 j0 Z7 _( P1 I<php
$ R1 B: }, ~0 c) k* Y" V7 y
) q0 @5 [% E; R9 y: o) l& Dnamespoc_e Core;6 _* U7 {* t1 F! ?1 q
include '05ou.php';
) j$ W4 X. f4 ?7 ?$ t5 \% _functio_n showinfo(){+ u# i1 M0 m* G/ s3 J+ P6 ]
    echo __METHOD__,'<br/>';
/ W0 ]1 L( ?& e( A! T! P}
5 C- t" M0 `) y* O4 e( f2 A6 V0 g$ S; X
new \Controller\AdminController;( k& S) T. D+ j/ Z; }( [' o
----------------------------------------------------------------------------
  c# A  A# Q7 p( Y" ^05ou.php
7 h& ~# p# r& p' `1 d1 q<php3 [6 q) t" q- e: H0 n4 [- E
namespoc_e Controller;
1 P, t7 n& @/ K" k- U' z8 e/ j- m8 ^1 x' a( A% m8 _
clas_s AdminController{
. A) y! g2 r9 G/ D# Y) B# k        public functio_n __construct(){
/ W8 W' n& T" ^# x! n                echo __METHOD__,'<br/>';
; Z* A8 M: I1 O9 D    }
4 L! S% S) I. o+ t}
6 _) E; R7 c) v! c- c& s----------------------------------------------------------------------------% S! b5 {. \& X& U1 @

; t8 e- e7 {( y9 l. ]4.引入空间成员:4 v+ o  y3 b, ?* ~+ t# k5 e$ ]- i) V

- R7 T! T9 t1 E( o' w: |' D" Z1 y: O1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
2 m$ j; [9 m# T4 X0 |( T7 A4 f& t: W( ^  G( a$ F# u/ I! P
----------------------------------------------------------------------------
2 Y; R- |) H8 v0 i
5 T: }- Y: w4 k0 A5 d, C* o04inc.php4 o4 j, s* ]8 Z+ e  p( s, z
<php( v$ y$ a. j6 [$ O
namespoc_e Core;
8 O1 |0 S0 J4 I  v& B- }% Cuse Admin\Controller as con;4 D! I; b  O5 E6 X; m4 I) C( \+ ]

! \4 v$ ?9 s' j  U# D% x+ t1 Sinclude '05ou.php';# j) Z1 G$ \2 q: y

" R0 d, t% x4 ?3 Q9 Mnew con\AdminController();; c. [4 O7 D* g6 n" {) F
----------------------------------------------------------------------------
" q% g4 d4 @3 W( v1 `05ou.php' L: h& h. H$ [: _4 s9 D) G& `: S) C
<php
% |% b/ p) p  N/ s0 wnamespoc_e Admin\Controller;; ?1 u4 ~% Z" d; r* Z0 m! Y1 B

, L- G' b( s0 a) L8 Mclas_s AdminController{3 H2 ]7 x6 p4 W3 |$ U  H3 M
    public functio_n __construct(){8 ]2 d+ g( U- g5 _7 q5 E  Z/ a+ D
        echo __METHOD__,'<br/>';
+ ?, i2 x; L9 x" m6 k    }
8 R: q! v: d2 F- E( C9 E0 i}5 G! W" O! H  H( p/ J3 V. Y' V' ~( M
----------------------------------------------------------------------------0 O- X; k+ ~- q( H3 r) v! R
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。" S: w2 t; b. S2 q
5 Z9 ~+ ?7 ~% m2 Q
----------------------------------------------------------------------------. B  w2 }( {5 C1 M

% W' B, [- {# V: \( M+ o$ H. u04inc.php
9 K5 W  E; `; }1 \, _, y  i<php
0 e, l( o- h5 O4 _3 E, q- _+ R//引入空间成员类
9 _- l' w) S: D4 T* l9 U% A% U+ h4 b; _" f1 g6 R
namespoc_e Core;
! k9 [/ e1 _- X7 O! Euse Admin\Controller\AdminController;/ G" A* K7 Y. T
include '05ou.php';1 P( e% h0 ^% C5 V+ B2 E

6 J  O$ ^9 L- @6 d4 Anew AdminController();
7 Z4 E; Q3 r/ p7 S  |----------------------------------------------------------------------------. ?0 Y- x) \/ H! C5 d9 o
05ou.php# A) l; M6 ^# D( c0 t5 [
<php, q; }$ q/ q9 J  D) C
namespoc_e Admin\Controller;' {- c0 r8 ?1 h! i5 Z9 g

: }- X$ i8 v3 b3 T. Y. G4 Cclas_s AdminController{0 e; y! o$ q* {4 e: t/ k
    public functio_n __construct(){
( N9 b" j% x( Q; ~        echo __METHOD__,'<br/>';
8 e' M  R2 m& b. M' R+ S    }8 U! i- ]3 k! q0 e
}
1 t0 C4 a. \/ I% R+ C----------------------------------------------------------------------------
1 b: T/ \' _8 E7 n6 q& g5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
5 G. o) Y' j% j6 B  e1 ^8 E# C4 i3 }9 \! p* U8 {& t* [: s
( P  ^7 ?$ P. Y, N" G, k1 s
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。- l' }1 x2 L" W7 C+ n, o* C9 E

$ [/ R( J9 h- u
9 V! j) N0 p5 H/ p3 [
- B' h, I+ h; U5 Y  Z3 \
2 @6 ]: F9 _# ?6 B" l) S: D2 i- B8 Y, r. V+ X( X
, {; m$ _+ Q/ e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-3 16:15 , Processed in 0.124260 second(s), 24 queries .

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