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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-1 23:13:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.命名空间的作用:
, _/ i+ ]+ E% e& P3 F5 ]
9 t" a  \- _( b: |在PHP中函数、类、常量是不允许同名的。为了解决这三者的同名问题,所以出现了命名空间. 其实不仅仅是php,其他语言也有类似的使用。比如JavaScript中:
: V- R# F. N: H" L% b0 @9 p, M5 x& L5 d" J4 F( c6 a6 |

: y2 F1 O, }0 `1 k
8 H) z, I9 n1 T; \  }我们来详细的讲解一下PHP中的命名空间:6 j# j1 I" s# Q& X0 [; q/ R2 O

+ u( i6 b5 m5 r! e. ?( G语法:namespac_e 空间名\空间名;: [; P. ~* D4 N2 C/ u5 G

$ U5 }( ]  M$ Y' S# B. c& G说明: 用于定义空间名;如果一个php文件中,第一个空间的定义义必须放在第1行。如果所要定义的空间已存在,则是进入空间。代码示例如下:) T/ W' j; v: }/ F: N

& S2 y" p8 d- e# ^----------------------------------------------------------------------------
" j( x  x( m6 O' R9 A' U5 i4 a6 n4 W- J6 Y- R' ^
<php
8 {) `$ v/ p! @) d; O4 i% i' t
) o$ r* _4 I+ f5 J8 W( |* v) a; _2 ^namespoc_e AA;" r) j4 [; E* Y5 C
functio_n showInfo(){2 Z+ {% t. |# j: j2 Q% G; h# h1 k
    echo __METHOD__,'<br/>';
; _# J1 p4 \  `+ Z$ }0 T. Z}* ^; L6 [. v& \) f
showinfo();5 ~6 Q' U2 [) c' X" ^
$ {  G9 Z& z5 `0 ]" ]9 }* B  E
namespoc_e AA\BB;: X7 J0 C6 w4 i% G/ b1 _
& \, V0 A: U/ o/ x0 @9 h: F
functio_n showInfo(){
! g: j% ^( }! m' ?    echo __METHOD__,'<br/>';
- u. j/ a; B5 _* Z1 P: W' {3 a}' j9 T: ]6 n6 d+ h1 A) s1 D0 R
//showInfo();
, J( u  b/ l# p----------------------------------------------------------------------------
4 E- X2 Z; a! l) w, @2.空间成员:所谓空间成员就是,空间所影响的,空间只影响类、函数、常量(const)
4 a) }( f) _1 Y7 w3 M! d2 _; S+ f- s
3.空间成员的访问:访问方式分为限定,非限定,完全访问,之间的区别,我们使用代码来说明一下。
, w# C% O6 a- v/ P( R7 O/ a3 y* R8 [% x9 {% M% @0 I
----------------------------------------------------------------------------; I1 D6 q* a* f' T1 l# T

: a3 c& [4 U+ S- _$ i$ k<php
7 R5 H- M& F/ s, Tnamespoc_e AA\BB;
; a; r, s: z& a" ?. f0 j$ ffunctio_n showInfo(){" ]% O) g7 Q8 s$ N( j2 A: A
    echo __METHOD__,'<br/>';) g' h2 y$ [# k9 [/ ~( D' p
}
1 `- `( Z* \. s$ a* \namespoc_e CC;
& B. U1 D& l* V" I. C$ F# d! V+ Nfunctio_n showInfo(){
' Q; _5 }& b0 N; A9 b    echo __METHOD__,'<br/>';
" T+ }6 ~8 a& A- e7 X}+ n7 p/ `( _7 Y: U
namespoc_e AA;7 E( @* M% u" z0 ?% D9 C
functio_n showInfo(){  B3 G  L: J. b& v+ R
    echo __METHOD__,'<br/>';! n& M- X8 n, l
}3 E% }+ v4 d5 j: ]' M3 t% Q
//非限定访问:用于访问当前空间中的成员
+ t8 i( b$ r+ M/ V& cshowInfo();
1 \8 Q8 m  v/ U% D4 q//限定访问:只能访问当前所在的空间的子空间中的成员
( r* m% j. i; g8 QBB\showInfo();
3 j8 f! R% t6 ~+ X  G9 I//完全限定:可以访问其它所有的空间的成员' D5 W6 [1 s/ k) W& H& f% b* N
\CC\showInfo();
' ^2 y0 j( F$ F; N1 ]8 _↑根空间标识符& v2 A  P0 e# W
----------------------------------------------------------------------------: J* H) n: u: x8 E
但是在实际的使用中,我们很多类和方法都是在不同的文件中,这就涉及到引入的问题,也就是在实际开发中,我们经常会在一个文件中引入另一个php文件。这种情况下有两种情况:: R$ g6 v* ^1 T! Q/ U
+ _( K* R/ Q( M7 |
当前文件有空间的定义,被引入的文件中没有空间的定义,但是有空间成员。被引入的空间成员会被放在公共空间(根空间)
& k3 R) j$ n: Q3 @" ]* F0 K# H8 ^4 P/ y+ {
代码示例如下:
5 G- w, y0 K5 d; A, L+ u4 ^- W
# c+ v& u* b$ h' ~' q8 }----------------------------------------------------------------------------3 L. ^4 z% Q' g8 f, `

2 \9 q7 S2 F* E  A6 c7 |) I7 F( D* C
04inc.php
/ p# a8 M0 a: _- ]; }<php
! U9 y% n3 M! a) A" p7 G+ a
0 r6 I3 \9 ~9 k/ Z2 l0 D! Enamespoc_e Core;
1 J* f3 a3 W: `& |: ainclude '05ou.php';
, [! n4 E& x) Y$ q7 F. Inew \AdminController();
$ }& t; D2 Q/ U; Y% I0 oshowInfo();8 R3 i' {: O, N8 w% @& J

6 a% r$ A1 _* Qecho P;: ?) o& s/ ]7 M) W# M7 l0 f6 |
//根空间中的成员,只要类的访问必须加‘/’
7 O- N& g  W% G' |$ a( f5 N----------------------------------------------------------------------------$ w4 l1 A% O- ^  f( C* b# v9 l
% q/ w' L2 K/ C) \! d
05ou.php
$ w  o& s+ _2 Z! \<php2 M# ]4 S/ i- X
const P=5;
0 A. U4 s' e& C5 N- o
9 p: @& g: L/ X' I) rfunctio_n showinfo(){7 l; ]$ j. l5 g' O9 |) Z" F" r8 b- M7 g
    echo __METHOD__,'<br/>';( y/ _3 s8 M4 F1 {, c7 Y
}
9 N4 m3 Z' ]5 y7 W% k! N' T3 Q
8 v; f- `/ B$ m  Yclas_s AdminController{
- M+ K- r6 V! q3 W# J; o( Z, [    public functio_n __construct(){) U9 k& }2 t7 R# b* @; f
        echo __METHOD__,'<br/>';9 Z" _1 B+ n& j9 s: o5 k4 v6 ~
    }! M) _1 p3 P# K' W4 V0 S6 o6 _. y
}; o( v$ ~% _5 c' K
. w* A2 d8 ^* d- |
第二种情况:当前文件有空间的定义,被引入的文件中有空间的定义,并不会中断当前空间的定义。! d: ?, x, D8 E) _: t9 X% J
----------------------------------------------------------------------------
' N9 |) W- G7 `; e" F04inc.php
! h; z' v* H; N' x/ T0 T# i, |, Z# |, e<php$ c  ?+ x* q+ o9 R) G' c

; G) h' y2 T' f: l% ]namespoc_e Core;- [( x7 ?' Q9 A1 c. ~
include '05ou.php';) q/ J  n* k( l3 Z
functio_n showinfo(){. x9 z2 L2 Z: r6 m6 N
    echo __METHOD__,'<br/>';* C' \0 h; ~6 t. Y2 x* A' [
}
3 }% E! t% h4 n
! Q5 [* C3 h+ k$ znew \Controller\AdminController;
# s  _5 m4 y, b----------------------------------------------------------------------------
+ s5 b$ |1 A. m. H' O& `05ou.php
5 m3 t2 S9 ^- P# H<php
- x. _' y: R) L1 Knamespoc_e Controller;
  P% R1 Y% y2 {- A3 j$ X' q. @$ q( V* S* I1 x
clas_s AdminController{0 g5 b$ _6 m. D: i! z& D
        public functio_n __construct(){
, U+ I6 Y& _4 g8 ~) O                echo __METHOD__,'<br/>';) |) B0 j& Y# o. W6 e
    }
5 L" G7 Z, j) g. [6 }: \}  o2 [: I4 D4 _" z2 b8 ^! I
----------------------------------------------------------------------------) ^' n* l# G$ n8 v+ p
; E; N  w" w! C5 d' T! h% T" q# `; o+ m
4.引入空间成员:% r/ |' ]8 ~' j2 N5 k$ d5 J- j
  r* o5 M2 T# W! [
1.use 空间名\空间名 【as 别名】:将指定空间引入到当前空间。同可以使用as关键字为被引入的空间起个别名。
6 Y2 `3 v$ n7 k0 n% ]0 L- O" b4 ?+ Y& b* a0 V
----------------------------------------------------------------------------. @! R% b) V# D; H/ t+ q3 {
/ Z! S) X- @" j! L! I9 M+ A
04inc.php
$ I2 d8 y! x5 D& c8 `" {<php
1 }& {/ n% q) q. R5 b, \1 Enamespoc_e Core;
+ i7 K( ?6 `3 ^- k4 cuse Admin\Controller as con;
$ B/ P' J$ Z  N* l
# W+ H. D& J6 _include '05ou.php';
" m" G% a$ K0 Z7 a# K2 ~2 E
" t, n( T% j  `9 |7 Nnew con\AdminController();
: t- c/ c5 S2 C( e0 _7 P----------------------------------------------------------------------------
2 k) m9 [# U$ y: C3 B1 Q; i05ou.php1 r( a+ e; o, N( [# }; A
<php
2 X% t. T' F8 S. mnamespoc_e Admin\Controller;
5 j% V% e( z6 K% M; ]) B: ?
; |: E5 D! R( A: u  e8 Gclas_s AdminController{% k$ D9 m0 g" L9 o7 W- ?
    public functio_n __construct(){
: ?4 W8 T! Z; z: C; q        echo __METHOD__,'<br/>';2 p. ]$ m/ r( o, m* D! \* I' @) }
    }
# d# t) V: Y& k( y% `}% x! [2 {' w& T
----------------------------------------------------------------------------2 w+ n1 V: a6 B4 ]/ x
2.use 空间名\空间名\成员类 【as 别名】:将指定的空间中的成员引入到当前空间,引入空间成员只能引入类。
& i+ {: l/ m. t! K! Y; d, c( T0 U( `; S6 Y7 i1 Q
----------------------------------------------------------------------------
/ ~  y( z' J. q5 @. }+ I- C7 a/ l) E) y1 m8 F
04inc.php
8 O: K$ M! [1 v$ a% _( }<php: v( R7 {. Q6 A5 A/ j* y+ o6 v2 I
//引入空间成员类) `) ^+ {0 ~, v7 w

# i9 X" Y# a5 g. S+ B0 _namespoc_e Core;
3 t/ r6 r% L- r4 R0 u+ V8 huse Admin\Controller\AdminController;1 F' \2 u5 H( K% Q
include '05ou.php';) b) J; D0 Z4 x' F7 }, C. {
7 n( [9 a, m) x
new AdminController();
1 O' `7 N/ {- F' ]. Q----------------------------------------------------------------------------7 E7 M1 ^' e+ J  r
05ou.php! L3 J3 X+ R- i: s
<php
: x3 g3 l( R6 K& p, s& z5 ^2 h* xnamespoc_e Admin\Controller;5 |& d. D2 X" }/ v- p# w; w

$ _2 y  j; x; P. w+ b( t' l/ y( W7 O1 Iclas_s AdminController{
  R! Z9 ?; T. o+ ~' j+ {    public functio_n __construct(){
( ]& V0 k& ~' [6 Q        echo __METHOD__,'<br/>';# m9 N( n+ T4 x' x
    }
$ T: p( D$ \$ k9 e! k4 J$ i/ E4 ~}
. @5 y: h0 {  g1 K+ n----------------------------------------------------------------------------2 _) a# ]2 f  i4 [! |$ U
5.空间命名的方式:空间名我们可以任意的定义,但是如果命名更有意义呢。一般我们会以类文件所在的文件夹为空间名。其实主要的就是方便按照某种约定成俗的规则加载文件。1 G$ a1 U2 n; Y/ H; [: J

4 s9 n; u$ @! Z# A. {2 c! K2 y  L; H
这里我们只是简单的介绍了一下命名空间的作用和使用。其实很多框架内部也是这样的使用。不同的类在不同的空间,相互之间的引用也是遵循着相应引入规则。0 r) l" w# B7 y$ G; t3 ~
% f! f: W8 L; z5 v3 ]

1 Q8 w  Y  P) J1 b* E- D, b. F6 J3 q& x$ R# A

* D  U6 K9 `' ~# @; u. a+ \. z  T( G) L: u: X
/ L6 d% O; _, ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:34 , Processed in 0.057656 second(s), 23 queries .

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