cncml手绘网

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

作者: admin    时间: 2020-7-1 23:13
标题: php中命名空间(namespace)的作用和使用
1.命名空间的作用:
5 A+ s2 E9 c0 D5 r% s* s% v. u5 K( l1 {2 J& A' ]% E
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:+ x& }( n$ M' p6 l, g

  D+ k7 F" [7 e) U" _5 y) e7 E
$ G# `; ^) Z' K; S$ K/ K
6 T) H! L+ W4 C' Y7 S4 m0 M5 ]( U我们来详细的讲解一下PHP中的命名空间:4 c# u+ g# u) h

6 v7 w) e! p3 Q语法:namespac_e 空间名\空间名;' p; N# ~! t% Q  v( o
1 v5 d+ d4 k# v- I( k5 G3 n
说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
8 W' K/ r  j, K: a' C( B3 W5 \2 u, m5 C
----------------------------------------------------------------------------
( l. E. v$ U* g; J9 M) k+ N' z9 |/ x2 X2 `
<php! D- C+ a$ r# {, a( \
4 T! L- }  |" v
namespoc_e AA;* p4 o# c- }2 f
functio_n showInfo(){8 S7 c4 J- s$ b: S$ {
    echo __METHOD__,'<br/>';. Z9 k9 y9 ~3 \6 M) u- s4 o
}
7 D9 ~( O( V3 j! d; _showinfo();
& V0 d( a9 ]# J8 T3 U+ E9 A- h2 ]6 W, W/ p) g
namespoc_e AA\BB;( t  g& [5 o: f8 Y+ z$ R
8 [' T2 M: o9 t; U$ u
functio_n showInfo(){
5 Y0 T9 Q1 o/ }7 V- J/ O/ U    echo __METHOD__,'<br/>';% R) h9 \' w* Y9 h' }
}
$ ~7 B# X9 `& ]7 B//showInfo();! P0 I8 Q: v5 \3 O0 Z
----------------------------------------------------------------------------/ n& A0 y& s/ Y! q6 ?3 x, W: {+ k
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
1 E& P; c0 C% \8 p8 F- m" M& t' l. q! _& @
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。/ v% J9 y- g$ b) a( }
# r) u& c% V3 p/ d
----------------------------------------------------------------------------
% J% p: E+ _, N9 Y
$ ?$ D4 }2 u9 _( l! F; _<php
; t: y+ v, E! anamespoc_e AA\BB;, B9 u, N, Q3 b; ~: D  p# l
functio_n showInfo(){
& f; C8 H3 l) o    echo __METHOD__,'<br/>';
% K+ y. ?; G5 r3 Q}& _. w4 s  `0 ]% |  ]7 @5 R2 D; k! n
namespoc_e CC;
/ l- ~5 E: v! I! v0 ?  Nfunctio_n showInfo(){
; K( l9 n0 o( G* l    echo __METHOD__,'<br/>';
3 `' u' |; p& f5 u3 D; y}
2 q/ ?: d$ D6 T3 L: s8 znamespoc_e AA;
+ B$ U% b) V, a  Y- S! K$ F( j  Wfunctio_n showInfo(){
2 b1 K9 W" r  r! o' k& D    echo __METHOD__,'<br/>';
2 @6 K: ]$ E2 d}
7 i  V- ^; r, C: a- c7 c//非限定访问:用于访问当前空间中的成员
6 g# s$ t' [% i3 F% X- K! O$ ~showInfo();+ E2 N& N1 ~, x' U
//限定访问:只能访问当前所在的空间的子空间中的成员# `$ M& q1 d6 ?! H7 e; v
BB\showInfo();; X; X1 b/ H9 _/ l
//完全限定:可以访问其它所有的空间的成员) L# _) w; j2 k) P7 o0 [+ {8 \
\CC\showInfo();
! e" |  e5 v, E2 L↑根空间标识符0 }' U; r: a6 n' f; @1 ?( i
----------------------------------------------------------------------------3 F7 M! O. p: ]3 \
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:8 O; g2 H0 ]& z4 x

