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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
1.命名空间的作用:8 V/ I& [* F2 C5 m4 G
4 z* K' g: J! B" D7 L
在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:$ G/ Q% X+ e/ T  C

) S8 `: U2 }3 o0 M& E 7 J9 U. Y, |* l8 b! l

9 H4 V5 C" Y" u, n我们来详细的讲解一下PHP中的命名空间:) t1 \- \4 l- K" g2 x
" o, w) e4 R/ B6 b* n' n
语法:namespac_e 空间名\空间名;; b6 e$ z" U' L* Q3 w) [* A

- q" Z. [% H$ k$ J4 D说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:
, j2 |$ S1 d6 X8 l0 S3 m4 u! E* w: Y2 x
----------------------------------------------------------------------------( k8 n4 l5 m' K+ t4 ?, h

6 a% ]- j3 I) k. q1 L3 t; i, e( k<php
  t. e5 U4 I' z. v8 C# d: k4 H; C
0 f" g1 T( x( o  pnamespoc_e AA;
' l: P/ B# c/ G. ?functio_n showInfo(){
# X9 b' n& O' g    echo __METHOD__,'<br/>';
) p' H6 H. O! Z}
' d2 [7 M* @* J/ u+ \- T3 yshowinfo();$ J8 R7 W2 C3 o2 c7 c0 W* N
# u4 r/ O# d" a9 P. x* m+ v; O$ X& V5 q
namespoc_e AA\BB;
, ^$ K2 W% G9 V4 x- Y6 i# u
  `3 \$ D$ F6 z. N- jfunctio_n showInfo(){
0 z* e4 f" M" }7 z8 |5 ^6 ]+ q    echo __METHOD__,'<br/>';
5 f% K8 R1 ]5 W( U3 ]# d}6 {  M% p" A5 e" b
//showInfo();
( H8 U2 G1 T$ K" d2 ?( d----------------------------------------------------------------------------4 O: A/ y, l& X% @
2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
+ a. t) W% O$ h
3 W% X; B0 t! Y" l; \3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
* ^; C$ Q$ i; b% s! b
! k1 h4 S% I6 C* e8 g# T& t----------------------------------------------------------------------------- R" {1 j# j& x

# `1 y7 T7 T( D( H<php( u3 ?# S* A5 g( `
namespoc_e AA\BB;" d) \. _: L5 G( X9 p7 |
functio_n showInfo(){+ S$ I, B$ H, ~+ o1 C' b% F
    echo __METHOD__,'<br/>';
( F( w) d: \1 h# v" j3 A. {}! x3 V+ U9 F9 F8 f* ^. I- {
namespoc_e CC;
, [9 w. \, X5 kfunctio_n showInfo(){
) z" K0 E( C) i. {    echo __METHOD__,'<br/>';
* O% b/ K9 g, ^8 E2 q  `}
* |3 B% m! f* u% P3 D+ d6 bnamespoc_e AA;
) ?$ E; O, R# m0 _* Mfunctio_n showInfo(){; H7 ^2 L, Q: Q- y7 `8 L
    echo __METHOD__,'<br/>';, e  ?5 d7 S  U3 z) {2 Z
}
& t0 ], o! z3 q6 j: d$ I3 n//非限定访问:用于访问当前空间中的成员0 a! p$ g# z5 I  t" |! ^
showInfo();
% V' K  v. e5 u0 P2 S9 O//限定访问:只能访问当前所在的空间的子空间中的成员
! x" N1 P! }$ _, A; T/ Q: RBB\showInfo();
, C% g) E! V# g' J' P2 q2 A2 s//完全限定:可以访问其它所有的空间的成员1 Z1 K$ Q& W. W% y6 z: \
\CC\showInfo();4 q, Q6 V5 _- j% i' E
↑根空间标识符$ W2 t7 ~$ j& o! b+ z* X
----------------------------------------------------------------------------
" @& X( D( c+ P但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:
0 k# A2 [2 k/ J5 T
+ ]: R+ i  i, G3 r& r/ A当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)+ q; X8 t& |2 W* ~5 G* W

