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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:6 w/ G  Q& z1 @8 J
% T3 I- H% l( L- z6 A" A' }
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
* N4 Y% x8 [" H% D2 l* x' N1 L. _9 I! u* H; b- Y( X- b4 Y- u5 ^

. s# [1 W6 U6 y
* |  l( Z7 X/ q4 O我们来详细的讲解一下PHP中的命名空间:
6 e$ h/ |. q: `$ h* ~; n% o* c! I, }6 {1 n, q  r. E/ L
语法:namespac_e 空间名\空间名;
; ~% E7 I5 P8 K7 v8 t
, Q7 x1 X8 {) Z" _说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:1 e# ~/ d8 Q% }( z

, W  B2 |5 Q; x) m) z& H----------------------------------------------------------------------------
, C  G. k7 Y1 R# l% G+ A( O
4 v8 e( r2 {) [6 m' e<php
# Y0 j' u; K: X+ E/ ?* Y9 f
% ]; \, ]8 {8 n4 r1 P. l, J, K; U" jnamespoc_e AA;* k& `/ t% n' q
functio_n showInfo(){
: G! ~& O8 a3 F! }& F    echo __METHOD__,'<br/>';' I7 {& f0 f% ^* T9 _
}$ H) E; E! G4 g" v$ x1 Q! ?5 q: s' C
showinfo();
1 ]3 u3 Q  z; M$ n% f0 G" H7 Q# c5 w8 u, k( X: R
namespoc_e AA\BB;
. V8 \/ N1 A# E2 `  a# m5 T+ B. v/ e5 \. C0 U& e7 E- F
functio_n showInfo(){: q7 C# i4 e. h# c6 V
    echo __METHOD__,'<br/>';; y* L) `5 U: s% T' K+ n1 g4 T
}8 P) w" G1 N2 g! {) r0 K5 ^
//showInfo();
/ U4 G# _1 r* {" f0 k----------------------------------------------------------------------------9 v5 e+ _. s2 N  Z& s
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)4 f8 {0 W$ l5 P, N- \; w
, P0 Y2 T; ?  O5 t& X+ C
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
6 t; P6 k# V3 }2 u' ^+ f( e1 o# R) t. {0 x
----------------------------------------------------------------------------
. |1 c0 [, g. L0 r0 k- L2 q* e' r1 `; h
<php5 I/ `: X: A: e) R9 F
namespoc_e AA\BB;# N3 y0 w; z1 P2 `7 L, b/ N! p
functio_n showInfo(){* U5 w2 a% `+ r. d. W1 j
    echo __METHOD__,'<br/>';0 x. j1 B+ e+ o. a0 ]3 }* L
}5 ~8 o* k1 v5 t
namespoc_e CC;: r: w/ v/ }  T4 ?. Q' O
functio_n showInfo(){; Q: m( a* k# a9 T9 K0 x2 N4 x
    echo __METHOD__,'<br/>';
$ l: x5 \1 R' q' Q}
1 V: t; Q, g, I0 D3 f: r2 P+ V/ onamespoc_e AA;0 ?! u1 v' F$ T  g; h
functio_n showInfo(){/ D0 H- v+ B) ^9 h9 R0 @
    echo __METHOD__,'<br/>';
, N2 I1 H) a4 x1 e4 u0 A}
: A$ v* a# S: t% k1 h//非限定访问:用于访问当前空间中的成员# o, Q! D, M% |$ Q5 [# q
showInfo();
: g5 C2 S4 r; U3 r//限定访问:只能访问当前所在的空间的子空间中的成员! ~* V/ ~. f- K  y
BB\showInfo();
; g8 ?+ U8 b- I( C+ e2 d//完全限定:可以访问其它所有的空间的成员/ m: z1 q; y. \* k: j
\CC\showInfo();- g. \" ]/ ^. e  V; {) l$ t* i
↑根空间标识符( |! D% N8 n6 @. @  B
----------------------------------------------------------------------------8 C7 W; ]1 y( J8 @; Z
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
/ n9 _+ n1 T0 a' z) F' f
( ~1 x  D* x; i: \9 i7 e当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
5 x. a* w, h: m9 w) j
% s) n& f2 h/ R1 r* M' ^代码示例如下:" g( G/ B; M2 X" K1 H
, v* }  p+ c9 _3 j# r( i' [0 A) g
----------------------------------------------------------------------------
8 m5 X  u2 E- Y: t% U
6 G8 e1 c( V) D" ^1 e  Y: K0 w+ ]; O, _& n
04inc.php1 {( [$ `# t* e8 a  V
<php
, d+ V; j2 ?. E6 @
( q9 ~4 _, m, Z$ m! y) t, ~1 Xnamespoc_e Core;5 n8 P) |% N! ~+ e: K
include '05ou.php';4 C8 q9 {, L- V4 J
new \AdminController();* g. }, Q# p+ r  \
showInfo();; r$ Z7 W+ I; o2 u
2 }1 Y5 f. O2 _8 N$ T3 o
echo P;8 G8 P& f" ]6 M% g; E9 }. R6 s
//根空间中的成员,只要类的访问必须加‘/’
4 U7 r: t7 q( g; o----------------------------------------------------------------------------
: p1 O. W6 V5 R7 Y
6 A' c6 E* a. x1 g/ X6 @8 p6 F05ou.php
( Z6 ?3 g% `9 g2 C<php
; i* F( `0 D4 O2 B1 pconst P=5;
5 \5 J3 O  q" Z8 ^
% x6 u) ~" @3 Q" ], m$ R! Xfunctio_n showinfo(){
$ s: \1 X( d' G9 i    echo __METHOD__,'<br/>';
1 m8 A9 ]: e" b, k' Y* |}
5 d* c  t: [8 F7 i* b+ ~% [/ N9 C4 A* r, p& m
clas_s AdminController{! b" z3 o8 ]5 s* Q; L6 J
    public functio_n __construct(){
) t' b: d4 W) r1 E        echo __METHOD__,'<br/>';2 Z: T3 v3 l) g$ S/ L. z
    }
; }; J! M# w- q/ m- m2 e/ N  u}3 h" q+ C$ b" K1 u5 W2 h! ~
/ m4 ^, z3 k1 i9 O: ~3 X
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。
" A+ b. Q$ {1 J- s2 A----------------------------------------------------------------------------/ q2 L* m9 ~- T+ F% j% i
04inc.php
* i+ v$ j% q; F<php4 j  }' ^5 M# s- X
- H7 w+ z: |( \/ x
namespoc_e Core;; {' y0 |  {8 h& c7 ]' g
include '05ou.php';  z1 d: V, p( x. f$ Z0 @
functio_n showinfo(){
* T* P! i! }: o, ], l8 [' V' Z    echo __METHOD__,'<br/>';
, [4 a6 ~0 W% C3 s4 }4 T4 o& N}, x# ]8 K1 U* H: Q+ ^& X2 F. ?
  e' s) X; ?) _* \# |0 g4 o. V, R  d
new \Controller\AdminController;
/ L; M) d0 M) P2 h) V% J----------------------------------------------------------------------------# i$ S+ `( T8 ?2 S
05ou.php5 h  ~" Y' p9 V" l
<php
0 D# G- x0 q+ L4 Bnamespoc_e Controller;
& `9 d' t4 r) ^/ H3 Y( W' v) }0 |& [, O# u( l' u
clas_s AdminController{" ^; G: I6 r( G! d8 d
        public functio_n __construct(){
% q6 l( L. H, |5 W                echo __METHOD__,'<br/>';
& S% X  A( Q! H6 o7 a: {    }
# J5 u- V' `9 X8 u; l0 ^; D}
9 b8 {1 g$ u; f3 c/ n4 C# C& N) V----------------------------------------------------------------------------
0 c: @3 t4 s$ R. k: X$ ~0 c5 v! s. h+ p/ S
4.引入空间成员:; K( M) g( F; \" W

/ h& E! f; b: r" |. u* i3 t4 E1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
) \4 S9 P/ w7 O( g+ D" I! R2 ]5 ^2 @. E
----------------------------------------------------------------------------
$ T6 C3 l0 X6 w' C" x0 z2 @* Z
: E% K6 K" M8 P' I3 K, B/ k04inc.php
4 `; @: q0 I' \/ u% ]" y6 Y<php7 @) M7 N6 Z$ w: L& `
namespoc_e Core;0 f) g9 Z$ I9 t4 ^; p. h
use Admin\Controller as con;
4 D9 U. m4 f& ]: q* L: S9 ~' b
include '05ou.php';3 N, y9 z+ r# K
2 E# D! J1 J! Y) ]; h
new con\AdminController();
, @! w+ U. ^1 b7 j6 _9 v2 Y6 B----------------------------------------------------------------------------
0 Y4 l3 p3 @1 H05ou.php: o" H3 h# h! }1 `3 ]+ K7 _9 W0 E
<php
! C/ D$ `3 n5 P, onamespoc_e Admin\Controller;+ U( G3 @' x& c, c+ o* j
* D& Y3 N: q" w3 P& u5 \
clas_s AdminController{6 d5 [- e' P/ x" D( T
    public functio_n __construct(){( n" Z3 ^; d; c9 J0 J9 O' G/ q
        echo __METHOD__,'<br/>';8 r3 o8 W8 A$ D( a( M: v
    }  l$ A4 Y3 P1 P' i1 G% K; m3 n
}
8 O; G! u( }1 t. D5 s& c6 W9 m# b----------------------------------------------------------------------------
/ L- Q: j/ L# n" V2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
! [5 Y/ t' L, h- X1 Q" _1 m! K; r+ V0 N
----------------------------------------------------------------------------
( K9 k5 }% r+ ]' `
7 o4 K, b1 C0 G  y! t04inc.php  _5 u* S  ]. l# p
<php
# I% j8 S4 T; @! K5 n8 X( w//引入空间成员类9 r6 P( q. h  E. f; N