" Q) x1 t3 n5 ]* B( Z. g! M4 V当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
& G& O# [0 i4 E% T5 K: b- I
  \( C, C4 X+ V0 j$ |代码示例如下:9 F9 Z) }8 r( y$ f5 |
4 {( m, G  A0 @6 P
----------------------------------------------------------------------------$ l& F8 c, M3 v5 V/ E
7 {# p, [( y4 c' h& E$ X" _8 k( x
: l; V* T, D" e5 V
04inc.php7 G" P: V1 R/ I  g0 n
<php6 ^, H2 ~8 U3 z; G: ?. N) s
2 Q1 n  q3 m8 b+ O
namespoc_e Core;
8 @/ Z, N' I7 O, l: E. U" ~include '05ou.php';
2 ?* o# P; O2 U$ n) m1 K2 ^new \AdminController();1 s  a! G5 u6 H; A7 H  P  M% w
showInfo();3 U+ Y, g) w- F7 ~" Z/ S7 ~- A
& w% i; }, B1 q* C4 G! u& W
echo P;$ R8 J9 j- Y5 W9 Q& O5 [
//根空间中的成员,只要类的访问必须加‘/’' F) z% W% q4 p
----------------------------------------------------------------------------
4 c4 H2 k* v+ ?) j$ \0 ^* r+ |! j  y0 c8 p+ \9 Y
05ou.php
, c8 G* L( F+ b4 R5 x: r% v8 M' a<php
2 ^2 |* }% I. ~+ K+ ~) Y, f9 f$ rconst P=5;
3 d; c) ?# m- X/ Y! C) p  f4 y1 H# M+ G
functio_n showinfo(){% b7 R+ _# S- C* y5 `$ s) O5 z
    echo __METHOD__,'<br/>';
6 q7 c- M/ `9 {4 d; y; q3 \}
* p' r8 U0 t3 D
6 C- I+ c! n1 ^8 M& Q$ Z2 h) ^7 Kclas_s AdminController{9 _" P2 M' Z9 p/ V  F9 L1 T
    public functio_n __construct(){
: {# F+ V$ o% G1 O        echo __METHOD__,'<br/>';# @- r$ o) u" ]' c8 R2 {
    }: w( U% P5 b1 }5 p7 {$ _
}6 K# g& _; ^3 s% R, U! k9 T

7 q9 |, f; M$ h  a8 y0 j2 [第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。' F2 y, s, k6 B& d. _+ ^
----------------------------------------------------------------------------! c+ W& d- {$ G$ J: u
04inc.php2 D5 a2 D) V- b  l6 p3 v
<php: c) ~/ X& n+ S  Q- m

# n$ c+ \8 t1 R: ynamespoc_e Core;1 P) m$ v1 a2 W; Z$ b$ L: ]
include '05ou.php';! f4 u1 W6 e0 U
functio_n showinfo(){. }& H* i: w' C. d1 C
    echo __METHOD__,'<br/>';
8 U5 W! L7 Q. n4 d( l; p& \}0 H* A6 Z- _3 I- d1 R# m. I( K

# l, y7 O8 j  J1 J1 [new \Controller\AdminController;3 `+ K9 z6 z0 P6 j7 L' z0 q
----------------------------------------------------------------------------
. V8 i2 B% @5 ^: L05ou.php
6 i1 b) p6 m) n/ `4 z5 U<php
- f4 M6 k- \+ Q' l8 vnamespoc_e Controller;
' |- }( @2 [, v3 }1 c3 ~) S* l7 }( o
clas_s AdminController{! {7 G) h0 b: M4 F9 e% D* p3 M
        public functio_n __construct(){
: w+ _1 c2 L  m3 @- d                echo __METHOD__,'<br/>';
- d% `% E- j( _9 ]( e% B2 l6 R    }
& I; Z! U6 }- a# K}1 S, i* Y) v( ~( B1 E; j, w1 N% U
----------------------------------------------------------------------------
# o, g3 H2 D* v' L2 t9 R; o' U7 q; K' N* U
4.引入空间成员:: Q2 `& @! j  o  z2 V1 u- s

) A+ J7 |8 w- R+ Y; {% O% u1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。- c" t# x' r( P9 u- N

( L8 ^# \0 M: D+ j& z----------------------------------------------------------------------------
) [/ e5 A3 c* S$ Z( d& A7 e) G6 _6 _: }9 x; |0 M
04inc.php
" v3 h5 H; M" n% d& v<php
; q2 ^+ g1 _2 {namespoc_e Core;
% n0 s% }0 N# wuse Admin\Controller as con;
/ t7 s4 w# ^% {$ k! e# e" {# a& Z# v& F* ]# O6 ?1 M
include '05ou.php';5 H4 A/ ?3 R* i- q' j# L- W

& }1 x3 p; N6 }" ~new con\AdminController();
# C3 R1 P+ z) c# s! k9 e----------------------------------------------------------------------------9 w" E; O/ V/ j, S0 |& Y
05ou.php  N% Z& Z! R6 E
<php
+ j4 S" A) A7 T6 a( a0 n% vnamespoc_e Admin\Controller;
5 K4 }! e7 R- H  s
3 E0 }( T# c% S4 mclas_s AdminController{
. q* O0 \: ?$ I  ~1 y6 u+ w5 N# p    public functio_n __construct(){
# [* D0 @  ?8 J& r        echo __METHOD__,'<br/>';# d" b; z  F1 e6 e1 ]
    }8 j6 {2 N  ], _5 y/ m/ v
}& \2 N/ B- A0 M  O4 D+ u
----------------------------------------------------------------------------8 [$ O; C, d- |5 z6 F
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。* ]4 ^, ^& T8 T) A- [

0 b& i- e- o1 N4 s6 n& p----------------------------------------------------------------------------
7 x6 u: L$ T* t( k- Z
1 Y. f/ U; \& E0 H: |" F; m- Y5 w04inc.php
5 C* \/ B4 V8 U7 N' U: x" e! Y<php2 U2 {0 a, o$ g& [. ?$ z. o$ f7 v4 V& O
//引入空间成员类
$ n6 q7 ]+ c  l6 A4 q5 h9 _6 Y+ z) c5 o+ P8 H
namespoc_e Core;2 j. G+ b3 L6 X  \' z) o4 U
use Admin\Controller\AdminController;
( j5 k( I( U" i6 finclude '05ou.php';
0 Q$ |# w1 Y8 Z& j' Z3 |+ |" u# \5 D. A9 X: N9 X
new AdminController();/ G: o* F1 o" B  o# U, _
----------------------------------------------------------------------------/ Y6 M7 a, t& L3 [' J* b; I9 }# X
05ou.php
3 e" D$ [/ f4 c7 {% M<php$ h; F% S' t7 W6 P3 A5 a* F
namespoc_e Admin\Controller;1 G. U( H# p( s7 W. l! W

) J, x, W& l, w/ ]! g$ j  uclas_s AdminController{; f$ Q4 b4 |/ ~4 j! T& {# l
    public functio_n __construct(){
/ ]1 ], t" Z8 U" B' u        echo __METHOD__,'<br/>';0 L/ j8 z/ R) V" e; @
    }9 w( V! w. }9 c5 A: \
}
1 K& ]- |( f% Y( }. L, t----------------------------------------------------------------------------4 ?- K; s$ a$ W! [$ O+ k
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
4 E( [" r- ?4 N5 a9 Q) F3 ]3 w# f
, b" g! |8 ~9 Q4 Q& R5 t
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。; p9 G+ k* A# z  [3 d. t8 w& p
& z* i3 Z3 N/ T) j& S
$ f1 G5 j) J" ^7 }4 C3 x( \  A
6 g" \2 D0 Q  U

& g6 Z/ ]1 D/ P) i; V
/ {- l- ^4 I  K: O/ }0 r/ q
1 P; M: S& r" P8 ~: |




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