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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

php中命名空间(namespace)的作用和使用

发布者: admin | 发布时间: 2020-7-1 23:13| 查看数: 17180| 评论数: 0|帖子模式

1.命名空间的作用:
- K0 m& `  F- y5 p' G& b) @2 f
. U' g; A7 [6 e2 e$ R2 d8 @在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:' L8 v2 b9 ]( o% N( I
6 x5 O& i+ |; t3 O! y

+ y5 t+ ?. B6 B7 K5 V' X! P3 D7 P$ s5 Z- J" f& T, H- N7 w2 k# T
我们来详细的讲解一下PHP中的命名空间:
& n& I- o& u3 \5 ]+ A$ z; L8 Q. Z# e3 u
8 K4 g) k4 z5 h! N" r4 c- k( j# m语法:namespac_e 空间名\空间名;$ N1 m, _8 ~2 l6 W
5 f( O1 s! ^4 m3 Y: w& w2 a
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:+ y. y0 Q6 U* B4 u

7 f1 G$ B3 N. C8 f3 H3 S( B8 {----------------------------------------------------------------------------
) X5 _9 r$ u- Z. q* e4 ]* w
0 X9 |! e3 \# X& p' O<php
% W! ^+ D; H* Q: q% ?
. w8 @; F' ^7 ~" }! unamespoc_e AA;
$ I, a$ J* i9 V' r' Mfunctio_n showInfo(){
# l# c+ a7 _3 D. G    echo __METHOD__,'<br/>';! o9 T. ^3 k* q! X
}0 h! u  n$ I* R
showinfo();
. I: T8 J, L# B. j' |5 q+ Y7 P. {- ~! A# S
namespoc_e AA\BB;, D3 t1 t# I2 i" n9 j

. w9 D2 R+ a4 `functio_n showInfo(){
4 l' Z2 O, d; \+ I+ n) ]. k    echo __METHOD__,'<br/>';% E) b5 b' T0 H# H2 a; k' g6 ~
}- p( R2 ^4 |& V6 }9 m
//showInfo();
9 z/ W' \3 Y+ \) w/ o- M- O- R----------------------------------------------------------------------------
  }, p3 q& p/ l2 y3 E. Q- ?+ \2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
