cncml手绘网

标题: php中命名空间(namespace)的作用和使用 [打印本页]

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
0 B* Z$ e5 _/ }( o7 I: s
# ~7 b" H# S7 J  Z8 V) z- U  j) \在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:! _: @6 @) N+ d/ P" e

3 E% r+ f$ g1 R& u1 H* X
' w3 g% C4 @; E9 ]
' E) _! W* k, p" r9 ]+ Y# N' v我们来详细的讲解一下PHP中的命名空间:& A6 L. y# L( ?

# P% I9 h5 Z) J' E! B& ~语法:namespac_e 空间名\空间名;9 q8 {* R! D! i% N
7 ~: J8 L  e: E4 t) v
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
, \; z$ S0 {, t3 H) d6 h0 c6 `. O
----------------------------------------------------------------------------- v; A. K$ ?' S& a
# W9 \4 x; W/ _  x( n; c" v
<php2 B9 q. |) M. Y6 {& o* M
! x% n6 h5 [2 R, I
namespoc_e AA;/ {+ ~; U9 x# S2 h( g  B6 {) V% |
functio_n showInfo(){
; z) g  x4 m4 ?  L- {    echo __METHOD__,'<br/>';  F' E, H1 L2 l/ P$ N4 i' S7 q" w
}
  P% g! M1 t7 Z8 _showinfo();
+ M$ u. Y" }, ~, K0 i
: _( @6 v/ ]# G$ R- Hnamespoc_e AA\BB;2 S$ l/ P% A& s+ |4 U

4 y0 _( D5 w. S1 R& ]! d4 ofunctio_n showInfo(){# Q* t! i! ]8 J' O9 C
    echo __METHOD__,'<br/>';
2 O! |# H7 H3 S7 p; C; j}
% x1 C1 |+ u- D0 O! f' A  b//showInfo();  H9 L3 I  g- w2 T8 ?
----------------------------------------------------------------------------# ?. [. S# ]" S5 H3 S1 G& d
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
3 j3 Q+ B5 ~# G) }0 n6 {. i: _0 `* A' `
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。+ W- F% U8 l* t& z  p$ |- a: d

4 |$ |- h+ m7 J0 N5 ^+ `! w+ Q----------------------------------------------------------------------------
3 a0 B/ h' O: P
) _4 i  N( n9 H7 ?5 m1 @1 Z4 L) l<php
# n( `' g, w  J9 a$ S6 A5 ~1 C* onamespoc_e AA\BB;/ O6 I) `) f3 L0 s# V# Y
functio_n showInfo(){  F4 q2 h; ~  v) e& ?7 \
    echo __METHOD__,'<br/>';
: [' _: Q3 ]6 W: j. U}9 H! z7 T( k7 g0 ~' @
namespoc_e CC;& b# K' w  D3 k! T& f
functio_n showInfo(){
1 L6 t8 \" j: b) n    echo __METHOD__,'<br/>';) z2 b4 u# }9 f- H% C, G6 o2 p
}7 S% d+ w% I8 r7 m, t2 f
namespoc_e AA;, J; Q7 n, e% i. a* \) j$ _
functio_n showInfo(){: u) x5 E7 u$ [$ Y& u+ t3 z
    echo __METHOD__,'<br/>';
7 M2 M1 u7 \* c. R1 V( e& V}5 q5 Y6 G- }+ T5 Z- s/ M
//非限定访问:用于访问当前空间中的成员
& g% @8 T/ o4 C0 S- f. l8 eshowInfo();
/ ]1 h5 @0 @" ?" X3 X$ A//限定访问:只能访问当前所在的空间的子空间中的成员1 M; e5 v5 B9 I7 Z/ \
BB\showInfo();/ G% h, ~' G+ O9 e3 T
//完全限定:可以访问其它所有的空间的成员2 ^& l  x) E. N  d# I" W
\CC\showInfo();
. _8 a2 ~* S5 [3 q↑根空间标识符
" ]3 z2 A4 K1 `( h! m6 b7 _----------------------------------------------------------------------------6 E% |5 _7 D+ Q: V
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:9 R. t7 u* C$ y4 P+ x+ K, P" l9 v

4 E2 W. Z1 i$ E% l当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)6 A+ b% g5 _% b* d+ w6 `! h

  ^/ w4 H/ `8 [  z3 l: w代码示例如下:" L4 U- e  v/ v

$ m2 Z8 P- I% O/ K) a----------------------------------------------------------------------------
: u/ ~# t) U. I; A# V* ^$ n" \6 v, q, Y+ @& L! S

