cncml手绘网

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

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:2 f) h2 o1 W( ^3 `$ \& C
, d6 A, h5 g8 w  H( u6 \! X$ _
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
/ O' t% j8 ^' F( u$ B5 t( B4 X. F1 S. _

+ E  g$ T8 H0 b4 f+ V- ^. M3 k
/ p7 T8 i( P- }1 p8 P+ Q我们来详细的讲解一下PHP中的命名空间:
/ f9 n- a- V; e' `" Z  X( A0 T% H  A& _1 G# |
语法:namespac_e 空间名\空间名;
2 {: c& v5 W* L6 {" \8 ]$ T: ^. r: _
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
- @# A. ~5 U# I' T" g% Y
: q! ]6 e+ D2 t* R* M5 l+ t: f----------------------------------------------------------------------------( w' w% N: ]: |5 t# H

# ~# C! B! K$ J( [9 t8 _<php
; }1 c% I  p! Q, A5 Q& {9 e4 N2 j& q
namespoc_e AA;$ d  _1 _5 c7 l$ L0 l8 U
functio_n showInfo(){
5 Y- [5 ]4 I+ g    echo __METHOD__,'<br/>';
9 ?; w1 W( l8 N; @, T" K1 E}
: y* F. X  |, V: U) Qshowinfo();
! E  ~' J$ ~  s
6 c7 i4 |  v% T5 Y2 y' q4 knamespoc_e AA\BB;6 w: x4 w, y" `& t  k/ Q8 ]; P
6 T! W3 m* d  O% f1 C& Y, {
functio_n showInfo(){
5 t/ ?7 U  V! }  N6 P: ^' ^    echo __METHOD__,'<br/>';' _- L1 s, A; d8 K! \0 q! }8 [6 R
}
9 C: }3 V5 u! V& P//showInfo();, e  R3 o  W0 [2 c
----------------------------------------------------------------------------/ R0 t# _5 `  s; d: o
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)8 i$ i; v, X9 y, b
' O$ a  ~* k7 C4 }
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
( k$ c3 }$ M6 W: G
6 S3 o* C% J9 d9 i8 V9 g----------------------------------------------------------------------------! n/ y5 E3 L. o: z/ ?3 F

, k9 a! ?; {7 ?% F. ]: L+ _<php7 Z, a& d( x& l! D6 R+ B
namespoc_e AA\BB;
7 ~; [. H8 T2 [$ |) ^5 pfunctio_n showInfo(){
/ z* u. i" s) i8 d. r* ^    echo __METHOD__,'<br/>';
& }; J# [& P5 Y/ f5 J' \}8 H( ]# l" b& t* r4 T$ m
namespoc_e CC;1 x) P2 @8 p: f: ]
functio_n showInfo(){
6 N+ Z1 q$ z3 b6 U3 {    echo __METHOD__,'<br/>';1 A$ O2 h1 |" _7 d3 z! J
}
& [$ [- }3 o  ?0 anamespoc_e AA;
! r0 n: J* S! N5 f: Lfunctio_n showInfo(){
& P. f  ?' M8 t" e    echo __METHOD__,'<br/>';% c9 q5 V- V, i
}
( v! g* m! {7 b6 c/ X: ?5 B" r//非限定访问:用于访问当前空间中的成员
( `% Y$ _$ H/ ^8 q) B) cshowInfo();4 d8 ^+ d6 o) c' }
//限定访问:只能访问当前所在的空间的子空间中的成员
5 M+ ~) R  A4 Y. S8 H4 iBB\showInfo();
# |9 l& h! e6 N3 _) i4 g" E, C: c0 I& ]//完全限定:可以访问其它所有的空间的成员4 u2 m; o& @6 t# A- F0 ]
\CC\showInfo();$ x- y: D) t2 A9 Q. v' K
↑根空间标识符5 Z1 e) j( \" C8 G
----------------------------------------------------------------------------
3 p/ p. a' y4 ~2 M; L6 z8 ]但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:  L5 D; b5 w: J& e& T. [

  s- y! K, w) U1 ?1 T" q- W当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ s1 T- J, a( b5 E
* x7 p7 r) [1 V4 r
代码示例如下:0 I3 x5 g. W" u$ K
( ?5 B, p7 \3 \- f
----------------------------------------------------------------------------! |1 O. K, |+ O+ d
/ {; c+ o7 a$ Z' O5 o4 S# H- Z3 s

. V# c+ Y- g+ S04inc.php
4 T5 H- a  t! p2 D* V7 R0 p<php
2 a# {- ^( z5 ^# [0 u/ T
9 w# k7 \/ r) r2 j) E: K1 D7 nnamespoc_e Core;* d  J' M) R) e5 K$ f- G; B: r
include '05ou.php';# W4 p) [0 n# O
new \AdminController();
5 e' M" X$ Q* k) T! V( h& nshowInfo();
  N8 v* n- B0 u1 I! o5 M
8 d- \1 q% P2 uecho P;* O- g5 @6 B) n' z7 L
//根空间中的成员,只要类的访问必须加‘/’9 B" e8 [2 _; k; D" `$ Q
----------------------------------------------------------------------------. h8 X8 P# W2 c( ^8 T) |

2 h8 ~6 U6 m, v2 ?+ k05ou.php
' ^, ?7 f) L+ F9 X: @+ M<php
  r( s3 S! c/ y; wconst P=5;
( h5 s, n  H" I3 \  S7 G
& R! x- A6 G6 K- ]. Q, O" wfunctio_n showinfo(){# R' r0 l4 l- w$ z/ p& w- K
    echo __METHOD__,'<br/>';1 {- l! B$ S) v" U
}
$ l5 D+ F, @" z! @$ v, C% y. X  U2 G6 n5 H7 c
clas_s AdminController{
0 u( C: c+ \. w9 H    public functio_n __construct(){' d" [4 j8 r4 [3 B+ x8 z  w( q% J
        echo __METHOD__,'<br/>';- D$ ?: n, c9 E4 B9 g
    }
5 ^3 }! F% e7 F& k0 U}
: K& }% Z/ n2 r9 W( q& X
9 j( y& l4 v2 [- x  h第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。: H: x8 B* e' I7 ~) Q8 W
----------------------------------------------------------------------------
7 L9 ~/ w& h6 _( r/ d5 v04inc.php
" N8 m! S# ]% N1 V6 u/ L. H<php
8 J7 i5 p- o5 N; S3 `0 ~3 c# g# V% ~* _+ B4 i+ u0 D
namespoc_e Core;
, X' p3 ?9 F9 q+ W0 Tinclude '05ou.php';; ?0 S! z4 x0 k/ n! r4 U8 o
functio_n showinfo(){
1 u/ i4 v" \: _: V    echo __METHOD__,'<br/>';8 i$ O/ P0 M$ c4 I% e- A' S9 O" H
}
% h; L: W- `# `& h5 f) p& W5 ], F: V) y; p9 z
new \Controller\AdminController;7 J4 }: j7 M. ^6 X
----------------------------------------------------------------------------
! u. {4 P; N2 E! c, Z05ou.php
- L5 N: Z+ r+ G( a) \7 U' H<php
" d" u" c! c- [8 K9 m% D( J4 qnamespoc_e Controller;. H4 K0 V8 r5 L5 {" [% H
2 p  R' v# v& e  w$ R7 V
clas_s AdminController{+ J  f4 G' v4 H  H
        public functio_n __construct(){  r# }7 m$ T" `( }
                echo __METHOD__,'<br/>';
1 \* k; t2 Z- P    }& t% L# m- i  s, G+ x9 x4 r
}
( H. Q' y* v' u* `& u/ I8 ^5 ]----------------------------------------------------------------------------" C, h; K. d+ J" _2 h3 |# |' r- R

5 d( e$ d1 }( C0 J$ h5 g4.引入空间成员:
! d& e! x: t& c. C( c) l# ]* f' S: U/ |% m/ P3 V: g5 L! v
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。% W% ~) d# Y& \4 m- q9 h
$ i" M! z  R/ l8 G
----------------------------------------------------------------------------- m  W$ j6 C7 W/ i
! Q$ g. L! t- Z7 f7 B! E0 D+ p! [
04inc.php
+ A( ?/ X- H" F' }+ _4 C<php* |' f% L' p" q
namespoc_e Core;# H$ v% `9 E5 v/ r; N
use Admin\Controller as con;
6 j7 H0 m9 h& G8 p% e' v* h" f1 Y% G4 P$ Q- E& p! z
include '05ou.php';
7 F  ?( j% }: a! s  H, N: A* @, h8 I- m, K3 p8 _. v! r
new con\AdminController();
4 A7 `9 a. |$ n+ N3 R----------------------------------------------------------------------------
% K. t3 W$ u* U+ M05ou.php
$ w- A1 W9 U4 P! b) y# U<php
6 }0 g$ }- h! r8 W8 x, Fnamespoc_e Admin\Controller;
1 w& x  `' u/ Y' Q: O0 }( ^0 V/ k2 x8 \7 h& U3 T% u9 c
clas_s AdminController{4 U1 u( ~1 i% \0 F, M
    public functio_n __construct(){
1 N/ @, z% ]8 x        echo __METHOD__,'<br/>';: k( N! H7 I3 l5 }  R
    }
+ v) A. j0 m" ]6 k8 x! \}
. t& j9 {5 g5 f, {----------------------------------------------------------------------------
5 x9 `2 p/ O9 R( T2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
9 D; k. E% o' o4 \  i- F% W$ Z  y9 T7 C" I2 S
----------------------------------------------------------------------------. j8 o! R% V8 ]8 u8 y3 q

) \& m3 X, i8 x04inc.php: |2 m; S& k  ^& N
<php# ?' f0 p( B  r, k- _% Q- K; J
//引入空间成员类6 D$ H% L1 O. F/ u2 i3 \6 @

' u" H# p3 o: Z0 z. {8 ^% j( f- ^namespoc_e Core;
% N" W3 h4 e5 E5 Uuse Admin\Controller\AdminController;2 ]- R5 M- z& |6 s' Y" J
include '05ou.php';: q# S, q9 x0 n3 X
0 l9 K* _. m9 ~+ M4 u' u% j$ S5 x
new AdminController();
( R  j  M4 T! `5 |. s4 j2 p0 r3 e----------------------------------------------------------------------------+ B  o& h6 U  m2 X$ p( Y
05ou.php0 }/ i7 q) M: l4 Y/ H
<php& ^8 j, R1 B/ I) X; w9 D4 Y
namespoc_e Admin\Controller;% @; A( S% \3 x4 L4 ^$ M* B

$ A! ^0 }# X3 f9 ^' o" [% eclas_s AdminController{( i4 `7 D% g( d- W
    public functio_n __construct(){* M) i' D( n0 p+ L% ]( i: y3 o
        echo __METHOD__,'<br/>';
* R0 z5 G# g% C1 H8 o) J    }
) ~' M' p$ h& h" m4 V$ k$ x7 ^! z}
0 o" J$ m& G; ^" z: r/ s----------------------------------------------------------------------------* Q& u+ t8 T! w" p2 J
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。9 P' a/ p$ P3 e& J
/ u4 a* G4 d  _  ]" P
0 z7 {! `) I4 ?
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。
% s/ \3 ~( c+ P! c' b7 X( B2 q0 J+ U0 J$ Y
9 z3 \, @9 k8 S) S' `
" i5 ^9 }& O4 E* _3 M7 U5 b
( G: N. m  i- B. q7 {- P3 w$ {; b
. U6 E5 `- n; u/ N. }9 Y( g. D7 N
9 j' Y/ [4 t0 F





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