- Y, Y7 t/ k' K7 z代码示例如下:$ P; y4 }- V  k2 _8 s- Y

5 k) `+ |  x+ g: d----------------------------------------------------------------------------
1 ~" ~- A+ O0 B: U# z9 f/ v' p
3 }" H7 M2 q, c9 i" u0 N. M5 f
2 _" o* G- v3 E$ N2 O2 l04inc.php: r4 {- b( H; ?9 o( l- C
<php; Y  ~0 t8 k1 q! `* s
7 {! ~9 N0 E& r$ u4 L# }) z
namespoc_e Core;, N  j) v4 }+ G
include '05ou.php';
% O# c+ d! I5 Q- znew \AdminController();
1 J' q5 \6 c! J7 I5 L+ j" LshowInfo();  Q" k3 b. M# C; q

! g1 S) R3 W0 `6 I$ ^9 O# L# V) h! d6 v7 Iecho P;. u3 ?7 ?( s0 N& r4 j1 S: a3 s
//根空间中的成员,只要类的访问必须加‘/’0 Z# m9 b+ `: d/ ^3 E+ x
----------------------------------------------------------------------------
9 i3 ]) X8 O0 ]$ t( x- G1 Q4 U, V% o$ F' I2 ~4 ?. U
05ou.php7 t  X4 \/ U: I6 d  [) y
<php
9 j2 X2 ?, a) Mconst P=5;. x6 m- T0 ~$ X# d) a8 {' m- I
8 R3 J" H, }0 w9 w+ @  A
functio_n showinfo(){! Z: ?* v  n9 g* A1 q+ B. I4 k
    echo __METHOD__,'<br/>';
3 C  T7 P8 \6 m' c- l0 Z}) |3 u5 b0 {7 Z- b' P

  j* e9 k, f3 a* O: _0 ]# gclas_s AdminController{6 Q7 ~0 N9 @" `( V; E+ f* H, [
    public functio_n __construct(){+ U9 B8 g5 r; }" V) q) [
        echo __METHOD__,'<br/>';4 Y4 p1 P8 h& v$ H+ x, l
    }7 T7 _0 l2 W/ j/ R0 {0 w6 }2 Q+ j" ]
}4 I, Z4 _* _% Q! D2 t9 H$ }3 P