: _5 a: @, L0 \  M' v. d* \( X0 a
. M- ^, H: ~0 O8 u; U3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
& C1 q4 g6 p2 `; K% I/ S9 l
- o5 O3 w+ ~/ S/ J3 w----------------------------------------------------------------------------% d: W/ ?. p8 n" z0 Y
1 O  G4 M& F+ Y) p
<php
" \' X+ m. D/ \5 J+ H* u2 q5 lnamespoc_e AA\BB;1 G% ]- z: g6 C/ T
functio_n showInfo(){
' s9 k$ k  m" ?- o) C' D) c    echo __METHOD__,'<br/>';& P7 C5 ]1 z; X$ O# H* M7 ~7 U: E
}
9 Z  B$ V4 U/ ]namespoc_e CC;
( Y9 q: L  [' V- ?1 s) k$ Rfunctio_n showInfo(){' s$ u" T/ L- h4 Y
    echo __METHOD__,'<br/>';( E( }6 a" n* L9 Q
}
: C& x7 N' d2 `% anamespoc_e AA;
7 o* h6 m2 _& t" D; v( ^& xfunctio_n showInfo(){2 a1 n( j% Q1 {
    echo __METHOD__,'<br/>';% s5 V3 h1 T& z5 r+ O
}
; V* {9 \1 _6 B# b/ L( k//非限定访问:用于访问当前空间中的成员
0 H. Y) k% R6 ishowInfo();
5 M9 j$ d0 i# }/ `//限定访问:只能访问当前所在的空间的子空间中的成员+ j3 x& `- h2 @: J: T# I. I/ C
BB\showInfo();2 ]  q' p+ H8 v/ e  L
//完全限定:可以访问其它所有的空间的成员/ F% h* I# n0 v+ |7 |
\CC\showInfo();$ {. y# z. j: l8 ^' b; V7 v
↑根空间标识符
6 d7 S4 T! u( P0 w0 T----------------------------------------------------------------------------
0 ^" P4 @0 C% t  ~$ z% J但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
& z6 w, n  M4 c/ H# U$ E  y# |6 L2 y8 j/ n* i: @
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)5 k+ ^9 Y: N3 \) s( j6 J

" J' {9 U9 D- v: o7 i: k- |1 v代码示例如下:8 U  A( X  Y8 G

1 _9 j5 P6 w$ B+ w; \----------------------------------------------------------------------------" y0 P* S" {# N* y, h
( \% B2 j" R; G

0 B* F  X( b! p' o1 Q9 n04inc.php. k- O# ]* k( C9 Z+ ~' m
<php
2 }/ K/ ]/ ]( d" {6 V0 [
/ ~# d5 {% {& g3 Gnamespoc_e Core;( T* p' h$ H! A( Q: ?, }
include '05ou.php';
, V3 Q: _" e, l9 f4 r* Anew \AdminController();
. R6 g* B' _% }' ~showInfo();
5 {6 I8 k1 x9 g) ]. k7 D0 O6 L) }8 P" Y; s
echo P;3 V5 Z* t0 z, r5 Q% p
//根空间中的成员,只要类的访问必须加‘/’
! }) a1 O" b" U% Y( n' l4 v* p----------------------------------------------------------------------------
, r8 M, N' t' W8 |4 m) F- l
5 m$ C% X5 L1 |3 J9 d05ou.php) d& s0 O2 O4 j9 \2 O7 j) S
<php
- j9 }! S. Y8 L( Z2 Q* y- q( H! bconst P=5;
. T: q+ k5 U, O! R; ?& K; I1 j" H* P7 y0 Y8 P% c
functio_n showinfo(){
$ ^1 r% O1 b- }- k2 d    echo __METHOD__,'<br/>';
( }- I7 @3 D  a, |, u" d6 R}
. U3 E8 i7 O' \- R* r- \+ Z( G& f9 x8 X# B
clas_s AdminController{
( b& a8 a+ y. Q4 d    public functio_n __construct(){
2 T5 [+ I: P* o, \+ ^" Q5 D        echo __METHOD__,'<br/>';
3 [" R" f; n- w# G2 N" i, Z    }
, `+ r, j* h6 C+ f}
( q% u) G! s% W* ]# Z! e
4 v. L. B& x3 G第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。" j+ P2 H4 W: E( [6 s5 O
----------------------------------------------------------------------------
9 `# i% L% O8 ~+ [+ @' [$ k04inc.php
7 V7 c1 M, g* I+ d( g+ ?<php
# m+ W/ {1 e" ^" U0 A8 I; ?0 j8 G
( }6 g% p/ Z" \' N6 Vnamespoc_e Core;5 {$ a7 j# U7 M$ d# L
include '05ou.php';
0 B* C9 a+ \: [9 Y" j2 wfunctio_n showinfo(){8 r# M0 }& ]5 K4 Y9 o2 f
    echo __METHOD__,'<br/>';
2 i& _9 d/ ~1 W  o  H& U! d}
4 S2 I$ k& E& }: `* J9 J9 `6 i: [
% B( x# f" d9 w1 L. b7 x* Nnew \Controller\AdminController;% Y0 A$ Y6 P: N* D; I! U
----------------------------------------------------------------------------
' I: X4 `0 F7 ]05ou.php! e$ f# Y, t8 V. P5 ]
<php# i! ~& y4 T4 {! J) b' U9 h4 Y8 O
namespoc_e Controller;
% w( B( [- w" @/ i$ K$ i% ]) x0 [6 X6 r4 l4 Y
clas_s AdminController{
$ E6 x* N7 d3 q4 `6 W2 ~        public functio_n __construct(){
% K5 B* Y, _) D1 \+ Y8 E                echo __METHOD__,'<br/>';
7 u8 U% I3 l: H. `# P/ s    }
8 H% Q% N: u* i( R4 p" D}
9 E% a5 k- N+ G) G3 Z8 ]----------------------------------------------------------------------------8 e/ U9 j7 ~2 ^- f$ l

# V) V3 f& l8 ]1 z4.引入空间成员:
: q8 r- Y# c8 `7 w+ F1 m" g6 D6 N, M. I
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
! }  d  W' P/ v2 v$ R
- W6 D  x6 Z, P  ?8 o' A" }----------------------------------------------------------------------------" _8 o( o8 |  V" j' S2 G
+ n1 Y' T7 m4 w0 H: W1 c; r: m
04inc.php
5 M4 p$ R2 \! Y0 \4 _9 I<php' b: \: q3 G. y, K$ z; R: B
namespoc_e Core;
- q6 j" Q8 m: d6 {0 v0 duse Admin\Controller as con;
; c0 t" G# I7 d8 e" y7 R8 N
  k+ n& S# O" W* T2 Kinclude '05ou.php';
, m6 t5 f* a' m* Q5 S4 t9 S9 M4 h% D* k
! \4 D; t  P3 V4 y. Snew con\AdminController();3 ]9 j. A0 T! l0 R. E, ^% v
----------------------------------------------------------------------------' I, Y  T7 P/ v1 ?5 F
05ou.php; @2 C0 ?: q. y+ b1 S! C. Q
<php9 K2 \0 G; m& ~2 U6 T
namespoc_e Admin\Controller;  r  I5 H: A; |3 D* v

1 u3 {7 _* U% I- @: eclas_s AdminController{
  [  ^& B6 U+ _( g    public functio_n __construct(){0 _" o  V8 R; B6 f0 \& c
        echo __METHOD__,'<br/>';
. y& P; x% J1 Q6 @' m3 x7 e    }
" c/ d! |3 n) P* }( [: l}
/ i  L- [, q( }----------------------------------------------------------------------------
# m3 Y) V+ a1 o2 A$ z  X2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。" D& C$ c- Q: P5 Q
  R% t. z; n6 s7 U
----------------------------------------------------------------------------
& l0 [7 |! N( F: ]* J$ P7 S7 a. |& e& i. t% m- ]! B% m# M
04inc.php2 E4 p1 ^: ]$ Q# Q- Q
<php5 @) \: T" H. l& k3 E5 t, b
//引入空间成员类& N7 X) ^' t+ R; `; ?6 Z8 ~
$ T2 p; c: y0 B, b3 A0 o
namespoc_e Core;/ `# r1 c# _3 e& z) H' h
use Admin\Controller\AdminController;
$ V$ |% s6 a; ]include '05ou.php';+ A7 E$ m! K( z0 n) i

1 x% p- {! O3 v( a4 pnew AdminController();
6 I+ _; |, ?% \( Q$ T. K----------------------------------------------------------------------------
: N' L+ l( s: ?! n3 r2 I05ou.php
- w* C- o$ D: R3 j<php
* b5 h5 H% d* @! y4 Pnamespoc_e Admin\Controller;; B' E& C  d8 S4 h
6 s0 L* _# f' C
clas_s AdminController{$ p. @! a! u* \) v
    public functio_n __construct(){4 H: x. K& d4 \4 X/ P
        echo __METHOD__,'<br/>';: P% n+ x1 N6 A
    }
1 B1 o! X3 ~! ~" t3 {9 o8 d6 z  X. ^}0 \+ G2 f1 s) u, ]7 d0 U
----------------------------------------------------------------------------7 ]0 a. `" f0 Y1 d& m. t# ]9 l/ }. X
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
: s, `/ ]% N4 q6 k" v; L
/ h* p: @6 K6 m
- n* B' S+ m2 v0 A. q这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。) W6 x& M( V1 t; U! a

# A3 `4 J" }0 I4 [9 ]# U
$ A0 A/ x  ^1 m4 b" O: P0 d
! E* D+ K* {- u' B6 d$ N
  q7 _& ]1 a3 _- o# b( F1 e- Z2 K' j. U% G0 x
) n$ u! ~" P  p: D( n

最新评论

GMT+8, 2026-6-19 21:00 , Processed in 0.073519 second(s), 30 queries .

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