( m8 i! @1 V, Q! f7 h3 F04inc.php  v! n- ]- \3 c/ E2 T0 z
<php/ H" [8 x/ y) d
: o/ X$ l$ X' X3 o! B
namespoc_e Core;" Q' g# m0 x  @! _
include '05ou.php';
4 ~) R* F& C$ P2 ]5 ^2 }new \AdminController();. j: j" T/ Q. N& [* m
showInfo();  x  q7 t; b) J! I; ]
3 l( p$ Z. ?# e0 \
echo P;
& O' G$ b' \4 J7 `//根空间中的成员,只要类的访问必须加‘/’! l8 @: H' V. j2 e, C
----------------------------------------------------------------------------  k; p! ~7 A1 c/ m1 ^1 l
7 G0 }& c. p6 [  a
05ou.php0 a2 @* u, Y& {$ F3 `4 k$ L# I: K+ e
<php
6 }( N! \7 d$ H* {. {5 C6 e0 `9 b: Uconst P=5;$ |! I: ~" L  ^
( d  V( x9 T, R8 f; O# j
functio_n showinfo(){" Q. V& _# K0 y5 s6 O2 ~" x% p3 K
    echo __METHOD__,'<br/>';
* {) a2 m0 O: M3 w6 r* L9 d}7 e; X0 J9 H3 U3 D& j( W1 U& K

" r& D1 Y8 b5 G7 _+ n7 O& P5 V* Vclas_s AdminController{. |( t9 t" Z* q, Z) f! {& U# ^, e+ ?
    public functio_n __construct(){5 s2 S+ k$ f; L! [: a5 }5 j
        echo __METHOD__,'<br/>';
% o0 }% @8 S# Q; I) o. ~" r    }
- b: f" |. B/ \$ g- U* Q) ~. g6 d! t8 A}
  L6 t5 b6 F. S8 X3 n3 L3 `; `* Y" ^0 w. _. H; n  N
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。+ p0 O" d  w+ x- A
----------------------------------------------------------------------------( |  V) W  o7 _: V
04inc.php
5 }5 Y0 E/ G" B, C$ |* M" m0 x9 P9 \<php! e) a2 {8 g( r. f

& b4 r3 b2 r: W. n- Enamespoc_e Core;, C8 p% K2 f" p
include '05ou.php';' L, e) R- d6 a
functio_n showinfo(){
4 }3 }1 _( O7 Q% Q3 Y6 O' j4 ]    echo __METHOD__,'<br/>';/ y+ M; L2 s! ?7 i9 P- W
}/ r4 T0 ^: R& H2 [' w- S
* x# G' ]' C5 ~
new \Controller\AdminController;% s) e. u2 o; W
----------------------------------------------------------------------------
) v% J, F9 o" G05ou.php/ i. F9 L% @) n  Z) A+ R& |
<php: R+ j; K9 r3 P* P# C: l
namespoc_e Controller;5 f9 q  O. |! b$ G* T1 a
. I6 Q* v5 m2 R
clas_s AdminController{
4 ?, G+ X) \  |        public functio_n __construct(){+ R. @! O% J! a. ~/ K  g
                echo __METHOD__,'<br/>';
" I" A* {+ R* @1 L    }$ w/ l% x; i# ?/ k' _
}
( l" m# E% _* T( s- _----------------------------------------------------------------------------# x* d1 n3 O, d6 g

! o: {) P( {' A' E0 T4.引入空间成员:4 U7 U5 E2 z% r: O' t. ]
5 c3 J% ~3 j8 g( d. {7 Z9 m
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。5 E, \& I* K% U
6 L/ m. s6 L0 b
----------------------------------------------------------------------------4 F# d, f0 C" U
- c3 w2 o' m0 l, K3 |
04inc.php
$ m  L8 n* L! M9 @, ]( L. ~<php4 c" I- Z' i$ A8 v1 s
namespoc_e Core;
% y! i- g7 Y* x; i5 U! J8 muse Admin\Controller as con;, g9 x; g1 i& y# r2 D; N0 r
4 k; F$ }, K3 M$ ]! M3 @+ u
include '05ou.php';
1 N0 J" h7 b* ^; g" m/ B- _
4 M, M6 E& M8 V$ p3 L1 W* z/ m& Fnew con\AdminController();8 d- l% M5 A6 E; A6 u) e2 M
----------------------------------------------------------------------------
5 a8 E. `1 @! n05ou.php  K$ J6 J+ _' z! h# G  G
<php' O5 _0 [* Q& M8 g
namespoc_e Admin\Controller;
& l0 L" B4 i5 g
# b8 ], k& [7 ]6 Kclas_s AdminController{& g; Z$ x; m/ F
    public functio_n __construct(){  k* k; i  Y. j, A' y, r
        echo __METHOD__,'<br/>';) l7 ~! D: z/ T0 p& _+ U; Y1 m
    }: L& P: @$ l) s0 W' x( t; V
}  W/ K. S+ m2 A" c
----------------------------------------------------------------------------! Z6 V' i# Y  D- p% N- f* t
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
$ t: \. x- ~, @% }1 v3 X% J& ~  u5 X* s1 m* A1 {
----------------------------------------------------------------------------
- e; J5 y( q, m8 H& T  w- \8 m) u3 E0 r" |4 O
04inc.php( k+ P* y' @; o  B
<php7 b$ V( T7 g) s  N$ W2 U0 d
//引入空间成员类
/ C* |! A$ d5 r
- H( S3 S4 {5 S8 B# X- @namespoc_e Core;6 _0 l+ _* |+ w/ v$ |7 q
use Admin\Controller\AdminController;5 A9 B+ F! x+ _- u  t9 z- M2 w" L
include '05ou.php';
* Q9 G# A9 R* C; j: v6 X! \0 Q$ c! |! a
new AdminController();% D; @  }$ b/ t& n9 U
----------------------------------------------------------------------------
) ^5 h, {4 E- S; G0 W05ou.php
( b* [! q& o9 r<php
0 a9 f8 n! d) B! nnamespoc_e Admin\Controller;
5 K$ m  {( t9 w9 f8 h0 {  v) x* R6 P
" u& L' y* j% W2 {: f* U! bclas_s AdminController{. ?8 _6 g. X4 v: P
    public functio_n __construct(){
; }0 R5 T$ {+ F, H. z& X1 o        echo __METHOD__,'<br/>';
) a* f# @$ d! j5 d3 B& w6 j9 T    }2 N* {$ C9 w& [, o. H
}# H: m) @2 z7 U$ H9 @
----------------------------------------------------------------------------: Y: g7 q( d, K- G
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。! B2 M' d; l" J% X( n: R
& x; U6 v& J/ X' m

" ~5 y7 r( t7 D* f8 b' v: G这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。- S0 t1 g9 K: m# c/ M
: c* L) T1 X& f) F) M; U
' a5 \, m* E! V- v0 P

! ?, F6 C! Z( P6 l' m! @) j" a2 \; b% m: ~! I

" P% {. s0 x# n0 ~  z! ?/ W
4 n& v  S$ s/ F. h




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2