3 p- r! E" m8 l/ w" l3 R3 O0 tnamespoc_e Core;# z# n9 V4 R7 ~9 _& S, P) M. Y
use Admin\Controller\AdminController;
5 q( p; E. V" h2 Iinclude '05ou.php';
7 s: z9 y0 m3 @- x3 y
* Y# `: C# }4 o+ Nnew AdminController();
! U. I$ p- S$ {" S+ p# Z5 \7 Q3 K- H----------------------------------------------------------------------------' x) f/ {, n( S! X, T
05ou.php7 [/ z8 D- \  e4 s8 U
<php& h* {! m2 F& G- R
namespoc_e Admin\Controller;
; o, L9 a, J8 A% v6 [7 U9 F8 x$ d% D) x1 Y
clas_s AdminController{  ?$ L: ~# r6 `* n3 m  T0 @
    public functio_n __construct(){; O' s2 B- c2 @
        echo __METHOD__,'<br/>';9 [0 t4 F7 W; V$ v# i' ^
    }
* K# n/ a7 J+ D}* P6 e: H9 i# [3 j0 Z5 G+ O1 ]7 ^, q
----------------------------------------------------------------------------7 J* @2 R0 c% x) o" p+ N# r3 S
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。
4 h6 a) h& z  W* C9 g0 y! n% \6 {! f6 ^; Z7 }# e
; X/ p9 D* P, w
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。$ X) J' a, C$ C
# ?: v, Z, [6 Y7 Q8 d$ l
4 ]7 P1 G; S( m: z( Y

: ]8 N# i) ]6 R+ z! M1 d0 x+ L. T. o6 e& j( y% x
. C# H; o- V3 j5 j8 G7 _- \  G

3 U7 x1 a3 X  Q' w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:32 , Processed in 0.059804 second(s), 22 queries .

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