7 o1 c% t; D4 X$ A$ r第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! \6 a6 H+ q5 q
----------------------------------------------------------------------------
' _/ J( B8 m: W; _% D04inc.php& }1 d9 i# X: p1 C
<php( k6 n% G7 [* [' r

3 t! H) f' X, B( x4 `" [0 I% T8 ?namespoc_e Core;' S% u! i; @6 X3 R; M7 H4 f
include '05ou.php';; c  q" t1 s( }' }
functio_n showinfo(){9 f9 d# t* ]% `9 [
    echo __METHOD__,'<br/>';
8 Y2 p+ B, ], c9 v* c( l! c0 i0 c}
" g# @$ V4 k+ P+ M1 @2 S0 s0 K; T# E7 n1 L
new \Controller\AdminController;% D8 F# L5 Z( I( u
----------------------------------------------------------------------------
$ B1 P, L0 T7 K# f  X' C. |& ?05ou.php# \; U* s7 C' ?6 q1 Y5 x
<php
+ p( G+ _. T! N, I  f3 b) Bnamespoc_e Controller;
# P( C* S$ o4 C0 g( w6 T* D! C) ^; Y* v* G
clas_s AdminController{. G: X! U9 b! |0 I) e9 n: H/ l. \5 e
        public functio_n __construct(){
1 s  f; u( E9 L" R/ X! Z                echo __METHOD__,'<br/>';$ [  }4 t- O( h. D
    }2 m& G+ L8 v$ \4 Z% r' M
}$ X4 w# J. t$ x
----------------------------------------------------------------------------% P7 n2 d3 |/ a- W: M

4 \2 }) K5 h7 x+ _" V, M4.引入空间成员:  h0 o' N! J$ I5 J
5 u: B# |- c( ~% b
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
/ a. x- k2 z& m7 l5 r' x
( B1 T( n2 S# K0 X----------------------------------------------------------------------------
) m4 x9 `5 P' K7 v( E) L/ z9 _" W# P- X  H* Q3 I$ H
04inc.php7 b  K/ O! s0 r# ?
<php; R, n" q8 t$ f5 d' b8 o) ^
namespoc_e Core;
5 S$ d0 T) k' t% A& r6 w- _( Zuse Admin\Controller as con;3 G- X+ t9 U7 |, b3 l

& o- G% N3 x, q; G% A2 I! r7 uinclude '05ou.php';
' W& ?4 ~! ~* V, a' \
$ F& w5 I* H7 v; o! k8 Anew con\AdminController();
3 i6 u8 a" z" T+ _----------------------------------------------------------------------------7 f! J  P9 ^' q( @. u
05ou.php
) K6 m, l& J2 r9 e<php
4 N% m( u/ o3 ]0 `namespoc_e Admin\Controller;
, o( m7 ~  c- C! H. ?: [8 r! t4 h- q/ ]" R2 A
clas_s AdminController{
, t8 I/ p/ [% ]8 k# T  p. g& T    public functio_n __construct(){4 _$ s& j+ P$ S2 X" r* A# r/ k
        echo __METHOD__,'<br/>';+ H& [, Y, n7 s" b
    }
. S; G- E, F) G$ v" N. z}7 F4 ^; D' f) g0 l1 k/ W! I
----------------------------------------------------------------------------8 D0 M) n1 @4 r8 p$ L" @5 N
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。+ h, ]7 x0 n$ B" B" r1 y1 I/ b

  j7 H5 b8 {& W6 y----------------------------------------------------------------------------5 [$ f, D- u# f. Y0 F

5 G0 E& g, P: J% w; _04inc.php
( m) t+ w1 W/ Q  A( y<php
; G0 W) Y) F; y7 R//引入空间成员类
5 X. B8 c$ u  Z* J; I. n; e( J/ c+ T
namespoc_e Core;
, I" P, X0 z* Wuse Admin\Controller\AdminController;/ b6 ?) q5 e: t1 J. r  k
include '05ou.php';
' y% u& w" Y( \  p9 I2 Z) z1 s; x% z' Q+ b
new AdminController();
" |3 Z/ c9 s- v% I: l( g+ _( t----------------------------------------------------------------------------& Y( Z, L2 G: h& p
05ou.php* m- H. F6 C# Q& P
<php
' w- a1 e4 q/ \& S, O* Znamespoc_e Admin\Controller;
9 O7 j2 r1 K+ c7 e
% R% v  R  ^% u, Y  [clas_s AdminController{; ~7 Q) ?: N! W' B6 V: l+ T6 M% f5 g
    public functio_n __construct(){  ?/ w0 A9 e! [$ U* x
        echo __METHOD__,'<br/>';; T2 Q: V2 J. b0 F
    }
$ @0 h* _6 p% U( p}( X& A% h5 p8 W1 |$ {% U& y
----------------------------------------------------------------------------3 I+ o5 u! o# P  Y/ u
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。+ i8 n7 A  u5 g$ ^" W

3 X7 P1 e' b' C% P0 J3 Y$ S5 C- I1 H. X0 w5 N
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。5 q' q3 t) X& t' D% i/ y

% e4 i& k4 v- B4 Y
9 }& t1 x" P" T$ n. x# u- L, s4 S1 d

8 m4 Q, h# h8 l" a* ^, V) M+ D, A) Y) \+ W+ Y* R2 p

$ O2 p+ e; ]+ b& ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:57 , Processed in 0.135309 second(s), 23 queries .

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